[toc]
創(chuàng)新互聯(lián)建站10多年企業(yè)網(wǎng)站建設(shè)服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及高端網(wǎng)站定制服務(wù),企業(yè)網(wǎng)站建設(shè)及推廣,對(duì)成都生料攪拌車等多個(gè)行業(yè)擁有豐富的網(wǎng)站運(yùn)維經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。
SQOOP ---數(shù)據(jù)搬用工
可以將外部數(shù)據(jù)遷移到hdfs目錄或者h(yuǎn)ive表或者h(yuǎn)base表
從傳統(tǒng)數(shù)據(jù)庫(kù)獲取元數(shù)據(jù)信息(schema、table、field、field type),把導(dǎo)入功能轉(zhuǎn)換為只有Map的Mapreduce作業(yè),
在mapreduce中有很多map,每個(gè)map讀一片數(shù)據(jù),進(jìn)而并行的完成數(shù)據(jù)的拷貝。
獲取導(dǎo)出表的schema、meta信息,和Hadoop中的字段match;多個(gè)map only作業(yè)同時(shí)運(yùn)行,完成hdfs中數(shù)據(jù)導(dǎo)出到關(guān)系型數(shù)據(jù)庫(kù)中。
下載地址:https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/1.4.7/
下載之后進(jìn)行解壓:
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /home/uplooking/app
重命名:
[uplooking@uplooking01 ~]$ mv app/sqoop-1.4.7.bin__hadoop-2.6.0/ app/sqoop
配置SQOOP_HOME到環(huán)境變量中
export SQOOP_HOME=/home/uplooking/app/sqoop
export PATH=$PATH:$SQOOP_HOME
配置$SQOOP_HOME/conf/sqoop-env.sh
export HADOOP_COMMON_HOME=/home/uplooking/app/hadoop
export HADOOP_MAPRED_HOME=/home/uplooking/app/hadoop
export HBASE_HOME=/home/uplooking/app/hbase
export HIVE_HOME=/home/uplooking/app/hive
export ZOOCFGDIR=/home/uplooking/app/zookeeper/conf
下面這個(gè)在1.4.7中需要配置,否則在執(zhí)行數(shù)據(jù)導(dǎo)入到hive時(shí)會(huì)報(bào)錯(cuò)
export HIVE_CONF_DIR=/home/uplooking/app/hive/conf
注意:
1、數(shù)據(jù)庫(kù)驅(qū)動(dòng):
在執(zhí)行sqoop命里的受需要拷貝相關(guān)數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar包到$SQOOP_HOME/lib目錄下,例如MySQL需要mysql-connector-java-5.1.32-bin.jar以上版本支持。
2、JDK版本
JDK版本最好1.7以上。
3、hive的核心包拷貝(這個(gè)在1.4.7中需要配置,否則在執(zhí)行數(shù)據(jù)導(dǎo)入到hive時(shí)會(huì)報(bào)錯(cuò))
將$HIVE_HOME/lib/hive-exec.jar拷貝到$SQOOP_HOME/lib目錄下,不然會(huì)報(bào)
18/03/15 15:50:54 ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.
18/03/15 15:50:54 ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
people表中的數(shù)據(jù):
+----+-----------+------+--------+
| id | name | age | height |
+----+-----------+------+--------+
| 1 | 小甜甜 | 18 | 168 |
| 2 | 小丹丹 | 19 | 167 |
| 3 | 大神 | 25 | 181 |
| 4 | 團(tuán)長(zhǎng) | 38 | 158 |
| 5 | 記者 | 22 | 169 |
+----+-----------+------+--------+
數(shù)據(jù)導(dǎo)入:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people
將msyql數(shù)據(jù)test中的表people,導(dǎo)入到hdfs目錄,該目錄在/user/用戶/people下面,其中people為導(dǎo)入的表名,
這是sqoop導(dǎo)入到的默認(rèn)目錄,如果要想導(dǎo)入到指定的目錄,添加一個(gè)選項(xiàng)--target-dir:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people
因?yàn)槟J(rèn)執(zhí)行sqoop會(huì)有4個(gè)maptasks任務(wù),為了滿足業(yè)務(wù)的需要,可以進(jìn)行修改,只需要在命令后面加一個(gè)選項(xiàng)-m:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people -m 2
執(zhí)行的過(guò)程中,如果輸出目錄已經(jīng)存在,報(bào)錯(cuò),要想輸出到該目錄 使用選項(xiàng)--delete-target-dir:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people -m 2 --delete-target-dir
如果想在原來(lái)的基礎(chǔ)之上追加新的數(shù)據(jù),只需要添加一個(gè)選項(xiàng)--append,但是注意,--append和--delete-target-dir不能同時(shí)存在:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people -m 2 --append
條件導(dǎo)入:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir hdfs://ns1/input/sqoop/people --append -m 1 --where "age < 20 and height > 167"
通過(guò)sql導(dǎo)入:
#!/bin/bash
SQOOP_HOME=/home/uplooking/app/sqoop
sqoop import \
--connect jdbc:mysql://192.168.43.116:3306/test \
--username root \
--password root \
--target-dir hdfs://ns1/input/sqoop/people \
--query "select id, name, age, height from people where age < 30 and height > 168 and \$CONDITIONS" \
--append -m 1 \
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username 'root' --password 'root' --table people --hive-import -m 1
覆蓋數(shù)據(jù)(只覆蓋數(shù)據(jù),不覆蓋表結(jié)構(gòu))
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username 'root' --password 'root' --table people --hive-import -m 1 --hive-overwrite
創(chuàng)建表名
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username 'root' --password 'root' --table people --hive-import -m 1 --hive-table "hpeople" --hive-overwrite
導(dǎo)出所有的表到hive中
sqoop import-all-tables --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --hive-import --fields-terminated-by "\001" --lines-terminated-by "\n"
# 這里指定了行和列的分隔符,因?yàn)槟J(rèn)情況下,MySQL導(dǎo)入到hive的數(shù)據(jù)是以逗號(hào)作為分隔符的,
# 數(shù)據(jù)從hive(準(zhǔn)確說(shuō)應(yīng)該是HDFS)導(dǎo)出到mysql時(shí)默認(rèn)也是以逗號(hào)作為列分隔符的,這點(diǎn)尤其需要注意
sqoop import \
--connect jdbc:mysql://192.168.43.116:3306/test \
--username 'root' \
--password 'root' \
--table people \
--hbase-create-table \
--hbase-row-key id \
--hbase-table hpeople \
--column-family cf
導(dǎo)入Hbase的時(shí)候,默認(rèn)使用主鍵做key,沒(méi)有主鍵使用--split-by,暫時(shí)處理不了聯(lián)合主鍵,最好現(xiàn)在hbase中建立相關(guān)的表結(jié)構(gòu)
查看HBase中表的數(shù)據(jù):
hbase(main):002:0> scan 'hpeople'
ROW COLUMN+CELL
1 column=cf:age, timestamp=1521846328316, value=18
1 column=cf:height, timestamp=1521846328316, value=168.0
1 column=cf:name, timestamp=1521846328316, value=\xE5\xB0\x8F\xE7\x94\x9C\xE7\x94\x9C
2 column=cf:age, timestamp=1521846328096, value=19
2 column=cf:height, timestamp=1521846328096, value=167.0
2 column=cf:name, timestamp=1521846328096, value=\xE5\xB0\x8F\xE4\xB8\xB9\xE4\xB8\xB9
3 column=cf:age, timestamp=1521846329182, value=25
3 column=cf:height, timestamp=1521846329182, value=181.0
3 column=cf:name, timestamp=1521846329182, value=\xE5\xA4\xA7\xE7\xA5\x9E
4 column=cf:age, timestamp=1521846328454, value=38
4 column=cf:height, timestamp=1521846328454, value=158.0
4 column=cf:name, timestamp=1521846328454, value=\xE5\x9B\xA2\xE9\x95\xBF
5 column=cf:age, timestamp=1521846330135, value=22
5 column=cf:height, timestamp=1521846330135, value=169.0
5 column=cf:name, timestamp=1521846330135, value=\xE8\xAE\xB0\xE8\x80\x85
5 row(s) in 0.1620 seconds
數(shù)據(jù)導(dǎo)出到mysql,默認(rèn)以逗號(hào)作為分隔符
導(dǎo)出的時(shí)候字段需要一一對(duì)應(yīng)
sqoop export \
--connect jdbc:mysql://192.168.43.116:3306/test \
--username root --password root \
--table people \
--export-dir hdfs://ns1/input/sqoop/people
中文亂碼:
sqoop export \
--connect "jdbc:mysql://192.168.43.116:3306/test?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password root \
--table people \
--export-dir hdfs://ns1/input/sqoop/people
插入或更新
如果存在就更新,不存在就插入(指的是某一條記錄,而不是表本身)
sqoop export
--connect "jdbc:mysql://192.168.43.116:3306/test?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password root \
--table people
--export-dir /export -m 1 \
--update-key id \
--update-mode allowinsert
和導(dǎo)入類似 -input-fields-terminated-by解析HDFS上面的數(shù)據(jù)到數(shù)據(jù)庫(kù)時(shí)使用參數(shù)
sqoop export \
--connect jdbc:mysql://192.168.43.116:3306/test \
--username root \
--password root \
--table people \
--export-dir /user/hive/warehouse/hpeople
--input-fields-terminated-by '\001'
目前沒(méi)有直接從HBase導(dǎo)出的方法,但是可以先將數(shù)據(jù)導(dǎo)出到HDFS中(通過(guò)Hive和HBase的整合),然后再?gòu)腍DFS導(dǎo)出到mysql中。