1. 程式人生 > >Hbase和Mysql檔案互相匯入

Hbase和Mysql檔案互相匯入

以下的步驟都是我實驗成功後的記錄下來的,只記錄了大體的步驟,由於環境的差異,可能導致你的操作並不一定會成功!不要機械的式的複製,要結合你本機的環境去處理。對於配置選項,有些我也不擡理解,待理解之後再來補充。
實驗環境:
Linux 16.04.3
hadoop-2.8.1
hbse-1.2.6
hive-2.2.0
sqoop-1.4.6.bin__hadoop-2.0.4-alpha

一、從MySQL將表匯入到Hbase中 
從MySQL可以直接將表匯入到Hbase之中,需要事先在Hbase中建立表. 
語法:sqoop import --connect conectPath/databaseName --table tableName --username userName --password useNamePassword --bindir path --split-by columnName --hbase-table hbaseTableName --column-family columnFamilyName

 
需要根據你自己的具體資訊填入相關資訊。 
舉個例子:sqoop import --connect jdbc:mysql://localhost/jt --table gps --username root --password 123456 --bindir /home/test/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/lib --split-by id --hbase-table gps --column-family info 
我遇到的錯誤:某某類找不到 
原因:在匯入的過程之中會生成一個類,class檔案和jar檔案。在執行mapreduce的時候沒有找到這些檔案。 
解決辦法:找到這些檔案複製到SQOOP_HOME/lib
 目錄下。我通過--bindir 來設定這些檔案輸出的目錄 
二、從Hbase匯入MySQL資料庫 
該過程需要藉助Hive,需要使用Hive的託管表和外部表。 
1、在mysql在建立相應的表

create table employee(
rowkey int(11) not null,
id int(11) not null,
name varchar(20)
)charset=utf8;

2、在Hbase中建立相應的表,並插入資料 
建表語句: create 'employee','info' 
插入語句:put 'employee',1,'info:if',1 
put 'employee',1,'info:name','tom'

 
put 'employee',2,'info:id',2 
put 'employee',2,'info:name','mike' 
3、建立Hive的外部表 
建表語句:

create table h_employee( key int, id int, name string )
stored by "org.apache.hadoop.hive.hbase.HBaseStorageHandler"
with serdeproperties("hbase.columns.mapping"=":key,info:id,info:name")
tblproperties("hbase.table.name"="employee");

4、建立Hive的託管表

create table h_employee_export( key int, id int, name string  )
row format delimited fields terminated by '\054'

其中`row format delimited fields terminated by '\054'` 表示Hive託管表中欄位之間的分隔符,`\054` 是八進位制表示形式,十進位制為44,ascii為44的符號為逗號。可以改變為其他的符號。

5、將外部表(h_employee)匯入到託管表(h_employee_export)

insert overwrite table h_employee_export select * from h_employee;

6、從Hive託管表(h_employee_export)匯入到MySQL

“` 
sqoop export –connect jdbc:mysql://localhost:3306/ly –username root –password 0987654321 –table employee –bindir /home/ly/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/lib –export-dir /user/hive/warehouse/h_employee_export/ –mysql-delimiters –input-fields-terminated-by ‘\t’

解釋說明: 
--mysql-delimiters指示說明輸入資料使用MySQL預設的分隔符集合。域之間使用’,’;行與行之間使用’\n’,即換行符; 不檢查’\’; 
可以通過--fields-terminated-by <char>--lines-terminated-by <char> 指定輸出資料的域,行分割符 
--export-dir 為hive託管表的位置 
最後--input-fields-terminated-by '\t'指定輸入資料的域之間的分隔符

從Hbase匯入到MySQL中步驟較複雜,其中需要的注意的細節很多。在我將一個車輛的位置資訊從MySQL匯入到Hbase後,又想從Hbase中匯出,結果在從Hive託管表的匯出的過程中老是出錯,這其中的原因是分隔符,空值的原因。另外需要Hive的表字段,欄位型別和MySQL的欄位,欄位型別保持一致。

對於出現的錯誤,大家要靈活處理。