Sqoop數據遷移:
什麼是sqoop?
sqoop是用在Hadoop和關係數據庫之間傳輸數據的工具
- 將數據從RDBMS導入到HDFS
- HDFS導出數據RDBMS
- 使用MapReduce導入和導出數據,提供並行操作和容錯
從RDBMS導入數據到HDFS-1
-
導入表到HDFS
sqoop import connect jdbc:mysql://localhost:3306/hr driver com.mysql.jdbc.
Sqoop安裝:
第一步: sqoop解壓
將sqoop壓縮包放到/opt目錄文件下
tar -zxf sqoop-1.4.6-cdh5.14.2.tar.gz
mv sqoop-1.4.6-cdh5.14.2 /opt/soft/sqoop146
第二步: 複製hadoop的jar包和連接mysql驅動包到sqoop的lib文件夾下
cp /opt/soft/hadoop260/share/hadoop/common/hadoop-common-2.6.0-cdh5.14.2.jar /opt/soft/sqoop146/lib/
cp /opt/soft/hadoop260/share/hadoop/hdfs/hadoop-hdfs-2.6.0-cdh5.14.2.jar /opt/soft/sqoop146/lib/
cp /opt/soft/hadoop260/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.0-cdh5.14.2.jar /opt/soft/sqoop146/lib
第三步: 配置sqoop-env.sh文件
vi /opt/soft/sqoop146/conf/sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/soft/hadoop260
export HAOOP_MAPRED_HOME=/opt/soft/hadoop260
export HABSE_HOME=/opt/soft/hbase120
export HIVE_HOME=/opt/soft/hive110
export ZOOCFGDIR=/opt/soft/zk345/conf
第四步: 配置全局變量
vi /etc/profile
export SQOOP_HOME=/opt/soft/sqoop146
export PATH=$PATH:$SQOOP_HOME/bin
source /etc/profile
完成`Sqoop安裝
Sqoop命令:
sqoop list命令
–顯示數據庫名
sqoop list-databases --username root --password root --connect jdbc:mysql://192.168.43.24:3306/
sqoop list-tables --username root --password root --connect jdbc:mysql://192.168.43.24:3306/
sqoop import命令
–將關係型數據導入到HDFS上
- 將整表導入hdfs上
# 加\是爲了多行輸入
sqoop import \
--connect jdbc:mysql://192.168.56.101:3306/mydemo \
--username root --password 123456 \
--incremental append \ # 增量導入方式append追加數據至已經存在的HDFS數據集上
--check columns
--delete-target-dir \ # 存在文件夾就刪除
--table userinfos \
--target-dir /tmp/viewscore6 \ # 導入到hdfs的文件位置
--fields-terminated-by '/' \ # 在hdfs上以對應的空格符
-m 3
- 將查詢好的數據導入到hdfs上
sqoop import \
--connect jdbc:mysql://192.168.56.101:3306/mydemo \
--username root --password 123456 \
--query "select * from xxx where xxx and \$CONDITITONS" \
--target-dir /tmp/viewscore4 \
--fields-terminated-by ',' \
--split by usrid \ # 堆某一列進行設定邏輯分片的規則,通過hash值劃分邏輯片
-m 3 # 設置mapper的數量,也就是文件分片的數量
--as sequencefile # 將其轉化爲序列化文件
connect jdbc:oracle:thin:@192.168.56.101:1521:ORCL # oracle 的遷移驅動包名爲oracle.jdbc.OracleDriver
增量將數據遷移到HBase上,並在Hive上做分析:
寫出mysql數據導入HBase的腳本:
! /bin/bash
#獲取當前日期
nowdate=$(date --date='1 day ago' "+%Y-%m-%d")
echo $nowdate
# 如果存在mydata,就刪除沒有8位數字的文件夾
hdfs dfs -test -e /mydata1
if [ $? -eq 0 ];then
files=`hdfs dfs -ls /mydata1 | awk '{print $8}'| cut -d '/' -f3 | grep -v "[0-9]\{4\}"`
for fl in $files
do
hdfs dfs -rmr /mydata1/$fl
done
else
hdfs dfs -mkdir -p /mydata1/
fi
#sqoop執行路徑
#連接配置
# 將mysql數據導入hdfs
foldername=`echo $nowdate | sed 's/-//g'`
sqoop import \
--connect jdbc:mysql://192.168.56.101:3306/mydemo \
--driver com.mysql.jdbc.Driver \
--username root --password 123456 \
--query "select * from myorder where orderdate="\'${nowdate}\'" and \$CONDITIONS"
--incremental append \
--check-column orderdate \
--target-dir /mydata1/$foldername -m 1
Hive中建立外部表將地址指向對應HBase在HDFS存放的地址
create external table myhbtab(
kw string,
stuno string,
username string,
age string,
likes string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping"=":key,base:stuno,base:username,base:age,externals:likes")
tblproperties("hbase.table.name"="mydemo:userinfos");