大數據之sqoop


一、安裝:


1 解壓然后把mysql的驅動放在$SQOOP_HOME/lib 目錄中
2. conf/sqoop-en.sh

export 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:--list

    sqoop 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

參數處理

部分字段含有特殊字符時需要添加雙引號,單雙引號都有時,一般采用雙引號套單引號。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM