目錄
RDBMS到HDFS
1) 確定Mysql服務開啓正常
2) 在Mysql中新建一張表並插入一些數據
$ mysql -uroot -proot
mysql> create database company;
mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));
mysql> insert into company.staff(name, sex) values('Thomas', 'Male');
mysql> insert into company.staff(name, sex) values('Catalina', 'FeMale');
3) 導入數據
其中有報錯信息與解決,在報錯import報錯中有例子
(1)全部導入
$ bin/sqoop import \
--connect jdbc:mysql://hadoop000:3306/company \
--username root \
--password root \
--table staff \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"
delete-target-dir:該文件如果有的話就刪除
導入成功圖:
(2)查詢導入
$ bin/sqoop import \
--connect jdbc:mysql://hadoop000:3306/company \
--username root \
--password root \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'
提示:must contain '$CONDITIONS' in WHERE clause. 所以後面必須加 $CONDITIONS
如果query後使用的是雙引號,則$CONDITIONS前必須加轉義符,防止shell識別爲自己的變量。
如:
--query "select name,sex from staff where id <=1 and \$CONDITIONS;"
(3)導入指定列
$ bin/sqoop import \
--connect jdbc:mysql://hadoop000:3306/company \
--username root \
--password root \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,sex \
--table staff
提示:columns中如果涉及到多列,用逗號分隔,分隔時不要添加空格
(4)使用sqoop關鍵字篩選查詢導入數據
$ bin/sqoop import \
--connect jdbc:mysql://hadoop000:3306/company \
--username root \
--password root \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1"
注意:跟query跟table一起使用會有問題
RDBMS到Hive
$ bin/sqoop import \
--connect jdbc:mysql://hadoop000:3306/company \
--username root \
--password root \
--table staff \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table staff_hive
提示:該過程分爲兩步,第一步將數據導入到HDFS,第二步將導入到HDFS的數據遷移到Hive倉庫,第一步默認的臨時目錄是/user/用戶/表名,我的是/user/hadoop/staff
注意:導入hive成功後,會將該表名的整個臨時目錄刪除掉。
其中出現過一些報錯有記錄->在筆記的"報錯解決"下->import到hive過程中報錯,但是中間結果已經寫入到了hdfs,再次執行報文件已存在
import到hive過程中報錯,但是中間結果已經寫入到了hdfs,再次執行報文件已存在
在項目生產上,用sqoop導入時候一般先判斷文件是否存在,存在的話先刪除舊文件再執行導入腳本。
添加這個參數
--delete-target-dir \
20/04/01 22:34:15 WARN security.UserGroupInformation: PriviledgedActionException as:hadoop (auth:SIMPLE) cause:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://hadoop000:8020/user/hadoop/staff already exists
20/04/01 22:34:15 ERROR tool.ImportTool: Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://hadoop000:8020/user/hadoop/staff already exists
成功日誌:
RDBMS到Hbase
啓動HBase之前要把HDFS、YARN、zookeeper開啓
$ bin/sqoop import \
--connect jdbc:mysql://hadoop000:3306/company \
--username root \
--password root \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by id
提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自動創建HBase表的功能
不過我用的sqoop-1.4.6-cdh5.7.0、hbase-1.2.0-cdh5.7.0是可以自動創建的 !!
解決方案:手動創建HBase表
hbase> create 'hbase_company,'info'
(5) 在HBase中scan這張表得到如下內容
hbase> scan ‘hbase_company’