1. 程式人生 > >#12、Sqoop使用過嗎?說一下sqoop的工作原理,以及使用體驗

#12、Sqoop使用過嗎?說一下sqoop的工作原理,以及使用體驗

Sqoop是什麼???

Sqoop:SQL-to-Hadoop 傳統資料庫與Hadoop間資料同步工具 利用Mapreduce分散式批處理,加快了資料傳輸速度,保證了容錯性

Sqoop的工作原理

sqoop1 import原理: 從傳統資料庫獲取元資料資訊(schema、table、field、field type),把匯入功能轉換為只有Map的Mapreduce作業,在mapreduce中有很多map,每個map讀一片資料,進而並行的完成資料的拷貝。

sqoop1 export原理: 獲取匯出表的schema、meta資訊,和Hadoop中的欄位match;多個map only作業同時執行,完成hdfs中資料匯出到關係型資料庫中

1、Sqoop介紹

Sqoop即 SQL to Hadoop ,是一款方便的在傳統型資料庫與Hadoop之間進行資料遷移的工具,充分利用MapReduce並行特點以批處理的方式加快資料傳輸,發展至今主要演化了二大版本,Sqoop1和Sqoop2,我們以Sqoop1為案例進行講解,Sqoop2商用不太穩定。

Sqoop工具是hadoop下連線關係型資料庫和Hadoop的橋樑,支援關係型資料庫和hive、hdfs,hbase之間資料的相互匯入,可以使用全表匯入和增量匯入。

hive的工作原理

在這裡插入圖片描述

2. sqoop安裝

  • 2.1. 上傳解壓

    tar -zxvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz -C /wishedu/
  • 2.2. 配置環境變數
    vi /etc/profile
    在最後面增加:

export SQOOP_HOME = /wishedu/sqoop-1.4.4 export PATH=$PATH:$JAVA_HOME/bin;$HADOOP_HOME/bin:$SQOOP_HOME/bin

`重新整理profile:`

source /etc/profile

  • 2.3. 重新命名配置檔案

在$SQOOP_HOME/conf中執行命令
mv

sqoop-env-template.sh sqoop-env.sh

  • 2.4. 修改配置檔案sqoop-env.sh

1.#Set path to where bin/hadoop is available 2.export HADOOP_COMMON_HOME=/wishedu/hadoop-2.4.1/ 3. 4.#Set path to where hadoop-*-core.jar is available 5.export HADOOP_MAPRED_HOME=/wishedu/hadoop-2.4.1/ 6. 7.#set the path to where bin/hbase is available 8.#export HBASE_HOME= 9. 10.#Set the path to where bin/hive is available 11.export HIVE_HOME=/wishedu/hive-0.13.0-bin 12. 13.#Set the path for where zookeper config dir is 14.#export ZOOCFGDIR=

目前是偽分散式部署的hadoop,暫時不用配置zk,Hbase的匯入匯出詳見hbase章節

  • 2.5. 新增資料庫驅動

    把MySQL的JDBC驅動包複製到Sqoop的lib目錄下

3. sqoop匯入匯出(hdfs)

  • 3.1. 匯入
  • 3.1.1. 普通匯入

sqoop import --connect jdbc:mysql://192.168.1.101:3306/mysql --username root --password root --table user --columns ‘name, age’ –m 1 <表沒有主鍵時,需要指定map數量為1>

  • 3.1.2. 指定輸出路徑、指定資料分隔符

sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --table user --target-dir ‘/sqoop/d1’ --fields-terminated-by '\t’

  • 3.1.3. 指定Map數量 -m

sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --table user --target-dir ‘/sqoop/d1’ --fields-terminated-by ‘\t’ -m 2

  • 3.1.4. 增加where條件

`sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --table user --where ‘age>20’ --target-dir '/sqoop/d1’

  • 3.1.5. 使用query語句

sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --query ‘SELECT * FROM user where age > 20 AND $CONDITIONS’ --split-by user.age --target-dir ‘/sqoop/d1’
使用query語句必須指定split-by和–target-dir

  • 3.1.6. 使用 \將語句換行
    >sqoop import
    –connect jdbc:mysql://192.168.1.101:3306/test
    –username root
    –password root
    –query ‘SELECT * FROM user where age > 20 AND $CONDITIONS’
    –split-by user.age
    –target-dir '/sqoop/d1’
  • 3.1.7. 增量匯入
    1、根據id

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --target-dir ‘/sqoop/user’ --incremental append --check-column id --last-value 10 -m 1
–incremental append選項使用append模式,
–check-column id 使用id欄位來做增量
–last-value為10,從MySQL表中主鍵id>10開始同步。

`2、根據時間戳`

–incremental lastmodified --check-column last_update --last-value '2017-03-20 11:00:00’

3.2. 匯出

先建好相對應的表,才能匯出
sqoop export --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --export-dir ‘/sqoop/testdata/user’ --table user -m 1 --fields-terminated-by '\t’

4. sqoop匯入匯出(hive)

  • 4.1. 匯入
  • 4.1.1. 普通匯入

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import –m 1
內部執行實際分三部,1.將資料匯入hdfs(可在hdfs上找到相應目錄),2.建立hive表名相同的表,3,將hdfs上資料匯入hive表中

  • 4.1.2. 建立hive表

sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-table user123 --fields-terminated-by "\t"

  • 4.1.3. 指定hive表名、指定資料分隔符

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-table user123 --fields-terminated-by '\t’

  • 4.1.4. 通過create-hive-table建立表

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --create-hive-table --hive-table user123 --fields-terminated-by ‘\t’
可以通過 --create-hive-table 建立表,如果表已經存在則會執行失敗
如果提示目錄已存在,可以在匯入指令碼後面追加:–delete-target-dir

  • 4.1.5. 覆蓋hive表的內容

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-overwrite --hive-table user123 --fields-terminated-by '\t’

  • 4.1.6. 增加where條件

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --where ‘age>20’ --hive-import --hive-table user123 --fields-terminated-by '\t’

  • 4.1.7. 指定編碼格式

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --where ‘age>20’ --hive-import --hive-table user123 --fields-terminated-by ‘\t’ --default-character-set=utf-8

  • 4.1.8. 使用query語句

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --query ‘select * from user where age>30 and $CONDITIONS’ --hive-import --hive-table user123 --fields-terminated-by ‘\t’ --target-dir ‘/sqoop/user123’ --split-by user.age
使用query語句必須指定split-by和–target-dir

  • 4.1.9. 增量匯入
    1、根據id

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-table user123 --incremental append --check-column id --last-value 11 --fields-terminated-by '\t’

2、根據時間戳

通過時間戳來增量匯入的指令碼:
–incremental lastmodified --check-column last_update --last-value ‘2017-03-20 11:00:00’
完整指令碼:

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-table user123 --incremental lastmodified --check-column last_update --last-value ‘2017-03-20 11:00:00’ --fields-terminated-by '\t’

4.2. 匯出

sqoop export --connect jdbc:mysql://localhost:3306/test-username root --password root --export-dir ‘/user/hive/warehouse/user123’ --table user -m 1 --fields-terminated-by '\t’

5. sqoop job指令

5.1. 相關命令:

bin/sqoop job
bin/sqoop-job

5.2. 基本用法:

bin/sqoop job --create 建立job
bin/sqoop job --delete 刪除job
bin/sqoop job --exec 執行job
bin/sqoop job --show 顯示job
bin/sqoop job --list 列出job

`5.3. 建立和執行job`

建立job(注意:-- import之間需要空格)
sqoop job --create synuser – import --connect jdbc:mysql://localhost:3306/test --username root -P --table user --target-dir ‘/sqoop/ d2’ -m 1
建立了job,id為“synuser”,它是將MySQL資料庫test中的user表同步hdfs中。然後我們根據這個job的id去查詢job詳細配置情況:
bin/sqoop job --show synuser
我們可以通過job的id來執行job:
bin/sqoop job --exec synuser

5.4. 安全配置

預設情況下,建立的每個job在執行的時候都不會進行安全的認證。如果我們希望限制指定的sqoop job的執行,只有經過認證以後才能執行,這時候可以使用sqoop job的安全選項。Sqoop安裝目錄下,通過修改配置檔案conf/sqoop-site.xml可以對job進行更高階的配置。實際上,我們使用了Sqoop的metastore工具,它能夠對Sqoop進行細粒度的配置。
我們要將MySQL資料庫中的資料同步到Hive表,每次執行sqoop job都需要輸入訪問MySQL資料庫的連線賬號資訊,可以設定sqoop.metastore.client.record.password的值為true。如果在conf/sqoop-site.xml中增加如下配置,會將連線賬號資訊儲存到Sqoop的metastore中:

1.<property> 2. <name>sqoop.metastore.client.record.password</name> 3. <value>true</value> 4. <description>If true, allow saved passwords in the metastore. </description> 5.</property>

5.5. 定時任務
在實際開發運維過程,我們常常要定時執行匯入指令碼,可以使用crontab來製作定時任務:
crontab -e
0 */1 * * * sqoop job --exec synuser > sqoop_synuser.log 2>&1 &