sqoop 常用命令
一、Sqoop與MySQL
1.列出mysql數據庫中的所有數據庫
sqoop list-databases -connect jdbc:mysql://192.168.1.10:3306 -username root -password root
注意:
以下URL寫法,都可以
jdbc:mysql://192.168.1.10:3306/(推薦)
jdbc:mysql://192.168.1.10/
jdbc:mysql://192.168.1.10
jdbc:mysql://masters:3306/
jdbc:mysql://master/
jdbc:mysql://master
jdbc:mysql://localhost:3306/
jdbc:mysql://localhost/
jdbc:mysql:///
jdbc:mysql://
2.列出數據庫sqoop中的所有數據表
sqoop list-tables -connect jdbc:mysql:///sqoop -username root -password root
3.通過Sqoop執行SQL語句
sqoop eval -connect jdbc:mysql:///sqoop -username root -password root -query "select * from employee where id=5"
可以快速地使用SQL語句對關系數據庫進行操作,這可以使得在使用import這種工具進行數據導入的時候,可以預先了解相關的SQL語句是否正確,並能將結果顯示在控制台。
二、Sqoop與HDFS
1.將sqoop.employee表中的數據導入HDFS的/sqfs目錄下
sqoop import -connect jdbc:mysql://192.168.10.71:3306/t2 -username=root -password=root -table employee -m 1 -target-dir /output/1
mysql只認ip地址
疊加
- 追加模式
sqoop import -connect jdbc:mysql://192.168.10.71:3306/t2 -username root -password root -table employee -m 1 -target-dir /output/3 -incremental append -check-column id -last-value "5"
- 最后修改模式
sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -m 1 -target-dir /sqfs -incremental lastmodified -check-column lastmodified -last-value '2016/1/5 18:00:05'
SQL語句
sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -m 1 -query 'SELECT id,birthday from employee where $CONDITIONS' -target-dir /res
注:不能添加-table參數
sqoop import-all-tables -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -paseeword root -m 1
注:不能添加-target-dir參數
導出的默認路徑是:/user/用戶名/若干數據表名/數據文件和_SUCCESS
所有表都有主鍵時,可以設置-m的參數大於1,否則只能唯 1
2.將HDFS上/sqfs目錄下的數據導入的sqoop.employee表中
sqoop export -connect "jdbc:mysql://192.168.11.51:3306/big1806?useUnicode=true&characterEncoding=utf-8" -username root -password root -table t2 -m 1 -export-dir /sqoop/mysql/t1
采用export插入數據的時候,如果數據已經存在了,插入會失敗,如果我們使用-update-key,它會認為每個數據都是更新,比如我們使用下面這條語句:
sqoop export -table foo -update-key id -export-dir /path/to/data -connect …
UPDATE foo SET msg='this is a test', bar=42 WHERE id=0;
UPDATE foo SET msg='some more data', bar=100 WHERE id=1;
...
這樣即使找不到它也不會報錯
-update-mode allowinsert 如果存在就更新,不存在就插入
三、Sqoop與Hive
1.將關系型數據的employee表結構復制到Hive中
sqoop create-hive-table -connect jdbc:mysql://192.168.11.51:3306/big1806 -username root -password root -table t1 -hive-table sqoop.t1 -fields-terminated-by "\0001" -lines-terminated-by "\n"注:
-hive-table emp指定在Hive中創建的表名為emp(默認數據庫default)
-hive-table sqoop.emp指定在Hive中的sqoop數據庫下創建emp表
-fields-terminated-by "\0001" 是設置每列之間的分隔符,"\0001"是ASCII碼中的1,是hive的默認行內分隔符,而sqoop的默認行內分隔符為","
-lines-terminated-by "\n" 設置的是每行之間的分隔符,此處為換行符,也是默認的分隔符;
2.將關系數據庫中的employee表的數據導入文件到Hive表中
sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -hive-table sqoop.emp -m 1 -fields-terminated-by "\0001" -hive-import
注:
-fields-terminated-by "\0001" 需同創建Hive表時保持一致
-hive-import 指定是Hive導入數據
-split-by id employee中沒有主鍵時,用於指定Mapper時的Key
追加1
sqoop import -append -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -target-dir /user/hive/warehouse/sqoop.db/emp/ -fields-terminated-by "\0001" -query "select * from employee where \$CONDITIONS" -m 1
注:
可以添加-columns,-where參數,同時使用時-where參數會失效
追加2
sqoop import -append -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -columns "id,name,birthday" -where "id=2" -m 1 -target-dir /user/hive/warehouse/sqoop.db/emp/ -fields-terminated-by "\0001"
注:
-target-dir /user/hive/warehouse/sqoop.db/emp 可用-hive-table sqoop.emp -hive-import替換,但是要去掉 -append 參數。
在導入大對象,比如BLOB和CLOB列時需要特殊處理,小於16MB的大對象可以和別的數據一起存儲,超過這個值就存儲在_lobs的子目錄當中,它們采用的是為大對象做過優化的存儲格式,最大能存儲2^63字節的數據,我們可以用-inline-lob-limit參數來指定每個lob文件最大的限制是多少,如果設置為0,則大對象使用外部存儲。
3. Hive導入參數
-hive-home <dir> 重寫$HIVE_HOME
-hive-import 插入數據到hive當中,使用hive的默認分隔符
-hive-overwrite 重寫插入
-create-hive-table 建表,如果表已經存在,該操作會報錯!
-hive-table <table-name> 設置到hive當中的表名
-hive-drop-import-delims 導入到hive時刪除 \n, \r, and \0001
-hive-delims-replacement 導入到hive時用自定義的字符替換掉 \n, \r, and \0001
-hive-partition-key hive分區的key
-hive-partition-value <v> hive分區的值
-map-column-hive <map> 類型匹配,sql類型對應到hive類型
hive空值處理
sqoop會自動把NULL轉換為null處理,但是hive中默認是把\N來表示null,因為預先處理不會生效的,我們需要使用 -null-string 和 -null-non-string來處理空值 把\N轉為\\N
例句:sqoop import ... -null-string '\\N' 或-null-non-string '\\N'
sqoop導入hive數據到MySql碰到hive表中列的值為null的情況:
在導入數據的過程中,如果碰到列值為null的情況,hive中為null的是以\N代替的,所以你在導入到MySql時,需要加上兩個參數:--input-null-string '\\N' --input-null-non-string '\\N',多加一個'\',是為轉義。如果你通過這個還不能解決字段為null的情況,還是報什么NumberFormalt異常的話,那就是比較另類的了,沒有關系,我們還是要辦法解決。
你應該注意到每次通過sqoop導入MySql的時,都會生成一個以MySql表命名的.java文件,然后打成JAR包,給sqoop提交給hadoop 的MR來解析Hive表中的數據。那我們可以根據報的錯誤,找到對應的行,改寫該文件,編譯,重新打包,sqoop可以通過 -jar-file ,--class-name 組合讓我們指定運行自己的jar包中的某個class。來解析該hive表中的每行數據。腳本如下:一個完整的例子如下:
sqoop export --connect "jdbc:mysql://localhost/aaa?useUnicode=true&characterEncoding=utf-8"
--username aaa --password bbb --table table
--export-dir /hive/warehouse/table --input-fields-terminated-by '\t'
--input-null-string '\\N' --input-null-non-string '\\N'
--class-name com.chamago.sqoop.codegen.bi_weekly_sales_item
--jar-file /tmp/sqoop-chamago/bi_weekly_sales_item.jar
上面--jar-file 參數指定jar包的路徑。--class-name 指定jar包中的class。
這樣就可以解決所有解析異常了。
4.將Hive中的表數據導入到mysql數據庫employee表中
sqoop export -connect "jdbc:mysql://192.168.11.51:3306/big1806?useUnicode=true&characterEncoding=utf-8" -username root -password root -table t3 -export-dir /user/hive/warehouse/sqoop.db/t1/ part-m-00000 -input-fields-terminated-by '\0001'注:
在進行導入之前,mysql中sqoop數據庫中employee表必須已經提起創建好了。
jdbc:mysql://192.168.1.10:3306/sqoop中的IP地址改成localhost會報異常
指定/user/hive/warehouse/sqoop.db/emp/part-m-00000,只加載該文件
指定/user/hive/warehouse/sqoop.db/emp/,加載該目錄下的所有文件
四、Sqoop與HBase
1. MySQL 中的employee表中的數據導入數據到 HBase的emp表中
sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -hbase-table emp -column-family 'per data' -hbase-row-key id -m 1
注:
-hbase-table emp 指定HBase的表emp
-column-family 'per data' 指定列族名per data
-hbase-create-table 該參數是用來創建HBase表的,但不太管用
2. 將employee表不同列的數據添加到emp表中不同列族中
- 先將employee表的name列中的數據到per data列族中
sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -hbase-table emp -column-family 'per data' -hbase-row-key id -m 1 -columns id,name
注:
-columns id,name 指定employee表中的id、name列
-hbase-row-key id 指定emp表中的行id
- 先將employee表的age、birthday列中的數據到pro data列族中
sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -hbase-table emp -column-family 'per data' -hbase-row-key id -m 1 -columns id,age,birthday
五、重要參數
1.轉換為對象
-map-column-java <mapping> 將轉換為java數據類型
-map-column-hive <mapping> 將轉換為hive數據類型
2.分隔符、轉義字符
例句:
Some string, with a comma.
Another "string with quotes"
導入命令:
$ sqoop import -fields-terminated-by , -escaped-by \\ -enclosed-by '\"' ...
處理結果:
"Some string, with a comma.","1","2","3"...
"Another \"string with quotes\"","4","5","6"...
導入命令:
$ sqoop import -optionally-enclosed-by '\"' (the rest as above)...
處理結果:
"Some string, with a comma.",1,2,3...
"Another \"string with quotes\"",4,5,6...
六、常用工具
1. sqoop job
保存常用的作業,以便下次快速調用
-create <job-id> 創建一個新的job
-delete <job-id> 刪除job
-exec <job-id> 執行job
-show <job-id> 顯示job的參數
-list 列出所有的job
- 創建job
sqoop job -create myjob - import -connect jdbc:mysql://example.com/db ... -table mytable
- 列出所有job
sqoop job -list
- 查看job
sqoop job -show myjob
- 執行job
sqoop job -exec myjob
- 重寫參數
sqoop job -exec myjob -username someuser -P
2. 聚合工具
sqoop-metastore、sqoop-merge
合並兩個目錄
sqoop merge -new-data newer -onto older -target-dir merged -jar-file datatypes.jar -class-name Foo -merge-key id
3. 校驗Validate
它用來比較源數據和目標數據的數量。
sqoop import --connect jdbc:mysql://db.foo.com/corp ... -table EMPLOYEES --validate
sqoop export --connect jdbc:mysql://db.example.com/foo --table bar -export-dir /results/bar_data --validate
注:
它有三個接口
Validator
Property: validator
Description: Driver for validation,
must implement org.apache.sqoop.validation.Validator
Supported values: The value has to be a fully qualified class name.
Default value: org.apache.sqoop.validation.RowCountValidator
Validation Threshold
Property: validation-threshold
Description: Drives the decision based on the validation meeting the
threshold or not. Must implement
org.apache.sqoop.validation.ValidationThreshold
Supported values: The value has to be a fully qualified class name.
Default value: org.apache.sqoop.validation.AbsoluteValidationThreshold
Validation Failure Handler
Property: validation-failurehandler
Description: Responsible for handling failures, must implement
org.apache.sqoop.validation.ValidationFailureHandler
Supported values: The value has to be a fully qualified class name.
Default value: org.apache.sqoop.validation.LogOnFailureHandler
例句:
sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES
添加參數:
-validate -validator org.apache.sqoop.validation.RowCountValidator
或-validate -validation-threshold
或-validate -validation-failurehandler
七、配置文件
通過配置文件conf/sqoop-site.xml來配置常用參數
例:
<property>
<name>property.name</name>
<value>property.value</value>
</property>
如果不在這里面配置的話,就需要像這樣寫命令
sqoop import -D property.name=property.value ...
參數:sqoop.bigdecimal.format.string
作用:大decimal是否保存為string,如果保存為string就是 0.0000007,否則為1E7
參數:sqoop.hbase.add.row.key
作用:是否把作為rowkey的列也加到行數據當中,默認是false的
附件:
1. 亂碼問題:
MySQL與HDFS相互導入,導出的亂碼問題。
修改MySQL的編碼格式,由Latin1改為UTF-8
vi /etc/my.cnf
添加如下內容:紅色的這個 是適合老版mysql 入:mysql5.1.71
[mysqld]
default-character-set=utf8
character_set_server=utf8
init_connect='SET NAMES utf8'
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
重啟MySQL服務,重建庫、表;
2. MySQL建表語句
創建員工表1
create table employee(
id int primary key auto_increment,
name varchar(20),
birthday date
);
測試數據:
insert into employee values('','張三','2000-01-01');
insert into employee values('','李四','2001-01-01');
insert into employee values('','王五','2002-01-01');
insert into employee values('','張小三','2003-01-01');
insert into employee values('','李小四','2004-01-01');
insert into employee values('','王小五','2005-01-01');
insert into employee values('','張大三','2006-01-01');
insert into employee values('','李大四','2007-01-01');
insert into employee values('','王大五','2008-01-01');
insert into employee values('','王二麻子','2009-01-01');
insert into employee values('','wangermazi','2010-01-01');
創建員工表2
create table em(
id int,
name varchar(20),
birthday date
);
測試數據:
insert into employee values('0','張三','2000-01-01');
insert into employee values('1','李四','2001-01-01');
insert into employee values('2','王五','2002-01-01');
insert into employee values('3','張小三','2003-01-01');
insert into employee values('4','李小四','2004-01-01');
insert into employee values('5','王小五','2005-01-01');
insert into employee values('6','張大三','2006-01-01');
insert into employee values('7','李大四','2007-01-01');
insert into employee values('8','王大五','2008-01-01');
insert into employee values('9','王二麻子','2009-01-01');
insert into employee values('10','wangermazi','2009-01-01');
3. HBase建表語句
MySQL建表語句
create table employee(
id int,
name varchar(20),
age int,
birthday date
);
測試數據
insert into employee values('0','張三','18','2003-01-01');
insert into employee values('1','李四','18','2003-01-01');
insert into employee values('2','王五','18','2003-01-01');
insert into employee values('3','wangermazi','18','2003-01-01');
創表語句
create 'emp','per data','pro data'
刪表語句
disable 'emp'
drop 'emp'
查詢語句
scan ‘emp’