Sqoop數據遷移指南

Sqoop(即SQL to Hadoop)開始於2009年,是一個用來將Hadoop(hdfs/hive/hbase)和關係型數據庫(如MySQL,Oracle,SQL SERVER,Postgres等)中的數據相互轉移的工具,可以將一個關係型數據庫中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關係型數據庫中。它通過MapReduce任務來傳輸數據,並充分利用MapReduce並行特點以批處理的方式加快數據傳輸,從而提高併發特性和容錯。
官網說明:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html
Sqoop命令分四大類:

(1).sqoop import		單表導入
(2).sqoop import-all-tables		批量導入(整個數據庫導入)
(3).sqoop export		導出(常用於數量增量更新/同步)
(4).sqoop job			多任務創建(增量導入時的任務創建)(可自動記錄上一次導入的最大Key值)

使用參數說明

1.數據導入:sqoop import
可通過 sqoop import --help 命令查看

參數 說明
普通參數
–connect 指定JDBC連接字符串
–connection-manager 指定連接管理器類名
–connection-param-file 指定連接參數文件
–driver 手動指定要使用的JDBC驅動程序類
–hadoop-home 覆蓋 $HADOOP_MAPR ED_HOME_ARG 參數
–hadoop-mapred-home 覆蓋 $HADOOP_MAPR ED_HOME_ARG 參數
–help 打印使用說明
–metadata-transaction-isolation-level 爲元數據查詢定義事務隔離級別
–oracle-escaping-disabled 禁用Oracle/OraOop連接管理器的轉義機制
-P 從控制檯讀取密碼
–password 設置密碼驗證
–password-alias 憑據提供程序密碼別名
–password-file 在密碼文件路徑上設置驗證
–relaxed-isolation 對導入使用read-uncommi隔離
–skip-dist-cache 跳過將jar複製到分佈式緩存
–temporary-rootdir 定義導入的臨時根目錄
–throw-on-error 在作業期間發生錯誤時,重新拋出RuntimeException
–username 設置身份驗證的用戶名
–verbose 工作時打印更多信息
導入的控制參數
–append 以追加模式導入數據
–as-avrodatafile 將導入數據以avro文件存儲
–as-parquetfile 將導入數據以parquet文件存儲
–as-sequencefile 將導入數據以SequenceFile文件存儲
–as-textfile 以純文本形式導入數據(默認)
–autoreset-to-one-mapper 如果沒有拆分鍵可用,則將映射器的數量重置爲一個映射器
–boundary-query 設置邊界查詢,檢索主鍵的最大值和最小值
–columns <col,col,col…> 指定需要導入的列
–compression-codec 用於導入的壓縮編解碼器
–delete-target-dir 以刪除模式導入數據(如果目標文件存在則刪除再導入. 不指定時如果目標路徑存在則報錯)
–direct 使用直接導入快速路徑
–direct-split-size 在直接模式導入時,將輸入流按“n”字節分割
-e,–query 導入SQL“語句”的結果
–fetch-size 當需要更多行時,設置從數據庫中獲取的行數’n’,設置內聯LOB的最大大小
-m,–num-mappers 使用n個map任務並行導入.默認並行度爲4
–mapreduce-job-name 爲生成的mapreduce作業設置名稱
–merge-key 要用於合併結果的Key列(用於增量導入時重複數據的合併)
–split-by 用於分割工作單元的表的列
–split-limit 日期/時間/時間戳和整數類型的拆分列每次拆分的行上限。對於日期或時間戳字段,以秒爲單位計算。拆分極限應該大於0
–table 讀取的表名(要導入的表)
–target-dir 導入的表存放於HDFS中的目標路徑
–validate 使用配置的驗證器驗證副本
–validation-failurehandler ValidationFailureHandler的完全限定類名
–validation-threshold ValidationThreshold的完全限定類名
–validator Validator的完全限定類名
–warehouse-dir 要導入hdfs的父路徑
–where 導入時使用WHERE條件過濾
-z,–compress 啓用壓縮
增量導入參數
–check-column 源列,以檢查增量更改
–incremental 定義類型爲“append”或“lastmodified”的增量導入
–last-value 增量檢查列中最後導入的值
輸出行格式化參數
–enclosed-by 設置所需字段的封閉字符
–escaped-by 設置轉義字符
–fields-terminated-by 設置字段分隔符
–lines-terminated-by 設置行尾字符
–mysql-delimiters 使用MySQL默認的分隔符集: 字段:, ;行:\n ;轉義字符:\ ;字段包圍符:’
–optionally-enclosed-by 設置包含字符的字段
輸入解析參數
–input-enclosed-by 設置所需的字段罩
–input-escaped-by 設置輸入轉義字符
–input-fields-terminated-by 設置輸入字段分隔符
–input-lines-terminated-by 設置輸入行結束字符
–input-optionally-enclosed-by 設置包含字符的字段
Hive參數
–create-hive-table 導入時自動創建Hive表.如果目標hive表存在,則失敗
–hive-database 設置導入到hive時要使用的數據庫名稱
–hive-delims-replacement 用用戶定義的字符串替換導入字符串字段中的Hive record \0x01和行分隔符(\n\r)
–hive-drop-import-delims 從導入的字符串字段中刪除Hive記錄\0x01和行分隔符(\n\r)
–hive-home 覆蓋 $HIVE_HOME 配置參數
–hive-import 將表導入到Hive中(如果沒有設置任何分隔符,則使用Hive的默認分隔符)
–hive-overwrite 重寫Hive表中的現有數據(覆蓋導入)
–hive-partition-key 設置導入到hive時要使用的分區鍵
–hive-partition-value 設置導入到hive時要使用的分區值
–hive-table 設置導入到hive時要使用的表名
–map-column-hive 覆蓋指定列到hive類型的映射
HCatalog參數(Hive元數據導入參數)
–hcatalog-database HCatalog數據庫名稱(即Hive數據庫)
–hcatalog-home 覆蓋 $HCAT_HOME(即HIVE_HOME)
–hcatalog-partition-keys 設置導入到hive時要使用的分區鍵
–hcatalog-partition-values 設置導入到hive時要使用的分區值
–hcatalog-table HCatalog表名(即Hive表)
–hive-home 覆蓋 $HIVE_HOME
–hive-partition-key 設置導入到hive時要使用的分區鍵
–hive-partition-value 設置導入到hive時要使用的分區值
–map-column-hive 覆蓋指定列到hive類型的映射
HCatalog導入特定選項
–create-hcatalog-table 在導入之前創建HCatalog
–drop-and-create-hcatalog-table 在導入之前刪除並創建HCatalog
–hcatalog-storage-stanza 用於創建表的HCatalog存儲節
HBase參數
–column-family 設置導入的目標列族
–hbase-bulkload 啓用HBase批量加載
–hbase-create-table 如果指定,創建缺少的HBase表
–hbase-row-key 指定要使用哪個輸入列作爲行鍵
–hbase-table 導入到HBase中的表名
Accumulo參數
–accumulo-batch-size 批處理大小(以字節爲單位)
–accumulo-column-family 設置導入的目標列族
–accumulo-create-table 如果指定,則創建缺少的累加Accumulo表
–accumulo-instance Accumulo實例名
–accumulo-max-latency 最大寫延遲(以毫秒爲單位)
–accumulo-password Accumulo密碼
–accumulo-row-key 指定要使用哪個輸入列作爲行鍵
–accumulo-table 導入到Accumulo中的表
–accumulo-user Accumulo用戶名
–accumulo-visibility 要應用於導入的所有行的可見性令牌
–accumulo-zookeepers 逗號分隔的zookeeper列表(主機:端口號)
代碼生成的參數
–bindir 編譯對象的輸出目錄
–class-name 設置生成的類名,覆蓋 --package-name. 當與–jar-file組合時,設置input類.
–escape-mapping-column-names 禁用列名中轉義的特殊字符
–input-null-non-string 輸入空非字符串表示
–input-null-string 輸入空字符串表示
–jar-file 禁用代碼生成;使用指定的jar
–map-column-java 覆蓋特定列到java類型的映射
–null-non-string 空非字符串表示(數值型默認初始化值:0)
–null-string 空字符串表示(即String默認初始化值:"")
–outdir 生成代碼的輸出目錄
–package-name 將自動生成的類放在這個包中

