原創博客,轉載請聯系博主!
摘要:本文介紹了如何使用docker快速搭建一個可以從外部訪問的mysql服務容器,和由docker搭建的分布式Hadoop文件系統,並且使用ApacheSqoop完成將mysql中的關系型數據庫轉移到導入到hadoop文件系統之中,以及過程中遇到的一些問題及解決辦法,一些為了避免錯誤要注意的細節!一轉眼又是半個學期了,順便感慨下時間過的好快呀..
再閱讀之前你需要先 安裝docker,我使用的是centos7,安裝docker可以直接通過
yum -y install docker-io
fedora/RHEL及其它使用yum作為包管理工具的都可以這樣一步到位,其他distribu的linux安裝過程可以通過下面的鏈接學習:
一. 用Docker搭建Mysql服務,並通過遠程訪問
參考Github Repository:https://github.com/docker-library/docs
這是docker官方的docker-library其中有對各種數據庫系統包括spark,redis,mongo等官方鏡像的使用方法介紹。
首先需要拉取官方的DockerHub鏡像
docker pull mysql:latest
或者你可以直接下載下來Dockerfile和entrypoint.sh腳本來構建一個 mysql鏡像(5.6)

這里個人不推薦直接git clone下來整個龐大的docker-library,不如直接在瀏覽器上復制粘貼下來Dockerfile和entrypoint.sh的內容,之后進入Dockerfile所在的目錄使用下面docker命令:
docker build .
關於Docker各種命令及參數的用法細節個人,個人推薦一個鏈接,請見 這里。
之后使用 docker images 來檢查鏡像之中是否存在mysql的鏡像,如果存在,那么恭喜你離搭建一個完整的mysql服務只差一步之遙了。
最后創建docker容器完成mysql服務的搭建:
$ docker run --name mysql_serv -e MYSQL_ROOT_PASSWORD=mysqlpassword -d mysql:latest
或者你想要這個容器搭建的mysql服務可以從外部訪問,就使用-p選項添加一個端口映射的規則,如將容器的mysql遠程登陸端口3306映射為30000:
$ docker run -p 30000:3306--name mysql_serv -e MYSQL_ROOT_PASSWORD=mysqlpassword -d mysql:latest # 這里注意-p選項一定不能放在mysql:latest后面,不然不會有什么端口映射'-p 30000:3306'會直接作為cmd參數給容器啟動!
(其中-e選項代表export 代表運行時使用-e后定義的環境變量 -d選項代表deamon指這個容器會在后台運行,和shell中的'&'很類似)

再使用:
$ docker exec -t -i mysql_serv /bin/bash
(其中-t和-i選項代表我們執行的進程創建了一個新的TTY並捕捉STDIN,即‘新建一個TTY並登入到這個容器之中’這和docker attach.. 有很大的區別)
之后我們就可以從外部登錄我們的mysql服務了,容器通過端口映射實現了一個類似反向代理的服務!
二. 用docker搭建hadoop分布式文件系統
下面關於搭建Hadoop-docker的過程參考 原作者的文章。想了解具體原理的同學請參考作者原文,這里就給出“傻瓜式”完成搭建的過程:
首先拉取下面幾個DockerHub鏡像,這些鏡像已經是成型的Hadoop節點:
(1) 拉取DockerHub中成型的Hadoop鏡像
sudo docker pull index.alauda.cn/kiwenlau/hadoop-master:0.1.0 sudo docker pull index.alauda.cn/kiwenlau/hadoop-slave:0.1.0 sudo docker pull index.alauda.cn/kiwenlau/hadoop-base:0.1.0 sudo docker pull index.alauda.cn/kiwenlau/serf-dnsmasq:0.1.0
(2) 修改鏡像的tag
sudo docker tag d63869855c03 kiwenlau/hadoop-slave:0.1.0 sudo docker tag 7c9d32ede450 kiwenlau/hadoop-master:0.1.0 sudo docker tag 5571bd5de58e kiwenlau/hadoop-base:0.1.0 sudo docker tag 09ed89c24ee8 kiwenlau/serf-dnsmasq:0.1.0
(3) 下載啟動hadoop鏡像的shell腳本
git clone https://github.com/kiwenlau/hadoop-cluster-docker
(4) 運行容器腳本
./hadoop-cluster-docker/start-container.sh
正常運行后的結果如下:

(5) 附加:搭建N節點的Hadoop集群(可選)
#重新配置容器參數,N為hadoop集群大小,下面默認N=5 ./resize-cluster.sh 5 #啟動容器 ./start-container 5
(6) 啟動Hadoop(相當於編譯后的hadoop的start-all.sh腳本)
# 進入master的交互界面后(ssh和docker exec..均可) ./start-hadoop.sh
運行一次wordcount測試腳本(run-wordcount.sh)后正常的結果如下所示:

