Sqoop 是一款用來在不同數據存儲軟件之間進行數據傳輸的開源軟件,它支持多種類型的數據儲存軟件。
安裝 Sqoop
1.下載sqoop並加mysql驅動包
http://mirror.bit.edu.cn/apache/sqoop/,下載,如下載sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz,
要從 MySQL 導數據需要安裝 MySQL driver。如 mysql-connector-java-5.1.38.tar.gz,解壓以后把 jar 包放到 Sqoop 目錄下的 lib 目錄下。
2.配置環境變量
要把HADOOP_MAPRED_HOME添加到系統環境,否則會報錯/usr/software/sqoop/bin/../../hadoop/mapreduce does not exist!
需要 vi /etc/profiles加
SQOOP_HOME=/usr/software/hadoop
export HADOOP_MAPRED_HOME=/usr/software/hadoop
export SQOOP_HOME=/usr/software/hadoop
從 MySQL 到 HDFS
mysql測試表 bbb 為例
sqoop import --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --check-column <col> --incremental <mode> --last-value <value> --target-dir <hdfs-dir> --fields-terminated-by '\t' 例子: sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password admin --table bbb --check-column id --incremental append --last-value '1' --target-dir output_hb --fields-terminated-by '\t'
參數說明:

參數說明: dburi:數據庫的訪問連接,例如: jdbc:mysql://192.168.1.124:3306/ 如果您的訪問連接中含有參數,那么請用單引號將整個連接包裹住,例如’jdbc:mysql://192.168.1.124:3306/mydatabase?useUnicode=true’ dbname:數據庫的名字,例如:user。 username:數據庫登錄用戶名。 password:用戶對應的密碼。 tablename:MySQL 表的名字。 col:要檢查的列的名稱。 mode:該模式決定Sqoop如何定義哪些行為新的行。取值為append或lastmodified。 value:前一個導入中檢查列的最大值。 hdfs-dir:HDFS 的寫入目錄,例如:/user/hive/result。 –check-column,用來指定一些列,這些列在導入時用來檢查做決定數據是否要被作為增量數據,在一般關系型數據庫中,都存在類似Last_Mod_Date的字段或主鍵。注意:這些被檢查的列的類型不能是任意字符類型,例如Char,VARCHAR…(即字符類型不能作為增量標識字段) –incremental,用來指定增量導入的模式(Mode),append和lastmodified –last-value,指定上一次導入中檢查列指定字段最大值 --fields-terminated-by 行分隔符 ,如 '\t' --lines-terminated-by 列分隔符,hive只支持'\n'作為行分隔符,默認也是'\n' 更加詳細的參數使用請參考 Sqoop Import。
從 HDFS 到 MySQL
需要先創建好對應 HDFS 中的數據結構的 MySQL 表,然后在集群的 Master 節點上執行如下命令,指定要導的數據文件的路徑。
sqoop export --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --export-dir <hdfs-dir>
從 MySQL 到 Hive
在集群的 Master 節點上執行如下命令后,從MySQL數據庫導入數據的同時,也會新建一個 Hive 表。
sqoop import --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --check-column <col> --incremental <mode> --last-value <value> --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --target-dir <hdfs-dir> --create-hive-table --hive-table <hive-tablename>
報錯處理:若報錯“Hive does not support the SQL type for column GoodsPic” ,解決:對那列名指定類型,如 --map-column-hive GoodsPic=string
例子:
sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true --connect jdbc:postgresql://192.168.101.4:5432/postgres --username postgres --password 'admin' --table t_acc_master --hive-import --target-dir venus --hive-table venus.t_acc_master --hive-overwrite -m 1
參數說明:
--hive-table:對應的 Hive 中的表名,可以是 xxx.yyy 代表 數據庫.表 。
--hdfs-dir:將源數據導入到HDFS上的那個文件夾下
--create-hive-table:沒表就自動創建(默認是textfile的,不是parquet的)
--hive-overwrite 覆蓋同步
從 Hive 到 MySQL
請參考上面的從 HDFS 到 MySQL的命令,只需要指定 Hive 表對應的 HDFS 路徑就可以了。
例如:
sqoop export --connect jdbc:mysql://127.0.0.1:3306/parkdb --username xiaoming --password '123' --table t_vip_user --export-dir 'hive_g2park/vip/*' --fields-terminated-by "\t"
--fields-terminated-by指明hdfs數據到mysql的分割憑據
具體如下:hdfs數據到hive中,以及hdfs數據隱身理解
從 MySQL 到 OSS
類似從 MySQL 到 HDFS,只是 --target-dir 不同。在集群的 Master 節點上執行如下命令:
注意1: OSS 地址中的 host 有內網地址、外網地址和 VPC 網絡地址之分。如果用經典網絡,需要指定內網地址,杭州是 oss-cn-hangzhou-internal.aliyuncs.com,VPC 要指定 VPC 內網,杭州是 vpc100-oss-cn-hangzhou.aliyuncs.com。
注意2: 目前同步到OSS不支持—delete-target-dir,用這個參數會報錯Wrong FS。如果要覆蓋以前目錄的數據 ,可以在調用sqoop前,用hadoop fs -rm -r osspath
先把原來的oss目錄刪了。
sqoop import --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --check-column <col> --incremental <mode> --last-value <value> --target-dir <oss-dir> --temporary-rootdir <oss-tmpdir>
參數說明:
oss-dir:OSS 的寫入目錄,例如:oss://<accessid>:<accesskey>@<bucketname>.oss-cn-hangzhou-internal.aliyuncs.com/result
。
oss-tmpdir:臨時寫入目錄。指定append模式的同時,需要指定該參數。如果目標目錄已經存在於HDFS中,則Sqoop將拒絕導入並覆蓋該目錄的內容。采用append模式后,Sqoop會將數據導入臨時目錄,然后將文件重命名為正常目標目錄。
從OSS到MySQL
類似MySQL到HDFS,只是—export-dir不同。需要創建好對應OSS中的數據結構的MySQL表
然后在集群的Master節點上執行如下:指定要導的數據文件的路徑
sqoop export --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --export-dir <oss-dir>
參數:
oss-dir:oss的寫入目錄,例如:oss://<accessid>:<accesskey>@<bucketname>.oss-cn-hangzhou-internal.aliyuncs.com/result
注意: oss地址host有內網地址,外網地址,VPC網絡地址之分。如果 用經典網絡,需要指定內網地址,杭州是oss-cn-hangzhou-internal.aliyuncs.com,vpc要指定vpc內網,杭州是vpc100-oss-cn-hangzhou.aliyuncs.com
使用 SQL 作為導入條件
除了指定 MySQL 的全表導入,還可以寫 SQL 來指定導入的數據,如下所示:
sqoop import --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --query <query-sql> --split-by <sp-column> --hive-import --hive-table <hive-tablename> --target-dir <hdfs-dir>
- 例子:
sqoop import --connect jdbc:mysql://localhost:3306/gznt --username gznt_r --password '123' --query "SELECT NodeCode,NodeName from tb_bmda where 1=1 AND \$CONDITIONS " --split-by NodeCode --target-dir output2
參數說明:
query-sql:使用的查詢語句,例如:”SELECT * FROM profile WHERE id>1 AND \$CONDITIONS”。記得要用引號包圍,最后一定要帶上 AND \$CONDITIONS。
sp-column:進行切分的條件,一般跟 MySQL 表的主鍵。
hdfs-dir:要導到 MySQL 去的 HDFS 的數據目錄,例如:/user/hive/result。
hive-tablename:對應的 Hive 中的表名,可以是 xxx.yyy。
從MYSQL到HBASE
類似MySQL到HDFS,只是—export-dir不同。需要創建好對應OSS中的數據結構的MySQL表
然后在集群的Master節點上執行如下:指定要導的數據文件的路徑
ps:紅色可以不填
sqoop import -D sqoop.hbase.add.row.key=true --connect jdbc:mysql://localhost:3306/gznt --username gznt_r --password '123' --table t_bmda --columns NodeCode,NodeType,NodeName,IsWarehouse,IsAssetUser --hbase-table hbase_bmda --column-family info --hbase-row-key NodeCode --where "ID >= 5"
參數:
-D sqoop.hbase.add.row.key=true 是否將rowkey相關字段寫入列族中,默認false,默認你在列族中看不到任何row key中的字段。
--hbase-create-table 如果hbase中該表不存在則創建,ps:我加了這個,就報錯了,據說了版本兼容問題,可以先手動創建好hbase的表和列族
--hbase-row-key < col > 指定字段作為row key ,如果輸入表包含復合主鍵,用逗號分隔
從HIVE到HBASE
hive下建表(hbase下會自動創建對應表):
CREATE TABLE IF NOT EXISTS all_detail ( key string comment "rowkey", SaleDate varchar(60), NodeCode varchar(60), NodeName varchar(60) ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:SaleDate,info:NodeCode,info:NodeName") TBLPROPERTIES("hbase.table.name" = "hbase_tb"); ;
注意點:
1.建表的時候,必須建一個 key column,如上的 key string comment "rowkey"
2.hbase.columns.mapping中是hive與hbase的對應,即 把SaleData,NodeCode,NodeName數據同步到hbase_tb下的info列族下。
附錄:
Sqoop使用
Sqoop 簡介及安裝部署
使用Sqoop從MySQL導入數據到Hive和HBase 及近期感悟