#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中執行命令
mvsqoop-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 &