版本規劃:
jdk 1.8.0_141
zookeeperk
Sqoop適用場景
Sqoop主要解決的問題是:數據在Hadoop生態(HDFS,HBase,hive)數據存儲端和RDBMS(mysql)數據來源端之間交互的工具
Sqoop可以簡單理解爲:SQL到Hadoop和Hadoop到SQL
Sqoop工作機制
Sqoop安裝
sqoop是基於MR的,所以要想安裝sqoop必須已經安裝完成java和hadoop環境
使用版本:1.4.6
sqoop下載地址
1. 解壓安裝sqoop
tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha -C /export/servers
cd /exprot/servers
mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop //做一下重命名
2. 配置文件修改
cd $SQOOP_HOME/conf
mv sqoop-env-template.sh sqoop-env.sh //把env的模板複製一份
使用notepad++連接虛擬機對sqoop-env.sh進行修改
export HADOOP_COMMON_HOME= /export/servers/hadoop-2.7.5
export HADOOP_MAPRED_HOME= /export/servers/hadoop-2.7.5
export HIVE_HOME= /export/servers/apache-hive-2.1.1-bin
3. 加入mysql的jdbc驅動
上傳mysql的jdbc驅動包到sqoop的lib目錄下
4. 配置環境變量
vim /etc/profile
export SQOOP_HOME=/export/servers/sqoop
export PATH=:$SQOOP_HOME/bin:$PATH
不要忘記讓修改生效
source /etc/profile
5. 驗證啓動
sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
--username root --password 123456
使用sqoop連接mysql數據庫
顯示以上信息就算是安裝成功了
Sqoop導入
導入:將RDBMS數據->HDFS中
- 準備一個數據集,用作後面的操作,在 mysql 中創建數據庫 userdb,然後執行以下的 sql 腳本:
創建三張表: emp 僱員表、 emp_add 僱員地址表、emp_conn 僱員聯繫表。
create table emp (
id int not null,
name varchar(20),
deg varchar(20),
salary int,
dept char(10)
)character set utf8;
insert into emp values (1201,"gopal","manager",50000,"TP");
insert into emp values (1202,"manisha","Proof reader",50000,"TP");
insert into emp values (1203,"khalil","php dev",30000,"AC");
insert into emp values (1204,"prasanth","php dev",30000,"AC");
insert into emp values (1205,"kranthi","admin",20000,"TP")
create table emp_add(
id int,
hon varchar(20),
street varchar(20),
city varchar(20)
)character set utf8;
insert into emp_add values (1201,"288A","vgiri","jublee");
insert into emp_add values (1202,"108I","aoc","sec-bad");
insert into emp_add values (1203,"144Z","pgutta","hyd");
insert into emp_add values (1204,"78B","old city","sec-bad");
insert into emp_add values (1205,"720X","hitec","sec-bad");
create table emp_conn(
id int,
phno int,
email varchar(20)
)character set utf8;
insert into emp_conn values (1201,2356742,"[email protected]");
insert into emp_conn values (1202,1661663,"[email protected]");
insert into emp_conn values (1203,8887776,"[email protected]");
insert into emp_conn values (1204,9988774,"[email protected]");
insert into emp_conn values (1205,1231231,"[email protected]");
1.全量導入mysql表數據到HDFS
- 全量數據:從o開始到現在的所有數據就叫作全量數據
(1)sqoop命令mysql數據導入hdfs設置
下面的命令用於從 MySQL 數據庫服務器中的 emp 表導入 HDFS。
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--delete-target-dir \ //如果導入的文件路徑存在提前幫你刪除
--target-dir /sqoopresult \
--table emp --m 1 //表名稱 --m 1指定有幾個maptesk個數,這裏是一行行的讀數據,並不涉及聚合操作,所以這裏是沒有reduce的,
其中–target-dir 用來指定導入的HDFS路徑;
mysql jdbc url 請使用 ip 地址。
爲了驗證在 HDFS 導入的數據,請使用以下命令查看導入的數據也可以使用web頁面查看:
hdfs dfs -cat /sqoopresult/part-m-00000
(2)sqoop導入hdfs數據分隔符設置
可以看出它會在 HDFS 上默認用逗號,分隔 emp 表的數據和字段。可以通過
--fields-terminated-by '\t' //指定分隔符。
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoopresult213 \
--fields-terminated-by '\t' \
--table emp --m 1
(3)maptest個數設置
設置maptesk爲多個,需要指定分隔的字段, 他會首先來有主鍵按照主鍵來分,沒有主鍵就要指定字段,指定字段後,先是看一下字段的最大值最小值,來計算下字段的中間區間是多少,然後根據指定的並行度(maptesk個數),進行一個數據的劃分
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoopresult214 \
--fields-terminated-by '\t' \
--split-by id \
--table emp --m 2
(4)全量導入數據注意事項
- mysql的地址儘量不要使用localhost請使用ip或者host
- 如果不指定,導入到hdfs數據默認分隔符爲逗號
- –fields-terminated-by ‘\t’ 指定具體的分隔符
- 如果表的數據比較大,可以並行啓動多個maptesk執行導入操作,如果表沒有主鍵,請指定根據那個字段進行切分–split-by id \
2.全量導入mysql表數據到HIVE
(1)方式一:先複製表結構到hive中在導入數據
- 將關係型數據的表結構複製到 hive 中
sqoop create-hive-table \
--connect jdbc:mysql://node02:3306/userdb \
--table emp_add \
--username root \
--password 123456 \
--hive-table test.emp_add_sp
其中:
–table emp_add 爲 mysql 中的數據庫 sqoopdb 中的表。
–hive-table emp_add_sp 爲 hive 中新建的表名稱。
- 從關係數據庫導入文件到 hive 中
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table emp_add \
--hive-table test.emp_add_sp \
--hive-import \
--m 1
(2)方式二:直接複製表結構帶hive中
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table emp_conn \
--hive-import \
--m 1 \
--hive-database test;
3.導入數據表的子集
(1)增加where過濾條件
–where 可以指定從關係數據庫導入數據時的查詢條件。它執行在數據庫服務器相應的 SQL 查詢,並將結果存儲在 HDFS 的目標目錄。
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--where "city ='sec-bad'" \
--target-dir /wherequery \
--table emp_add \
--m 1
–target-dir /wherequery 導入到HDFS這個 /wherequery路徑下
(2)增加query查詢
注意事項:
使用 query sql 語句來進行查找不能加參數–table ;
並且必須要添加 where 條件;
並且 where 條件後面必須帶一個$CONDITIONS 這個字符串;
並且這個 sql 語句必須用單引號,不能用雙引號;
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--target-dir /wherequery12 \
--query 'select id,name,deg from emp WHERE id>1203 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 2
4.增量導入
所謂的增量數據值的是上次至今中間新增加的數據
--check-column (col)
用來指定一些列,這些列在增量導入時用來檢查這些數據是否作爲增量數據
進行導入,和關係型數據庫中的自增字段及時間戳類似。
注意:這些被指定的列的類型不能使任意字符類型,如 char、varchar 等類
型都是不可以的,要滿足自增長不重複,一般都是主鍵類型.同時-- check-column 可以去指定多個列。
--incremental (mode) //增量導入模式
append:追加,比如對大於 last-value 指定的值之後的記錄進行追加導入。
lastmodified:最後的修改時間,追加 last-value 指定的日期之後的記錄
--last-value (value) //指定值
指定自從上次導入後列的最大值(大於該指定的值),也可以自己設定某一值
(1)Append 模式增量導入
append追加:根據數值類型的字段進行追加導入,大於指定的last-value
- 首先先執行以下指令將我們之前的數據全量導入HDFS
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--target-dir /appendresult \
--table emp \
--m 1
- 然後我們在mysql的emp表中插入2條新的數據
insert into emp values (1206,"allen","admin","30000","tp");
insert into emp values (1207,"woon","admin","40000","tp");
- 執行以下命令實現增量導入
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table emp \
--m 1 \
--target-dir /appendresult \
--incremental append \
--check-column id \
--last-value 1205
(2)Lastmodified模式增量導入
根據時間戳類型字段進行追加大於等於指定的last-value
1.appen附加模式
- 首先創建一個customer表,指定一個時間戳
create table customertest(
id int,
name varchar(20),
last_mod timestamp default current_timestamp on update current_timestamp
)character set utf8; -- 默認是當前世界戳,如果更新數據更新數據的時間戳也爲當前時間的
- 分別插入以下記錄
insert into customertest(id,name) values (1,"neil");
insert into customertest(id,name) values (2,"jack");
insert into customertest(id,name) values (3,"martin");
insert into customertest(id,name) values (4,"tony");
insert into customertest(id,name) values (5,"eric");
- 首先我們對mysql的customertest表全量導入到HDFS中
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table customertest \
--target-dir /lastmodifiedresult \
--m 1
- 再次插入一條數據進入customertest表中
insert into customertest (id,name) values (6,"james");
- 使用incremental方式進行增量導入
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table customertest \
--target-dir /lastmodified \
--check-column last_mod \
--incremental lastmodified \
--last-value "2020-05-12 13:55:01" \
--m 1 \
--append
- 特別注意:
lastmodified模式去處理增量數據時,會將大於等於last-value值得數據當做增量插入,區別於append的大於,他是大於等於,這點一定要注意
2.merge-key合併模式
在這裏插入代碼片