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