到這里hadoop集群就搭建完成了!
三. 構建Hive數據庫
首先我們要登錄hadoop的master節點:
docker exec -i -t master /bin/bash
配置Hive數據庫
(到這里docker的hadoop節點都是可以訪問外網的,我們直接下載並配置hive到master上)
#選擇一個合適的目錄並下載hive-binary包,注意要下載bin包而非src包 wget http://www.eu.apache.org/dist/hive/hive-1.2.1/apache-hive-1.2.1-bin.tar.gz
下載完成進行解壓:
#這里注意下載到的格式后綴最好為.tar.gz tar xzvf xxxx.tar.gz
然后將hive的環境變量配置好:
#進入hive的主目錄下 echo "export HIVE_HOME=$(pwd)" >> /etc/profile echo "export PATH=\$PATH:\$HIVE_HOME/bin">>/etc/profile
echo "export HIVE_CONF_DIR=\$HIVE_HOME/conf">>/etc/profile source /etc/profile
(重要)因為$HADOOP_HOME/share/hadoop/yarn/lib中的jline-x.x.x.jar版本太低用$HIVE_HOME/lib中的jline-x.x.x.jar進行代替:
#替代hadoop中的低版本jline.x.x.x.jar #需要環境變量 $HADOOP_HOME 和 $HIVE_HOME jline_hadoop_path=$HADOOP_HOME/share/hadoop/yarn/lib/$(ls $HADOOP_HOME/share/hadoop/yarn/lib|grep jline) jline_hive_path=$HIVE_HOME/lib/$(ls $HIVE_HOME/lib|grep jline) cp $jline_hive_path $HADOOP_HOME/share/hadoop/yarn/lib/ rm $jline_hadoop_path
然后直接輸入'hive'啟動hive,結果如下圖所示:

到這里hive的安裝配置就完成了!
四. Apache Sqoop的安裝及配置
(1)首先下載Apache Sqoop
官網FTP站為:http://www.us.apache.org/dist/sqoop/1.4.6/
這里還要注意由於Docker鏡像中的Hadoop節點中版本為:

這里Hadoop2以上的版本必須使用Sqoop2以上的版本才可以正常運行,千萬不要弄錯了,不然后面會很麻煩。
注意要下載1.4.6版本,不要下載官網推薦最新的1.9.x版本,這里使用的是:http://www.us.apache.org/dist/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
#下載sqoop腳本
#以下文件的名字請根據實際修改 mkdir ~/sqoop cd ~/sqoop wget http://www.us.apache.org/dist/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz tar zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
進入sqoop的主目錄進行一些修改:
#配置環境變量 echo "export SQOOP_HOME=$(pwd)" >>/etc/profile echo "export PATH=\$PATH:\$SQOOP_HOME/bin">>/etc/profile source /etc/profile #將sqoop-1.4.6.jar放入$SQOOP_HOME/lib不然接下來會報錯(不信你試試= =) cp sqoop-1.4.6.jar $SQOOP_HOME/lib/
之后進入$SQOOP_HOME/conf進行一些配置:
#重命名文件 mv sqoop-env-template.sh sqoop-env.sh
之后修改sqoop-env.sh中的內容,將里面被注釋掉的HADOOP_COMMON_HOME,HADOOP_MAPRED_HOME改為和HADOOP_HOME一致,再寫好HIVE_HOME,如下所示:
最后直接運行'sqoop‘,會出現一些WARNING,但是沒有關系忽略掉他們,你的sqoop已經配置完成了!
五. 使用Apache Sqoop進行Mysql的表->Hive的表的轉移
到這里就可以自由發揮了,比如我們在mysql中創建一個testdb,再創建一張testtable:
drop database testdb;
create database testdb;
use testdb;
create table testtable(
id char(10) primary key,
name char(10) not null
);
insert into testtable(id,name) values('00000','kimmin');
insert into testtable(id,name) values('00001','kimmin1');
insert into testtable(id,name) values('00002','kimmin2');
insert into testtable(id,name) values('00003','kimmin3');
因為這里我們要和mysql之間溝通數據,所以要在$SQOOP_HOME/lib下面添加mysql的jdbc橋接包:
我這里上傳了一份mysql的jdbc-connector包,由於格式限制,請大家wget到master容器后手動在后綴名從.rar改成.jar!
然后在master容器中使用命令:(執行之前請確認使用hive創建了數據庫hivedb:create database hivedb)
sqoop import --connect jdbc:mysql://172.17.0.3:3306/testdb --username root --password dbpassword --table testtable --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --hive-overwrite --create-hive-table --hive-table hivedb.testtable --delete-target-dir
關於sqoop的其它用法個人推薦這篇博客:http://segmentfault.com/a/1190000002532293#articleHeader8
這里得用mysql容器的虛擬私有ip來進行連接,所以端口自然也用容器的虛擬端口3306,而非外部映射的端口,轉移成功結果如下:

進入hive檢查結果:

到此為止,使用sqoop將數據從mysql轉移到hive已經完成了!
如果有疑問歡迎留言,博主會盡快回答!

