原創博客,轉載請聯繫博主!html
摘要:本文介紹瞭如何使用docker快速搭建一個能夠從外部訪問的mysql服務容器,和由docker搭建的分佈式Hadoop文件系統,而且使用ApacheSqoop完成將mysql中的關係型數據庫轉移到導入到hadoop文件系統之中,以及過程當中遇到的一些問題及解決辦法,一些爲了不錯誤要注意的細節!一轉眼又是半個學期了,順便感慨下時間過的好快呀..java
再閱讀以前你須要先 安裝docker,我使用的是centos7,安裝docker能夠直接經過mysql
yum -y install docker-iolinux
fedora/RHEL及其它使用yum做爲包管理工具的均可以這樣一步到位,其餘distribu的linux安裝過程能夠經過下面的連接學習:git
Ubuntu,Debian,FreeBSD...github
一. 用Docker搭建Mysql服務,並經過遠程訪問web
參考Github Repository:https://github.com/docker-library/docs
redis
這是docker官方的docker-library其中有對各類數據庫系統包括spark,redis,mongo等官方鏡像的使用方法介紹。sql
首先須要拉取官方的DockerHub鏡像docker
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已經完成了!
若是有疑問歡迎留言,博主會盡快回答!