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