<關於數據倉庫>基於docker的Mysql與Hadoop/Hive之間的數據轉移 (使用Apache Sqoop™)

原創博客,轉載請聯繫博主!html

 

摘要:本文介紹瞭如何使用docker快速搭建一個能夠從外部訪問的mysql服務容器,和由docker搭建的分佈式Hadoop文件系統,而且使用ApacheSqoop完成將mysql中的關係型數據庫轉移到導入到hadoop文件系統之中,以及過程當中遇到的一些問題及解決辦法,一些爲了不錯誤要注意的細節!一轉眼又是半個學期了,順便感慨下時間過的好快呀..java

 

再閱讀以前你須要先 安裝docker,我使用的是centos7,安裝docker能夠直接經過mysql

  yum -y install docker-iolinux

fedora/RHEL及其它使用yum做爲包管理工具的均可以這樣一步到位,其餘distribu的linux安裝過程能夠經過下面的連接學習:git

UbuntuDebianFreeBSD...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已經完成了!

 

若是有疑問歡迎留言,博主會盡快回答!

相關文章
相關標籤/搜索