[HBase導(dǎo)入SQL Server數(shù)據(jù)庫(kù)數(shù)據(jù)]
在先前的幾篇隨筆中已經(jīng)介紹了Hadoop驻债、Zookeeper矗愧、Hbase的分布式框架搭建方案柱徙,目前已經(jīng)搭建完成了一個(gè)包含11個(gè)節(jié)點(diǎn)的分布式集群席怪。而對(duì)于HBase數(shù)據(jù)庫(kù)的使用僅限于測(cè)試性質(zhì)的增刪改查指令澎粟,為了進(jìn)一步熟悉分布式框架的使用蛀序,本文介紹將已有的數(shù)據(jù)從關(guān)系型數(shù)據(jù)庫(kù)SQL Server中導(dǎo)入到HBase中的方法。
要完成從關(guān)系型數(shù)據(jù)庫(kù)到HBase數(shù)據(jù)的遷移活烙,我們需要使用Sqoop工具徐裸,Sqoop是Apache的一個(gè)獨(dú)立項(xiàng)目,設(shè)計(jì)目的即是在Hadoop(Hive)和傳統(tǒng)數(shù)據(jù)庫(kù)(MySQL啸盏、postgresql)之間進(jìn)行數(shù)據(jù)的傳遞倦逐。Sqoop工具基于數(shù)據(jù)倉(cāng)庫(kù)工具Hive,通過(guò)Hive來(lái)將數(shù)據(jù)查詢轉(zhuǎn)換成MapReduce任務(wù)實(shí)現(xiàn)數(shù)據(jù)的傳遞宫补。因此檬姥,要完成本次數(shù)據(jù)的遷移,我們需要以下幾個(gè)準(zhǔn)備:
①Hive:apache-hive-2.1.1-bin.tar.gz
②Sqoop:sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
③JDBC for SQL Server:sqljdbc_3.0.1301.101_enu.tar.gz
④Connector between SQL Server and Sqoop:sqoop-sqlserver-1.0.tar.gz
======================以下所有操作均在Master主機(jī)上并且以root用戶執(zhí)行======================
1粉怕、安裝Hive
①建立hive目錄
cd /home
mkdir hive
②解壓安裝包(安裝包移至/home/hive下)
tar -zxvf apache-hive-2.1.1-bin.tar.gz
③設(shè)置環(huán)境變量
vi /etc/profile
追加以下:
export HIVE_HOME=/home/hive/apche-hive-2.1.1-bin
export PATH=$HIVE_HOME/bin:$PATH
export PATH
追加以下:
export HCAT_HOME=$HIVE_HOME/hcatalog
④使配置生效
source /etc/profile
2健民、安裝sqoop
①建立sqoop目錄
cd /home
mkdir sqoop
②解壓安裝包(安裝包移至/home/sqoop下)
tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
③設(shè)置環(huán)境變量
vi /etc/profile
追加以下:
export SQOOP_HOME=/home/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha
export SQOOP_CONF_DIR=$SQOOP_HOME/conf
export PATH=$SQOOP_HOME/bin:$PATH
export PATH
④使配置生效
source /etc/profile
3、配置JDBC
①解壓(位置隨意)
tar -zxvf sqljdbc_3.0.1301.101_enu.atr.gz
②復(fù)制jdbc到sqoop下
cp sqljdbc_3.0/enu/sqljdbc4.jar /home/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/lib
4贫贝、配置SQL Server sqoop Connector
①解壓(位置隨意秉犹,這里是/home)
tar -zxvf sqoop-sqlserver-1.0.tar.gz
②設(shè)置環(huán)境變量
vi /etc/profile
追加以下:
export MSSQL_CONNECTOR_HOME=/home/sqoop-sqlserver-1.0/
配置生效:
source /etc/profile
③配置到sqoop
cd sqoop-sqlserver-1.0
./install.sh
5蛉谜、 配置sqoop
存在這部分工作的原因是sqoop的默認(rèn)配置會(huì)有一些我們不需要用到的東西,在其配置文件$SQOOP_HOME/bin/configure-sqoop文件中崇堵,定義了許多需要預(yù)先配置的參數(shù)與環(huán)境型诚,有些我們已經(jīng)配置完成,但是另外有些是不需要用到的(目前還沒(méi)意識(shí)到有什么作用)鸳劳,因此狰贯,為了防止運(yùn)行時(shí)檢查配置不通過(guò),我們直接的處理辦法就是取消這部分的配置檢查赏廓。
注釋ACCUMULO相關(guān)配置:在configure-sqoop文件中涵紊,注釋掉與ACCUMULO_HOME相關(guān)的所有命令行,并保存退出幔摸。
6摸柄、目前的環(huán)境變量
值得注意的是,之前并沒(méi)有加入HBase的環(huán)境變量既忆,在這里是需要把HBase相關(guān)的環(huán)境變量加入的驱负。
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># /etc/profile
System wide environment and startup programs, for login setup # Functions and aliases go in /etc/bashrc
It's NOT a good idea to change this file unless you know what you # are doing. It's much better to create a custom.sh shell script in # /etc/profile.d/ to make custom changes to your environment, as this # will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
:"$1":)
;; *) if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else PATH=$1:$PATH fi
esac
} if [ -x /usr/bin/id ]; then if [ -z "$EUID" ]; then # ksh workaround
EUID=id -u
UID=id -ru
fi
USER="id -un
"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER" fi
Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
pathmunge /sbin after
fi
HOSTNAME=/bin/hostname 2>/dev/null
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
By default, we want umask to get set. This sets it for login shell
Current threshold for system reserved uid/gids is 200
You could check uidgid reservation validity in
/usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "id -gn
" = "id -un
" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/.sh ; do
if [ -r "$i" ]; then
if [ "${-#i}" != "$-" ]; then
. "$i"
else . "$i" >/dev/null 2>&1 fi
fi
done
unset i
unset -f pathmunge
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin #hadoop
export HADOOP_HOME=/home/hadoop/hadoop-2.7.3 export PATH=$PATH:$HADOOP_HOME/sbin
export PATH=$PATH:$HADOOP_HOME/bin #zookeeper
export ZOOKEEPER_HOME=/home/zookeeper/zookeeper-3.4.6/ export PATH=$ZOOKEEPER_HOME/bin:$PATH export PATH #HBase
export HBASE_HOME=/home/hbase/hbase-1.2.4 export PATH=$HBASE_HOME/bin:$PATH export PATH #hive
export HIVE_HOME=/home/hive/apache-hive-2.1.1-bin
export PATH=$HIVE_HOME/bin:$PATH export PATH
export HCAT_HOME=$HIVE_HOME/hcatalog #sqoop
export SQOOP_HOME=/home/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha
export SQOOP_CONF_DIR=$SQOOP_HOME/conf
export PATH=$SQOOP_HOME/bin:$PATH export PATH
export MSSQL_CONNECTOR_HOME=/home/sqoop-sqlserver-1.0/</pre>
7、數(shù)據(jù)遷移實(shí)驗(yàn)
在執(zhí)行遷移命令之前患雇,需要在Hbase中建立好對(duì)應(yīng)的表
#hbase shell
進(jìn)入hbase shell后執(zhí)行
>create 'test', 'cf'
然后在Terminal中執(zhí)行
#sqoop import --connect 'jdbc:sqlserver://<IP Address>;username=<username>;password=<password>;database=<database>' --table <sql server table name> --hbase-table <hbase table name> --column-family <hbase table column family name> --hbase-row-key <sql server table primary key>
需要注意:
①如果SQL Server的表是正常的單一主鍵的表結(jié)構(gòu)电媳,那么可以直接指定hbase-row-key執(zhí)行上述命令,此時(shí)該命令會(huì)默認(rèn)以多個(gè)mapreduce任務(wù)執(zhí)行該指令
②如果SQL Server的表是聯(lián)合主鍵庆亡,那么這樣導(dǎo)入就會(huì)存在一個(gè)問(wèn)題,無(wú)法根據(jù)主鍵分解查詢?nèi)蝿?wù)捞稿,也就沒(méi)有辦法進(jìn)行MapReduce又谋,那么此時(shí)必須指定參數(shù) '-m 1'只用一個(gè)mapreduce任務(wù)
③針對(duì)沒(méi)有主鍵的情況,若數(shù)據(jù)量巨大娱局,必須分為多個(gè)mapreduce任務(wù)彰亥,那么需要找到一個(gè)拆分字段,從而hive可以根據(jù)該字段拆分任務(wù)衰齐。此時(shí)我們須在導(dǎo)入指令中添加'--split-by <id>'
在我實(shí)際的操作中任斋,SQL Server中的表結(jié)構(gòu)是聯(lián)合主鍵,第一次導(dǎo)入表中100條數(shù)據(jù)記錄耻涛,根據(jù)這篇博客的介紹废酷,配置了$SQOOP_HOME/conf/sqoop-site.xml,我指定了'--hbase-row-key <id1>,<id2>'抹缕,并指定'-m 1'澈蟆,導(dǎo)入數(shù)據(jù)成功。(耗時(shí)22sec)
第二次嘗試將數(shù)據(jù)庫(kù)中的近160W條數(shù)據(jù)記錄導(dǎo)入到HBase中卓研,添加參數(shù)'--split-by <id>'趴俘,并指定'-m 12'睹簇,數(shù)據(jù)同樣導(dǎo)入成功。(耗時(shí)17min25sec)
8寥闪、存在問(wèn)題
對(duì)sqoop拆分任務(wù)的理解仍然不夠深入太惠,自己完成的實(shí)驗(yàn)雖然成功,但是并沒(méi)有做對(duì)比實(shí)驗(yàn)確定真正的影響因素
9疲憋、參考文章
利用SQOOP將數(shù)據(jù)從數(shù)據(jù)庫(kù)導(dǎo)入到HDFS - 我喂自己袋鹽 - 博客頻道 - CSDN.NET
Sqoop將SQLServer數(shù)據(jù)導(dǎo)入HBase - nma_123456的專欄 - 博客頻道 - CSDN.NET
Centos 利用sqoop從sqlserver導(dǎo)入數(shù)據(jù)到HDFS或Hive - 王偉挺的專欄 - 博客頻道 - CSDN.NET
sqoop并行導(dǎo)入數(shù)據(jù) - 東杰書屋 - 博客頻道 - CSDN.NET
sqoop針對(duì)聯(lián)合主鍵的表導(dǎo)入hbase的簡(jiǎn)單控制技巧 - 黃剛的技術(shù)博客 - 博客頻道 - CSDN.NET