備註:
通用Hadoop命令行參數:(必須預先加入任何特定於工具的參數)
支持的通用選項包括

-conf <configuration file>     指定應用程序配置文件
-D <property=value>            爲給定的屬性使用值
-fs <local|namenode:port>      指定一個namenode
-jt <local|resourcemanager:port>    指定一個ResourceManager
-files <comma separated list of files>    指定要複製到mapReduce集羣的逗號分隔文件
-libjars <comma separated list of jars>    指定要包含在類路徑中的逗號分隔的jar文件.
-archives <comma separated list of archives>    指定要在計算機上取消存檔的逗號分隔歸檔.

一般的命令行語法是bin/hadoop命令[genericOptions] [commandOptions]
至少,您必須指定 --connect 和 --table
mysqldump和其他子程序的參數可以在命令行上的“–”後面提供。
示例一:從mysql到hive

sqoop export \
--connect jdbc:mysql://localhost:3306/db_mysql?useUnicode=true&characterEncoding=utf-8 \
--username root \
--password 123456 \
--table tb_mysql \
--hcatalog-database db_hive \
--hcatalog-table tb_hive \
--fields-terminated-by '\t'

示例二:從sqlserver到hive的增量導入

sqoop import \
--connect 'jdbc:sqlserver://1.2.3.4:5678;database=ABC' \
--username root \ 
--password 123456 \
--table tb_sqlserver \
--check-column LastModTime \
--delete-target-dir \
--incremental lastmodified  \
--last-value '2019-01-30 10:29:07.0'

