一、安裝:
1 解壓然后把mysql的驅動放在$SQOOP_HOME/lib 目錄中
2. conf/sqoop-en.shexport HADOOP_COMMON_HOME=/home/hadoop/hadoop/hadoop-2.3.0
export HADOOP_MAPRED_HOME=/home/hadoop/hadoop/hadoop-2.3.0
注意事項
1.數據庫驅動:在執行sqoop命令的client的sqoop lib目錄下面放入驅動jar包即可(CDH默認在/opt/cloudera/parcels/CDH/lib/sqoop/lib/目錄),驅動版本使用mysql-connector-java-5.1.32-bin.jar以上。2.client端JDK版本1.6~1.7,並且配置環境變量
命令
二、sqoop工具import
sqoop工具匯總
選項
含義說明
--connect <jdbc-uri>
指定JDBC連接字符串
--connection-manager <class-name>
指定要使用的連接管理器類
--driver <class-name>
指定要使用的JDBC驅動類
--hadoop-mapred-home <dir>
指定$HADOOP_MAPRED_HOME路徑
--help
萬能幫助
--password-file
設置用於存放認證的密碼信息文件的路徑
-P
從控制台讀取輸入的密碼
--password <password>
設置認證密碼
--username <username>
設置認證用戶名
--verbose
打印詳細的運行信息
--connection-param-file <filename>
可選,指定存儲數據庫連接參數的屬性文件
選項
含義說明
--append
將數據追加到HDFS上一個已存在的數據集上
--as-avrodatafile
將數據導入到Avro數據文件
--as-sequencefile
將數據導入到SequenceFile
--as-textfile
將數據導入到普通文本文件(默認)
--boundary-query <statement>
邊界查詢,用於創建分片(InputSplit)
--columns <col,col,col…>
從表中導出指定的一組列的數據
--delete-target-dir
如果指定目錄存在,則先刪除掉
--direct
使用直接導入模式(優化導入速度)
--direct-split-size <n>
分割輸入stream的字節大小(在直接導入模式下)
--fetch-size <n>
從數據庫中批量讀取記錄數
--inline-lob-limit <n>
設置內聯的LOB對象的大小
-m,--num-mappers <n>
使用n個map任務並行導入數據
-e,--query <statement>
導入的查詢語句
--split-by <column-name>
指定按照哪個列去分割數據
--table <table-name>
導入的源表表名
--target-dir <dir>
導入HDFS的目標路徑
--warehouse-dir <dir>
HDFS存放表的根路徑
--where <where clause>
指定導出時所使用的查詢條件
-z,--compress
啟用壓縮
--compression-codec <c>
指定Hadoop的codec方式(默認gzip)
--null-string <null-string>
果指定列為字符串類型,使用指定字符串替換值為null的該類列的值
--null-non-string <null-string>
如果指定列為非字符串類型,使用指定字符串替換值為null的該類列的值
2.把mysql中的表復制到hdfs中
默認情況下,使用導入語句,直接導入到HDFS當前用戶的目錄下面,生成相應的表明,文件夾名稱默認為表名。
默認(在行命令的機器上添加驅動):
sqoop import --connect jdbc:mysql://crxy172:3306/testsqoop --username 'root' --password '123456' --table info
指定到入目錄:
sqoop import --connect jdbc:mysql://crxy172:3306/testsqoop --username 'root' --password '123456' --table info –target-dir info_dir
如果目錄以及存在,使用--delete-target-dir:
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info --delete-target-dir
指定map個數
默認啟動4個進程導入(map數量),可以設置 1表示不並行
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info -m 1
同一個目錄進行數據追加
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info -m 1 --append
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info -m 1 --append --check-column 'id' --incremental append --last-value 23
指定條件
注意兩點:
第一、不能含中文;第二、"job='CTO'"
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info -m 1 --append --where "job='CTO'" (可以使用模糊批量匹配)
啟用壓縮
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info -m 1 --append --where "job like 'CTO'" -z (默認Gzip壓縮)
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root -password 123456 --table info -m 1 --append --where "job like 'CTO'" -z --compression-codec org.apache.hadoop.io.compress.SnappyCodec (直接指定壓縮編碼)
導入空值處理
字符串類型:
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info -m 1 --append --null-string "--" (不可以,不能是關鍵字符)
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info -m 1 --append --null-string "*"
非字符串類型:
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info -m 1 --append --null-string "*" --null-non-string "="
3.把mysql中的表復制到hive中
Sql導入
sqoop import --connect jdbc:mysql://crxy172:3306/test --username 'root' --password '123456' --query "select name,job from info where \$CONDITIONS" -m 1 --target-dir queryinfo --fields-terminated-by "," --split-by "id" (必須指定-m 、--fields-terminated-by 、--split-by)
追加數據
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info --hive-import -m 1
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info --hive-import -m 1 --fields-terminated-by "|" (如果數據表已經存在,並且字段不一樣,指定分隔符時會把加到第一列中,不指定時取mysql第一列id值加到hive中)
覆蓋數據
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info --hive-import -m 1 --fields-terminated-by "|" --hive-overwrite (只覆蓋數據,不覆蓋表結構)
創建hive表(自定義表名)
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info --hive-import -m 1 --fields-terminated-by "|" --hive-table "info_t" --hive-overwrite (如果表已經存在,不會刪除,只能重新定義表名)
注意:如果導出過程失敗,需要到HDFS目錄當前用戶目錄下將臨時目錄刪除,hdfs當前用戶目錄下不能存在表目錄,可以另外指定--target-dir --delete-target-dir
復制mysql的表結構到Hive
sqoop create-hive-table --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info --hive-table users --fields-terminated-by "\0001" --lines-terminated-by "\n" (不復制數據)
導出所有的表到hive
sqoop import-all-tables --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --hive-import --fields-terminated-by "\u0001" --lines-terminated-by "\n"
4.把mysql中的表復制到HBase
選項 說明
--hbase-table 指定導入到hbase中的表
--column-family 創建列族
--hbase-row-key <id> 以id字段作為key
--hbase-create-table 創建hbase表
導入hive時,默認以主鍵作為key,沒有主鍵使用--split-by ,暫時處理不了聯合主鍵情況。
sqoop import --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info --hbase-create-table --hbase-row-key id --hbase-table info --column-family xxx
三、sqoop工具export
選項
含義說明
--validate <class-name>
啟用數據副本驗證功能,僅支持單表拷貝,可以指定驗證使用的實現類
--validation-threshold <class-name>
指定驗證門限所使用的類
--direct
使用直接導出模式(優化速度)
--export-dir <dir>
導出過程中HDFS源路徑
--m,--num-mappers <n>
使用n個map任務並行導出
--table <table-name>
導出的目的表名稱
--call <stored-proc-name>
導出數據調用的指定存儲過程名
--update-key <col-name>
更新參考的列名稱,多個列名使用逗號分隔
--update-mode <mode>
指定更新策略,包括:updateonly(默認)、allowinsert
--input-null-string <null-string>
使用指定字符串,替換字符串類型值為null的列
--input-null-non-string <null-string>
使用指定字符串,替換非字符串類型值為null的列
--staging-table <staging-table-name>
在數據導出到數據庫之前,數據臨時存放的表名稱
--clear-staging-table
清除工作區中臨時存放的數據
--batch
使用批量模式導出
1.把HDFS中的表數據復制到mysql中
導出到mysql(默認使用逗號作為分隔)
直接導出,導出時字段需要一一對應
sqoop export --connect jdbc:mysql://crxy172:3306/test --username root --password 123456 --table info --export-dir export
亂碼問題
sqoop export --connect "jdbc:mysql://crxy172:3306/test?useUnicode=true&characterEncoding=utf-8" --username root --password 123456 --table info --export-dir export
指定map數
sqoop export --connect "jdbc:mysql://crxy172:3306/test?useUnicode=true&characterEncoding=utf-8" --username root --password 123456 --table info --export-dir export -m 1
插入和更新
如果存在就更新,不存在就插入
sqoop export --connect "jdbc:mysql://crxy172:3306/test?useUnicode=true&characterEncoding=utf-8" --username root --password 123456 --table info --export-dir export -m 1 --update-key id --update-mode allowinsert
指定分隔符(和導入區別開來)
導入導出的事務是以Mapper任務為單位。
注意:1--fields-terminated-by導入數據時(import)字段分割、行分割
2 --input-fields-terminated-by解析HDFS上面的數據到數據庫時使用參數
2.從HBase到mysql
沒有直接導出方案。只能使用以下步驟,先通過mapreduce寫入到HDFS在通過export工具導入到mysql。
導出空值處理
--input-null-string string類型使用參數
--input-null-non-string <null-string> 非string類型使用參數
四、其他工具使用
1.
Codegen
編譯jar包和record類
sqoop codegen --connect jdbc:mysql://crxy172:3306/test --username 'root' --password '123456' --table info --bindir sqoopjar
直接使用已經編譯好的類
sqoop import --connect jdbc:mysql://crxy172:3306/test --username 'root' --password '123456' --table info --class-name info --jar-file info.jar
導出過程生成的和Codegen生成代碼區別:
a.導出過程生成代碼純屬於副產品,無法控制,默認和表名一樣
b.Codegen可以指定生成代碼的參數,可以用來重新生成導入過程的源代碼
主要作用:a) 可以將需要導入的數據事先序列化到HDFS中
b) 檢查數據表,采用最合適的數據類型
c) 如果事先已經將數據序列化到了HDFS,可以采用該方式讀取出來
2.
Eval
直接使用sql查詢mysql
sqoop eval --connect jdbc:mysql://crxy172:3306/test --username 'root' --password '123456' --query "select * from info"
插入操作:
sqoop eval --connect "jdbc:mysql://crxy172:3306/test?useUnicode=true&characterEncoding=utf-8" --username 'root' --password '123456' --query "insert into info values (24,'超人','飛人',1)"
3.
job生成
?創建job:--create
?刪除job:--delete
?執行job:--exec
?顯示job:--show
?列出job:--listsqoop job --create myjob -- import --connect jdbc:mysql://crxy172:3306/test --username 'root' --password '123456' --table info
sqoop job --list
sqoop job --exec myjob
五、常見問題
事務處理
由於線程的並發性,一個導入操作可能並不是原子性的。會一次statement插入100條數據,然后每100個statement提交一次,所以一次就會提交10000條數據。如果tasks失敗了(由於網絡問題或者其它的問題),這些tasks會嘗試從它們開始導入數據的地方重新開始,會插入重復的記錄。這次寫數據的時候,Sqoop不提防這種潛在的問題。Sqoop提供的一個解決辦法就是使用中間表,參數為:
--staging-table <staging-table-name>
--clear-staging-table
字段名稱問題
sqoop 從mysql導入hive的字段名稱問題
hive中有些關鍵字限制,因此有些字段名稱在mysql中可用,但是到了hive就不行。部分不能在hive中使用的字段名稱
order;sort;reduce;cast;directory
參數處理
部分字段含有特殊字符時需要添加雙引號,單雙引號都有時,一般采用雙引號套單引號。