大數據組件-Apache Sqoop,工作機制,安裝配置,全量增量導入到hdfs,hive數倉,導出

版本規劃:
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)全量導入數據注意事項

  1. mysql的地址儘量不要使用localhost請使用ip或者host
  2. 如果不指定,導入到hdfs數據默認分隔符爲逗號
  3. –fields-terminated-by ‘\t’ 指定具體的分隔符
  4. 如果表的數據比較大,可以並行啓動多個maptesk執行導入操作,如果表沒有主鍵,請指定根據那個字段進行切分–split-by id \

2.全量導入mysql表數據到HIVE

(1)方式一:先複製表結構到hive中在導入數據

  1. 將關係型數據的表結構複製到 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 中新建的表名稱。

  1. 從關係數據庫導入文件到 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

  1. 首先先執行以下指令將我們之前的數據全量導入HDFS
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--target-dir /appendresult \
--table emp \
--m 1

在這裏插入圖片描述

  1. 然後我們在mysql的emp表中插入2條新的數據
insert into emp values (1206,"allen","admin","30000","tp");
insert into emp values (1207,"woon","admin","40000","tp");
  1. 執行以下命令實現增量導入
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附加模式

  1. 首先創建一個customer表,指定一個時間戳
create table customertest(
  id int,
  name varchar(20),
  last_mod timestamp default current_timestamp on update current_timestamp
)character set utf8; -- 默認是當前世界戳,如果更新數據更新數據的時間戳也爲當前時間的
  1. 分別插入以下記錄
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");
  1. 首先我們對mysql的customertest表全量導入到HDFS中
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table customertest \
--target-dir /lastmodifiedresult \
--m 1
  1. 再次插入一條數據進入customertest表中
insert into customertest (id,name) values (6,"james");
  1. 使用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合併模式

在這裏插入代碼片
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章