示例三:從oracle到hive

sqoop import \
--connect 'jdbc:oracle:thin:@<HOST>:1521:app' \
--username root \
--password 123456 \
--hive-import \
--hive-table dw_hd.ods_store \
--query 'select * from HD.STORE where $CONDITIONS and RCVTIME < TO_TIMESTAMP('2017-05-30 00:00:00','yyyy-mm-dd hh24:mi:ss.ff')' \
--split-by FLOWNO \
--direct \
--target-dir '/user/root/store' \
--null-string '\\N' \
--null-non-string '\\N' \
--m 1;

注意:在–query中必須加入where $CONDITIONS


2.批量(或數據庫)導入:sqoop import-all-tables
可通過 sqoop import-all-tables --help 命令查看
除了 導入控制參數 和sqoop import不一致外,其它參數均相同,此處省略.

參數 說明
普通參數 (同上)
輸入解析參數 (同上)
輸出行格式化參數 (同上)
Hive參數 (同上)
HCatalog參數 (同上)
HCatalog導入特定選項 (同上)
HBase參數 (同上)
Accumulo參數 (同上)
代碼生成參數 (同上)
導入控制參數
–as-avrodatafile 將數據導入到avro文件中
–as-parquetfile 將數據導入到parquet文件中
–as-sequencefile 將數據導入到SequenceFile中
–as-textfile 以純文本形式導入數據(默認)
–autoreset-to-one-mapper 如果沒有拆分鍵可用,則將映射器的數量重置爲一個映射器
–compression-codec 用於導入的壓縮編解碼器
–direct 使用直接導入快速路徑
–direct-split-size 在直接模式導入時,將輸入流按“n”字節分割
–exclude-tables 導入所有表時要排除的表
–fetch-size 當需要更多行時,設置從數據庫中獲取的行數’n’
–inline-lob-limit 設置內聯LOB的最大大小
-m,–num-mappers 使用n個map任務並行導入,默認4
–mapreduce-job-name 爲生成的mapreduce作業設置名稱
–warehouse-dir 目標表的HDFS路徑
-z,–compress 啓用壓縮

注意:導入的時候一定要保證mysql庫裏面的所有表都有主鍵.
示例:(MySQL --> Hive 的整庫導入)

#將db_mysql庫中user_info除外的其他表全部導入
sqoop import-all-tables \
--connect jdbc:mysql://192.192.192.192:3306/db_mysql \
--username root \
--password 123456 \
--exclude-tables user_info \
--hive-import \
--hive-overwrite \
--hive-database db_hive

3.數據導出:sqoop export
可通過 sqoop export --help 命令查看

