Sqoop使用,mysql,hbase,hive等相互轉換


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。
View Code

sqoop --split-by詳解 

從 HDFS 到 MySQL

需要先創建好對應 HDFS 中的數據結構的 MySQL 表,然后在集群的 Master 節點上執行如下命令,指定要導的數據文件的路徑。

  1. sqoop export --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --export-dir <hdfs-dir>

從 MySQL 到 Hive

在集群的 Master 節點上執行如下命令后,從MySQL數據庫導入數據的同時,也會新建一個 Hive 表。 

  1. 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目錄刪了。

  1. 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節點上執行如下:指定要導的數據文件的路徑

  1. 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 來指定導入的數據,如下所示:

  1. 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>
  2. 例子:
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:紅色可以不填

  1. 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 及近期感悟

 


免責聲明!

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



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