sqoop的使用之import導入到HDFS


原文鏈接:

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

查看數據已經有了

 


免責聲明!

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



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