原文鏈接:
https://www.toutiao.com/i6772128429614563843/
首先我們已經安裝好sqoop了,如果沒有安裝好參考文檔《快速搭建CDH-Hadoop-Hive-Zoopkeeper-Sqoop環境進入Sqoop學習環境》
准備一些基本的認識
1、sqoop分為了sqoop1和sqoop2
2、sqoop2拆分server和client,類似於hiveserver2和beeline
3、sqoop早期是一些封裝MR程序,以jar文件的形式,最后才演變成了框架
4、用於在hadoop和結構化數據庫之間的高效傳輸批量數據的工具
下面我們開始做一些簡單是使用,熟悉sqoop的使用方式
查看幫助信息:bin/sqoop help
連接mysql
bin/sqoop list-databases --connect jdbc:mysql://mastercdh:3306/ --username root --password password
可以將數據庫羅列出來,顯示mysql數據庫說明安裝成功
從關系型數據庫中導入到HDFS(rdbms -> hdfs)
在mysql中創建一個庫和表,方便我們練習
create table importhdfs(
id int primary key not null,
name varchar(20) not null
);
插入數據
insert into importhdfs values(1,'x1');
insert into importhdfs values(2,'x2');
insert into importhdfs values(3,'x3');
insert into importhdfs values(4,'x4');
insert into importhdfs values(5,'x5');
使用命令導入數據(注意反斜杠,反斜杠后面不能有空格等)
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--table importhdfs
我們可以看reduce數量,sqoop不運行reduce
或者
那么我們的數據在哪里?
搜索outputdir,就可以看到目錄
hdfs://mastercdh:8020/user/root/importhdfs
我們就可以看到數據了
我們查看下數據
bin/hdfs dfs -text /user/root/importhdfs/part-m-00001
我們也可以
控制map任務的個數 -m,--num-mappers
輸出目錄路徑如果存在則刪除--delete-target-dir
指定輸出目錄 --target-dir
運行下
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--delete-target-dir \
--target-dir /sqoop_test \
--table importhdfs \
-m 1
我們查看數據
bin/hdfs dfs -text /sqoop_test/part-m-00000
這個數據分隔符是逗號
1,x1
2,x2
3,x3
4,x4
5,x5
我們可以指定數據輸出分隔符(mysql默認是 ',')
分隔符參數fields-terminated-by
命令
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--delete-target-dir \
--target-dir /sqoop_test \
--table importhdfs \
-m 1 \
--fields-terminated-by "\t"
查看下數據
bin/hdfs dfs -text /sqoop_test/part-m-00000
其中有個日志信息
指定快速模式 --direct
命令
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--direct \
--delete-target-dir \
--target-dir /sqoop_test \
--table importhdfs \
-m 1 \
--fields-terminated-by "\t"
bin/hdfs dfs -text /sqoop_test/part-m-00000
增量導入,從原有的數據上進行追加數據。比如mysql中表數據變化了,那么我重新執行sqoop,會把HDFS上的數據刪除,這不符合我們的要求,我們只希望在原來的基礎上添加數據。
首先了解三個參數
--check-column (col):指定要導入時檢查的列,行的檢測列,一般都是拿主鍵作為檢測列。注意:char、varchar類型不可以使用
--incremental (mode):有兩種模式:append 和 lastmodifuied
append :追加 lastmodifuied:時間戳
--last-value (value):指定上次導入檢測列最后字段的最大值,也就是最后一個值
在append模式下
增加幾條數據
insert into importhdfs values(5,'x5');
insert into importhdfs values(6,'x6');
insert into importhdfs values(7,'x7');
insert into importhdfs values(8,'x8');
insert into importhdfs values(9,'x9');
注意:append和--delete-target-dir不能同時使用
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--direct \
--target-dir /sqoop_test \
--table importhdfs \
-m 1 \
--fields-terminated-by "\t" \
--check-column id \
--incremental append \
--last-value 5
會有很多信息
查看
查看
bin/hdfs dfs -text /sqoop_test/part-m-00000
bin/hdfs dfs -text /sqoop_test/part-m-00001
在lastmodifuied模式下
如果check-column是時間列time的話
--check-column time time列下面的數據,指定的就是你添加數據時最后的時間戳
--last-value"2019-12-19 19:04:07" 最后一行的時間戳
創建表
create table inc_tab(
id int,
name varchar(20),
last_mod timestamp default current_timestamp on update current_timestamp
);
添加數據
insert into inc_tab(id,name) values(1,'inc1');
insert into inc_tab(id,name) values(2,'inc2');
insert into inc_tab(id,name) values(3,'inc3');
insert into inc_tab(id,name) values(4,'inc4');
insert into inc_tab(id,name) values(5,'inc5');
執行sqoop命令
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--table inc_tab \
--target-dir /sqoop_test_inc \
--fields-terminated-by '\t' \
--num-mappers 1
查看數據
bin/hdfs dfs -text /sqoop_test_inc/part-m-00000
再添加幾條數據
insert into inc_tab(id,name) values(6,'inc6');
insert into inc_tab(id,name) values(7,'inc7');
insert into inc_tab(id,name) values(8,'inc8');
使用lastmodifuied模式進行增量導入指定增量數據是以--append(附加)還是 --merge-key(合並)模式進行添加
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--table inc_tab \
--target-dir /sqoop_test_inc \
--check-column last_mod \
--fields-terminated-by '\t' \
--incremental lastmodified \
--last-value "2019-12-20 03:13:51" \
--num-mappers 1 \
--merge-key id
bin/hdfs dfs -text /sqoop_test_inc/part-r-00000
這個地方是有reduce的
這些命令我們可以使用job執行:sqoop job
bin/sqoop job --create job01 創建
bin/sqoop job --delete 刪除任務
bin/sqoop job --exec 執行job
bin/sqoop job --show 顯示job的詳細信息
bin/sqoop job --list 顯示可執行的job
示例語句:
sqoop job --create myjob -- import --connect jdbc:mysql://example.com/db \
--table mytable
我們做個練習
先導入數據
insert into importhdfs values(11,'x11');
insert into importhdfs values(12,'x12');
insert into importhdfs values(13,'x13');
insert into importhdfs values(14,'x14');
insert into importhdfs values(15,'x15');
執行命令
bin/sqoop job \
--create job_importhdfs \
-- \
import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--direct \
--target-dir /sqoop_test \
--table importhdfs \
-m 1 \
--fields-terminated-by "\t" \
--check-column id \
--incremental append \
--last-value 10
我們查看是否成功
我們執行一下
bin/sqoop job --exec job_importhdfs
執行job的時候會確認密碼,指定成mysql的登錄密碼
我們查看數據
可以選擇行列
導出某幾列數據或者幾行數據
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--direct \
--delete-target-dir \
--target-dir /where_test_importhdfs \
--table importhdfs \
-m 1 \
--fields-terminated-by "\t" \
--where 'id<6'
查看數據
bin/hdfs dfs -text /where_test_importhdfs/part-m-00000
導出某幾列
--query使用要點:
不能使用--table
如果--query的sql語句帶着where字句,
必須要加上標識符$CONDITIONS
查看數據
bin/hdfs dfs -text /where_test_importhdfs_sql/part-m-00000
mysql導入數據到hive中該如何做呢?
先登錄hive
在hive中操作,創建數據庫:
create database frommysql;
創建表
創建表
create table importhive_info(
num int,
name string
)row format delimited fields terminated by "\t";
數據也有了
執行語句
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--direct \
--table importhdfs \
--delete-target-dir \
--hive-import \
--hive-database frommysql \
--hive-table importhive_info \
--fields-terminated-by "\t" \
-m 1
執行報錯
但是我們數據庫明明有
查看mysql元數據信息發現新建的庫表都沒有
難道沒有使用mysql的元數據庫?初始化出問題了嗎?於是重新初始化
bin/schematool -dbType mysql –initSchema
出現derby信息,還是舊信息
我的配置沒有起作用?
為什么會有元數據庫呢?說明之前是對的,仔細核對了一遍,發現是配置文件被我改動的問題。
這個地方寫錯路徑了(截圖已改對)
重新啟動
Mysql中元數據庫有了
重新創建上面的庫表
元數據有信息了
在執行之前的sqoop語句
查看下hive中的數據已經有了
這個地方注意:運行mr任務時,結果將會保存在默認的輸出目錄上。還在/user/hive/warehouse。
從hdfs導入到mysql(export)
常規模式導入數據到mysql
我們創建一個表
create table tomysql(
id int primary key not null,
name varchar(20) not null
);
導出語句
bin/sqoop export \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--table tomysql \
--export-dir /user/hive/warehouse/frommysql.db/importhive_info \
-m 1 \
--input-fields-terminated-by '\t'
查看下數據
sqoop運行一個file文件
在mysql重新建表file_to_mysql
創建文本
export
--connect
jdbc:mysql://mastercdh:3306/sqoop_test
--username
root
--password
password
--table
file_to_mysql
--export-dir
/user/hive/warehouse/frommysql.db/importhive_info
-m
1
--input-fields-terminated-by
'\t'
執行命令
bin/sqoop --options-file /data/test/filetomysql
查看數據已經有了