參數 說明
普通參數 (同上)
輸入解析參數 (同上)
輸出行格式化參數 (同上)
代碼生成參數 (同上)
HCatalog參數 (同上)
導出控制參數
–batch 指示以批處理模式執行的底層語句
–call 使用這個存儲過程填充表(每行一個調用)
–clear-staging-table 清除中間臨時表
–columns 指定導出的列,列名之間用逗號隔開
-m,–num-mappers 使用n個map任務並行導出
–staging-table 中間臨時表(創建一個與導入目標表同樣的數據結構,保留該表爲空在運行數據導入前,所有事務會將結果先存放在該表中,然後最後由該表通過一次事務將結果寫入到目標表中)
–table 需要導出的表
–update-key 按指定的鍵列更新記錄
–update-mode 指定在數據庫中發現具有不匹配鍵的新行時如何執行更新.該模式有兩種updateonly(默認)和allowinsert。
–validate 使用配置的驗證器驗證副本
–validation-failurehandler ValidationFailureHandler(驗證器故障處理器)的完全限定類名
–validation-threshold ValidationThreshold(驗證器閥值)的完全限定類名
–validator Validator(驗證器)的完全限定類名

備註:
updateonly:該模式用於更新Hive表與目標表中數據的不一致,即在不一致時,將Hive中的數據同步給目標表(如MySQL,Oracle等的目標表中),這種不一致是指,一條記錄中的不一致,比如Hive表和MySQL中都有一個id=1的記錄,但是其中一個字段的取值不同,則該模式會將這種差異抹除。對於“你有我無”的記錄則“置之不理”。
allowinsert:該模式用於將Hive中有但目標表中無的記錄同步到目標表中,但同時也會同步不一致的記錄。這種模式可以包含updateonly模式的操作,這也是爲什麼沒有命名爲insertonly的原因吧。
示例一:(MySQL --> Hive 的增量同步)

sqoop export \
--connect 'jdbc:mysql://192.192.192.192:3306/db_mysql?useUnicode=true&characterEncoding=UTF-8' \
--username root \
--password '123456' \
--table tb_mysql \
--hcatalog-database db_hive \
--hcatalog-table tb_hive \
--update-key update_time \
--update-mode allowinsert \
--fields-terminated-by '\t'

示例二:(Hive --> MySQL 的全表導出)

sqoop export \
--connect 'jdbc:mysql://192.192.192.192:3306/db_mysql?useUnicode=true&characterEncoding=utf-8' \
--username root \
--password '123456' \
--table tb_mysql \
--hcatalog-database db_hive \
--hcatalog-table tb_hive 

4.導入任務創建:sqoop job
可通過 sqoop job --help 命令查看

參數 說明
作業(Job)管理參數
–create 創建一個新保存的作業
–delete 刪除保存的作業
–exec 運行保存的作業
–help 打印使用說明
–list 查看現有Job列表(已創建的所有job)
–meta-connect 爲元數據指定JDBC連接字符串
–show 顯示指定的作業
–verbose 作業執行時打印更多信息

示例:

sqoop job \
--create job_rpd \
-- import \
--connect 'jdbc:sqlserver://1.2.3.4:7965;database=ABC' \
--username root\
--password 123456 \
--table tb_sqlserver \
--hive-import \
--hive-drop-import-delims \
--hive-database db_hive\
--hive-table tb_hive\
--incremental append \
--check-column update_time\
--merge-key update_time\
--last-value '2019-01-01 13:34:52.457' \
-m 1;

**執行Job**: sqoop job --exec job_rpd
**查看Job**: sqoop job --list
**刪除Job**: sqoop job --delete job_rpd

注意:
(1).“–”和import中間必需有空格,不然會報錯.
(2).每次執行任務都會提示輸入密碼,可通過在conf/sqoop-site.xml文件中配置sqoop.metastore.client.record.password 的值爲true即可取消這一提示,直接使用job中指定的密碼 。
(3).通過 sqoop job --show job_rpd 查看任務信息時可查看job任務詳情,包括每次執行完後last-value的更新值.
示例二:

sqoop job \
--create job_rrelieve \
-- import \
--connect 'jdbc:sqlserver://1.2.3.4:7965;database=ABC' \
--username root \
--password 123456 \
--query 'select cast(id as int) id,c1,c2,c3,c4,c5 from (select * from tb_sqlserver where id > 19000000 and id < 22000000)tmp WHERE $CONDITIONS' \
--hive-import \
--hive-drop-import-delims \
--hive-database db-hive \
--hive-table tb_hive \
--incremental append \
--check-column id \
--merge-key id \
--last-value '19020010' \
--target-dir 'hdfs://nameservice1/user/hive/warehouse/db_hive.db/tb_hive' \
-m 1;

執行:sqoop job --exec job_rrelieve
查看指定任務:sqoop job --show job_rrelieve 
刪除:sqoop job --delete job_rrelieve
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章