Sqoop是個命令行工具,用來在Hadoop和rdbms之間傳輸數據。以Hadoop的角度看待數據流向,從rdbms往Hadoop是導入用sqoop import命令,反之從hadoop往rdbms下發數據用sqoop export命令以oracle hive為例子,命令舉例:sqoop impor... ...
Sqoop是個命令行工具,用來在Hadoop和rdbms之間傳輸數據。
以Hadoop的角度看待數據流向,從rdbms往Hadoop是導入用sqoop import命令,反之從hadoop往rdbms下發數據用sqoop export命令
以oracle hive為例子,命令舉例:
sqoop import -D oraoop.jdbc.url.verbatim=true --hive-import --hive-overwrite --connect jdbc:oracle:thin:@192.168.1.10:1521:orcl --username usernamexx --password passwdxx --table WH_PRG.TB_JSQ_PRD_GRID_MDF -hive-database test --hive-table hivename --fetch-size 5000 --hive-drop-import-delims --null-string '\\N' --null-non-string '\\N' -m 1
sqoop export -D oraoop.jdbc.url.verbatim=true --connect "jdbc:oracle:thin:@192.168.1.10:1521:orcl" --username usernamexx --password passwdxx --table ORACLETABLE --export-dir /user/hive/warehouse/test.db/tablename/* --input-fields-terminated-by '\001' --input-lines-terminated-by '\n' --input-null-string '\\N' --input-null-non-string '\\N' -m 1
註意:
oracle表名大寫,hive表名保持和創建表時候的大小寫,建表是大寫,這兒就大寫,建表時候小寫,這兒就小寫
-m 1表示並行度,根據oracle庫的性能自行決定
導入的時候是預設覆蓋,如果hive中有同名錶,會自動刪除重建
導出的時候是追加,要先在oracle測建好空表,而且再次導入時候要把原來的內容清空,否則因為是追加數據會產生重覆數據,欄位順序要對齊,否則可能產生列的錯位
附1:Sqoop導入常規參數意思
參數 參數名稱
others 插件命令附加參數
target-dir 導入HDFS的目標路徑
delete-target-dir 如果指定目錄存在,則先刪除掉
fetch-size 從資料庫中批量讀取記錄數
split-by 按照指定列去分割數據
columns 從表中導出指定的一組列的數據
null-string 字元串類型null時轉義為
null-non-string 非字元串類型null時轉義為
query 查詢語句
where 查詢條件
direct 使用直接導出模式(優化速度)
warehouse-dir HDFS存放表的根路徑
append 將數據追加到HDFS上一個已存在的數據集上
as-avrodatafile 將數據導入到Avro
as-sequencefile 將數據導入到SequenceFile
as-textfile 將數據導入到普通文本文件(預設)
boundary-query 邊界查詢,用於創建分片(InputSplit)
direct-split-size 分割輸入stream的位元組大小(在直接導入模式下)
inline-lob-limit 設置內聯的LOB對象的大小
compress 啟用壓縮
compression-codec 指定Hadoop的codec方式(預設gzip)
incremental mode模式
last-value 指定自從上次導入後列的最大值
connect 指定JDBC連接字元串
connection-manager 指定要使用的連接管理器類
driver 指定要使用的JDBC驅動類
username 設置認證用戶名
password 設置認證密碼
verbose 列印詳細的運行信息
connection-param-file 可選,指定存儲資料庫連接參數的屬性文件
hadoop-home hadoop-home的路徑
enclosed-by 欄位值前後加上指定的字元
escaped-by 雙引號作轉義處理
fields-terminated-by 欄位分隔符
lines-terminated-by 行分隔符
optionally-enclosed-by 強制給欄位值前後都加上指定符號
mysql-delimiters Mysql預設的分隔符
input-enclosed-by 對欄位值前後指定的字元進行解析
input-escaped-by 對含有轉義雙引號的欄位值作轉義處理
input-escaped-by 導入使用的欄位分隔符
input-lines-terminated-by 導入使用的行分隔符
input-optionally-enclosed-by 導入時強制給欄位值前後都加上指定符號
bindir 生成的java文件、class文件及打包為JAR的JAR包文件輸出路徑
class-name 生成的Java文件指定的名稱
jar-file 合併時引入的jar包
outdir 生成的java文件存放路徑
package-name 包名
map-column-java 映射的數據類型
table 關係資料庫表名
num-mappers 啟動map的數量,預設是4個
附2:Sqoop的import工具抽數的幾種情況
1. Hive表無分區,全量從Oracle中抽取數據到Hive的表中
sqoop import -D mapred.job.queue.name=root.myqueue \
–connect jdbc:oracle:thin:@192.168.1.128:1521:mydatabase \
–username jsz \
–password 123456 \
–table mys.test \
–columns ID,NAME,AGE,SALARY,DATA_DATE \
-m 1 \
–hive-table default.test \
–create-hive-table \
–hive-drop-import-delims \
–verbose \
–fetch-size 5000 \
–target-dir /apps/testdata/default/test \
–delete-target-dir \
–hive-overwrite \
–null-string ‘\\N’ \
–null-non-string ‘\\N’ \
–hive-import;
2. Hive表有分區,增量從Oracle中抽取數據到Hive表中:
sqoop import -D mapred.job.queue.name=root.myqueue \
–connect jdbc:oracle:thin:@192.168.1.128:1521:mydatabase \
–username jsz \
–password 123456 \
–table mys.test \
–columns ID,NAME,AGE,SALARY,LCD \
-m 1 \
–hive-partition-key op_day \
–hive-partition-value 20160525 \
–where “lcd >= trunc(TO_DATE(‘20160525′,’YYYY-MM-DD’),’dd’) and lcd < trunc(TO_DATE(‘20160526′,’YYYY-MM-DD’),’dd’)” \
–hive-table default.test_partition \
–create-hive-table \
–hive-drop-import-delims \
–verbose \
–fetch-size 5000 \
–target-dir /apps/testdata/default/test_partition \
–delete-target-dir \
–hive-overwrite \
–null-string ‘\\N’ \
–null-non-string ‘\\N’ \
–hive-import;
3.使用select語句:
sqoop import \
-D mapred.job.queue.name=root.myqueue \
-D oracle.sessionTimeZone=America/Los_Angeles \
–connect jdbc:oracle:thin:@192.168.1.128:1521:mydatabase \
–username jsz \
–password 123456 \
–query “select ID,NAME,AGE,SALARY,DATA_DATE from mys.test WHERE ID = ‘10086’ and \$CONDITIONS” \
–verbose \
–fetch-size 5000 \
–hive-table default.test \
–target-dir /apps/testdata/default/test \
–delete-target-dir \
–fields-terminated-by ‘\001’ \
–lines-terminated-by ‘\n’ \
-m 1 \
–hive-import \
–hive-overwrite \
–null-string ‘\\N’ \
–null-non-string ‘\\N’ \
–hive-drop-import-delims
Sqoop的export工具導數的情況:
將Hive的數據導入Oracle,整個過程分為三步:
1) 刪除Oracle表的歷史數據
sqoop eval -D mapred.job.queue.name=root.myqueue \
–connect jdbc:oracle:thin:@192.168.1.128:1521:mydatabase \
–username jsz \
–password 123456 \
–verbose \
–e “delete from mys.test”
2) Hive導出到HDFS指定路徑
hive -e “use default;set mapred.job.queue.name=root.myqueue;set hive.insert.into.multilevel.dirs=true;insert overwrite directory ‘/apps/testdata/default/test’ select id,name,age,salary,data_date from default.test;”
3) 將HDFS的數據導入到Oracle中
sqoop export \
-D mapred.job.queue.name=root.myqueue \
-D mapred.task.timeout=0 \
–connect jdbc:oracle:thin:@192.168.1.128:1521:mydatabase \
–username jsz \
–password 123456 \
–table mys.test \
–columns ID,NAME,AGE,SALARY,DATA_DATE \
–export-dir /apps/testdata/default/test \
–verbose \
–input-null-string ‘\\N’ \
–input-null-non-string ‘\\N’ \
–input-fields-terminated-by ‘\001’ \
–input-lines-terminated-by ‘\n’ \
-m 1