1. 程式人生 > 其它 >sqoop2將Oracle資料匯入HDFS

sqoop2將Oracle資料匯入HDFS

sqoop是apache旗下一款“Hadoop和關係資料庫伺服器之間傳送資料”的工具。

匯入資料: MySQL,Oracle匯入資料到Hadoop的HDFS、HIVE、HBASE等資料儲存系統;
匯出資料: 從Hadoop的檔案系統中匯出資料到關係資料庫。

Cloudera Manager 支援的版本為 Sqoop 2。

一、新增sqoop2到CDH

因為我使用的的CDH搭建hadoop叢集,所以可以通過cloudera manager新增上sqoop2.

二、把Oracle驅動拷貝到Sqoop安裝路徑中的lib資料夾下

我的ORACLE 是10G ,找到ojdbc6.jar,放到sqoop 的lib 下面,目錄是

/opt/cloudera/parcels/CDH-5.10.0-1.cdh5.10.0.p0.41/lib/sqoop/lib

/opt/cm-5.10.0/share/cmf/lib/ojdbc6.jar

/var/lib/sqoop2/ojdbc6.jar

三、oracle全量資料匯入到hdfs
1、root 使用者執行:

 sudo -u hdfs hadoop fs -mkdir   /data/zhao/
  在hdfs的data下,建立一個zhao資料夾  

  2、切換到hdfs 使用者:

su hdfs  
執行  export ACCUMULO_HOME=/data

  3、執行import操作

   sqoop import --connect jdbc:oracle:thin:@192.168.183.251:1521:YJDSJ --username yjdsj --password yjdsj#123 --table T_LOADS_TODAY --target-dir /data/zhao/heng  --m 1 --columns obj_id,today_load,dept_id    

  說明:
匯入的目錄若已經存在則要先刪除已經存在的目錄,否則會報路徑以存在的錯誤提示:

FileAlreadyExistsException: Output directoryhdfs://master:8020/user/operate already exists

所以 /data/zhao/heng 這個目錄是不存在的

hdfs 使用者執行該命令刪除目錄 : hadoop fs -rm -r /data/zhao/heng

4、檢視

當出現這個頁面,表示匯入成功
訪問HDFS:http://192.168.43.36:50070/

四、定時增量匯入
資料全量匯入到hdfs後,每隔一段時間oracle又會出現新的資料,此時不可能再將所有資料重新導一遍,我們就需要增量資料匯入這一模式了。

sqoop支援兩種增量匯入模式:

1、append,即通過指定一個遞增的列
比如訂單表,每個訂單有一個唯一標識自增列ID,在關係型資料庫中以主鍵形式存在。之前已經將id在0~100之間的編號的訂單匯入到這裡為HDFS,現在一段時間後我們需要將近期產生的新的訂單資料匯入HDFS,以供後續數倉進行分析。此時我們只需要指定–incremental 引數為append,–last-value引數為100即可。表示只從id大於100後開始匯入。

2、lastmodified 即根據時間戳
此方式要求原有表中有time欄位,它能指定一個時間戳,讓Sqoop把該時間戳之後的資料匯入至HDFS。因為後續訂單可能狀態會變化,變化後time欄位時間戳也會變化,此時Sqoop依然會將相同狀態更改後的訂單匯入HDFS,當然我們可以指定merge-key引數為pid,表示將後續新的記錄與原有記錄合併。

因為我的表中,pid為隨機產生的32位數字,所以選擇使用lastmodified 。
執行匯入:

sqoop import --connect jdbc:oracle:thin:@10.68.24.80:1521:YJDSJ --username yjdsj --password yjdsj#123 --table T_POWERGRID_DAMAGE_FORECAST --target-dir /data/06/02 --m 1  --incremental lastmodified  --check-column CREATE_DATE --merge-key pid  --last-value '2018-6-12 11:00:00'

  若定時增量匯入,則需要建立一個job

service crond start   

  

sqoop job --create dashuju -- import --connect jdbc:oracle:thin:@10.68.24.80:1521:YJDSJ --username yjdsj --password yjdsj#123 --table T_POWERGRID_DAMAGE_FORECAST --target-dir /data/06/02 --m 1  --incremental lastmodified  --check-column CREATE_DATE --merge-key pid  --last-value '2018-6-12 11:00:00' 

  使用crontab定時器

crontab -e

  增加定時任務(每35分鐘執行一次)

*/35 * * * *  sqoop job --exec dashuju

  重啟crontab定時器

service crond start   

  

期間啟動了多個定時任務,曾報maxContainerCapability 設定不足
異常:

REDUCE capability required is more than the supported max container capability in the cluster. Killing the Job. reduceResourceRequest: <memory:12160, vCores:1> maxContainerCapability:<memory:8192, vCores:24>

需要調整兩個引數:

yarn.nodemanager.resource.memory-mb
yarn.scheduler.maximum-allocation-mb     

  

每次執行sqoop job時,會提示輸入密碼,如何避免呢?
====修改配置檔案====

 vi /etc/sqoop/conf/sqoop-site.xml

<property>
    <name>sqoop.metastore.client.record.password</name>
    <value>true</value>
    <description>If true, allow saved passwords in the metastore.
    </description>
</property>

  

五、hdfs匯出到oracle
export工具,是將HDFS平臺的資料,匯出到外部的結構化儲存系統中,可能會為一些應用系統提供資料支援.

全量匯出

sqoop export --connect jdbc:oracle:thin:@10.68.24.80:1521:YJDSJ --username yjdsj --password yjdsj#123 --table T_POWERGRID_DAMAGE_FORECAST --export-dir /data/06/03/part-m-00000  --input-fields-terminated-by ',' --input-null-string 'null' --input-null-non-string 'null' -m 1   

  此方式要求匯出的oracle資料庫中的表為空表或者新表,不然新的資料產生,再次匯出的時候,會違反主鍵唯一的約束,可以使用以下的命令:

sqoop export --connect jdbc:oracle:thin:@10.68.24.80:1521:YJDSJ --username yjdsj --password yjdsj#123 --table T_POWERGRID_DAMAGE_FORECAST --export-dir /data/06/03/part-m-00000  --input-fields-terminated-by ',' --input-null-string 'null' --input-null-non-string 'null' -m 1 --update-mode allowinsert --update-key PID   

  

–update-mode < mode > 指定更新策略,包括:updateonly(預設)、allowinsert;
–update-key < col-name > 更新參考的列名稱,多個列名使用逗號分;

sqoop使用手冊參考:https://www.cnblogs.com/xiaodf/p/6030102.html#431

更多java、大資料學習面試資料,請掃碼關注我的公眾號:

專注於大資料和java開發,學習交流可以關注我的公眾號:javaydsj