1. 程式人生 > >docker部署分散式大資料叢集hadoop、spark、hive、jdk、scala、

docker部署分散式大資料叢集hadoop、spark、hive、jdk、scala、

(一)1 用docker建立映象並搭建三個節點容器的hadoop及spark服務 包括:mysql,hadoop,jdk,spark,hive,scala,sqoop

docker已經安裝並且啟動 #搜尋centos映象: docker search centos

#拉取映象 docker pull centos #若不指定版本會下載latest  最好下載官方映象     如果拉取映象速度太慢可以指定到對應的庫拉取 #docker images 檢視已經建立或者下載的映象 [[email protected] bigdata]# docker images REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE hadoop              latest              9d87f24c74a4        43 hours ago        1.4GB centos7_ssh_1       latest              4aa2376ef3f0        46 hours ago        313MB mysql               5.6                 7edb93321b06        2 days ago          256MB centos              latest              49f7960eb7e4        8 weeks ago         200MB

2 生成帶有SSH功能的centos的映象檔案

為了後面配置各節點之間的SSH免密碼登陸,需要在pull下的centos映象庫種安裝SSH, 這裡利用 Dockerfile 檔案來建立映象

# 目錄可以自定義建立 [[email protected] appcom]# cd app/ [[email protected] app]# ll total 0 drwxr-xr-x. 4 root root 49 Aug  1 23:31 DockerImagesFiles [[email protected] app]# cd DockerImagesFiles/ [[email protected]

DockerImagesFiles]# ll total 4 drwxr-xr-x. 2 root root   31 Aug  2 00:30 centos7_ssh drwxr-xr-x. 2 root root 4096 Aug  2 03:32 hadoop [[email protected] DockerImagesFiles]# pwd /appcom/app/DockerImagesFiles [[email protected] DockerImagesFiles]#

#建立一個存放帶ssh的centos映象Dockerfile檔案的目錄 mkdir -p DockerImagesFiles/centos7_shh

cd centos7_shh

#建立帶ssh的centos的Dockerfile 檔案 vim Dockerfile

#base on image create library FROM centos MAINTAINER luzhen # install ssh RUN yum install -y openssh-server RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config RUN yum install -y openssh-clients

#config root  RUN echo "root:123456" | chpasswd RUN echo "root    ALL=(ALL)    ALL" >> /etc/sudoers #greate ssh key RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

# config ssh serve RUN mkdir /var/run/sshd EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]

:wq 儲存退出

3 根據上面的Dockerfile生成centos7_ssh_1映象

docker build -t="centos7_ssh_1" .     #在當前目錄建立映象,會有一個執行過程

#執行完成後,檢視已安裝的映象庫 docker images #看到當前的映象,會有,mysql,centos,centos7_ssh_1(自己建立)

4 生成Hadoop映象庫檔案 cd /appcom/app/DockerImagesFiles/hadoop

在構建Hadoop映象庫的Dockerfile所在目錄下,上傳已經下載的需要用到的軟體包 [[email protected] hadoop]# pwd /appcom/app/DockerImagesFiles/hadoop [[email protected] hadoop]# ll total 686748 -rw-r--r--. 1 root root  90859180 Aug  2 03:29 apache-hive-1.2.2-bin.tar.gz -rw-r--r--. 1 root root      1406 Aug  2 03:32 Dockerfile -rw-r--r--. 1 root root 210606807 Aug  2 03:27 hadoop-2.7.1.tar.gz -rw-r--r--. 1 root root 185646832 Aug  2 03:27 jdk-8u181-linux-x64.tar.gz -rw-r--r--. 1 root root  28678231 Aug  2 03:27 scala-2.11.8.tgz -rw-r--r--. 1 root root 187426587 Aug  2 03:27 spark-2.0.2-bin-hadoop2.7.tgz 注意:這裡要提前在Dockerfile檔案配置環境變數,如果映象庫構建完成後,在 容器中配置環境變數是不起作用的。 vim Dockerfile #base on centos7_ssh_1 structure FROM centos7_ssh_1 # install java ADD jdk-8u181-linux-x64.tar.gz /home/user_lu/lcal RUN mv /home/user_lu/lcal/jdk1.8.0_181 /home/user_lu/lcal/jdk1.8 #configuration java environment variables ENV JAVA_HOME /home/user_lu/lcal/jdk1.8.0_181 ENV PATH $JAVA_HOME/bin:$PATH #install hadoop ADD hadoop-2.7.1.tar.gz /home/user_lu/lcal RUN mv /home/user_lu/lcal/hadoop-2.7.1 /home/user_lu/lcal/hadoop #configuration hadoop environment variables ENV HADOOP_HOME /home/user_lu/lcal/hadoop-2.7.1 ENV PATH $HADOOP_HOME/bin:$PATH

#install scala note: scala versionn2.11.x for spark version 2.0.2 ADD scala-2.11.8.tgz /home/user_lu/lcal RUN mv /home/user_lu/lcal/scala-2.11.8 /home/user_lu/lcal/scala #configuration scala environment variables ENV SCALA_HOME /home/user_lu/lcal/scala-2.11.8 ENV PATH $SCALA_HOME/bin:$PATH #install spark ADD spark-2.0.2-bin-hadoop2.7.tgz /home/user_lu/lcal RUN mv /home/user_lu/lcal/spark-2.0.2-bin-hadoop2.7 /home/user_lu/lcal/spark #configuration spark environment variables ENV SPARK_HOME /home/user_lu/lcal/spark-2.0.2-bin-hadoop2.7 ENV PATH $SPARK_HOME/bin:$PATH

#install hive ADD apache-hive-1.2.2-bin.tar.gz /home/user_lu/lcal RUN mv /home/user_lu/lcal/apache-hive-1.2.2-bin /home/user_lu/lcal/hive

#config hive environ variables ENV HIVE_HOME /home/user_lu/lcal/apache-hive-1.2.2-bin ENV PATH $HIVE_HOME/bin:$PATH

RUN yum install -y which

:wq

note:注意:docker版本的差異會導致上述命令執行不成功,RUN mv 重新命名失敗

如果出現上述問題直接將檔案中的重新命名命令全部註釋掉。

5 根據上面的Dockerfile構建Hadoop映象庫

docker build -t="hadoop" . #執行完成後,檢視已安裝的映象庫 docker images [[email protected] hadoop]# docker images REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE hadoop              latest              9d87f24c74a4        43 hours ago        1.4GB centos7_ssh_1       latest              4aa2376ef3f0        46 hours ago        313MB mysql               5.6                 7edb93321b06        2 days ago          256MB centos              latest              49f7960eb7e4        8 weeks ago         200MB  所有映象構建完成

6 生成三節點Hadoop容器叢集 6.1首先規劃一下節點的主機名稱,IP地址(區域網內構建docker映象時,自動分配172.17.0.1/16網段的IP)和埠號

    master 172.17.0.3     slave01 172.17.0.4     slave02 172.17.0.5     因為之前mysql容器已經啟動執行,預設IP:172.17.0.2 6.2下面在Hadoop映象上建立三個容器,做為叢集的節點

#建立master容器,50070和8088,8080是用來在瀏覽器中訪問hadoop yarn spark #WEB介面, 這裡分別對映到物理機的50070和8088,8080埠。重點注意:容器啟動後,對映比較麻煩,最好在這裡對映。 docker run   -d -P -p 50070:50070 -p 8088:8088 -p 8080:8080 --name master  -h master --add-host slave1:172.17.0.4 --add-host slave2:172.17.0.5 hadoop

#建立slave1容器,在容器host檔案,新增hostname,並配置其他節點主機名稱和IP地址 docker run   -d -P --name slave1 -h slave1 --add-host master:172.17.0.3  --add-host slave2:172.17.0.5  hadoop

#建立slave2容器 docker run   -d -P --name slave2 -h slave2 --add-host master:172.17.0.3 --add-host  slave1:172.17.0.4  hadoop

docker ps #檢視啟動的容器 [[email protected] hadoop]# docker ps CONTAINER ID IMAGE      COMMAND              CREATED       STATUS       PORTS                  NAMES 56b2fd94c238 hadoop     "/usr/sbin/sshd -D"  43 hours ago  Up 43 hours  0.0.0.0:32779->22/tcp  slave2 26e2021a90af hadoop     "/usr/sbin/sshd -D"  43 hours ago  Up 43 hours  0.0.0.0:32778->22/tcp  slave1 dc448d2d4352 hadoop     "/usr/sbin/sshd -D"  43 hours ago  Up 43 hours  0.0.0.0:8080->8080/tcp,  0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32777->22/tcp   master 10ab732e1c60 mysql:5.6  "docker-entrypoint.s…"  2 days ago Up 2 days    0.0.0.0:3306->3306/tcp   mysql [[email protected] hadoop]# 

(二)在Docker上配置三節點root叢集 1開啟三個容器終端

docker exec -it master /bin/bash docker exec -it slave1 /bin/bash docker exec -it slave2 /bin/bash

2.1 配置hdfs賬號容器各節點間的SSH免密碼登陸

分別進入master,slave1,slave2三個容器節點,執行下面命令

ssh-keygen -t rsa (ssh免祕鑰登入,rsa加密)三次回車

執行完成後會在~/.ssh/目錄下面生成對應的兩個祕鑰檔案

執行下面的命令: cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

scp ~/.ssh/authorized_keys [email protected]:~/.ssh/ scp ~/.ssh/authorized_keys [email protected]:~/.ssh/

本機生成免祕鑰登入: ssh-copy-id -i

分別測試下ssm免祕鑰登入是否成功,第一次登入需要輸入密碼,exit後再次輸入不需要。 ssh master  ssh slave1 ssh slave2

進入master容器: 修改對應的配置檔案: [[email protected] /]# cd /home/ hadoop/  user_lu/  [[email protected] /]# cd /home/user_lu/lcal/ [[email protected] lcal]# ll total 12 drwxr-xr-x. 1 root  root    53 Aug  1 19:33 apache-hive-1.2.2-bin drwxr-xr-x. 1 10021 10021   67 Aug  1 19:53 hadoop-2.7.1 drwxr-xr-x. 7    10   143 4096 Jul  7 08:09 jdk1.8.0_181 -rw-rw-r--. 1  1000  1000 4214 Aug  1 18:51 region.txt drwxrwxr-x. 6  1001  1001   66 Mar  4  2016 scala-2.11.8 drwxr-xr-x. 1   500   500   40 Aug  1 20:10 spark-2.0.2-bin-hadoop2.7 [[email protected] lcal]# cd hadoop-2.7.1/etc/hadoop

修改slaves 刪除localhost 新增對應的節點 slave1 slave2

hadoop-env.sh 新增jdk環境變數

export JAVA_HOME=/home/user_lu/lcal/jdk1.8.0_181

core-site.xml配置

vi core-site.xml

<property>     <name>fs.defaultFS</name>     <value>hdfs://master:9000/</value> </property> <property>     <name>io.file.buffer.size</name>     <value>131072</value> </property> <property>     <name>hadoop.tmp.dir</name>     <value>file:/home/user_lu/lcal/hadoop-2.7.1/tmp</value> </property>

hdfs-site.xml配置

vi hdfs-site.xml <property>     <name>dfs.webhdfs.enabled</name>     <value>true</value> </property> <property>     <name>dfs.namenode.name.dir</name>     <value>file:/home/user_lu/lcal/hadoop-2.7.1/dfs/name</value> </property> <property>     <name>dfs.datanode.data.dir</name>     <value>file:/home/user_lu/lcal/hadoop-2.7.1/dfs/data</value> </property> <property>     <name>dfs.replication</name>     <value>2</value> </property>

mv mapred-site.xml.template mapred-site.xml配置

vi mapred-site.xml

<property>     <name>mapreduce.framework.name</name>     <value>yarn</value> </property> <property>     <name>mapreduce.jobtracker.http.address</name>     <value>master:50030</value> </property> <property>     <name>mapreduce.jobhistory.address</name>     <value>master:10020</value> </property> <property>     <name>mapreduce.jobhistory.webapp.address</name>     <value>master:19888</value> </property> <property>     <name>mapred.job.tracker</name>     <value>http://master:9001</value> </property>

yarn-site.xml 配置

vi yarn-site.xml

<property>     <name>yarn.nodemanager.aux-services</name>     <value>mapreduce_shuffle</value> </property> <property>     <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>     <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property>     <name>yarn.resourcemanager.address</name>     <value>master:8032</value> </property> <property>     <name>yarn.resourcemanager.scheduler.address</name>     <value>master:8030</value> </property> <property>     <name>yarn.resourcemanager.resource-tracker.address</name>     <value>master:8035</value> </property> <property>     <name>yarn.resourcemanager.admin.address</name>     <value>master:8033</value> </property> <property>     <name>yarn.resourcemanager.webapp.address</name>     <value>master:8088</value> </property>

cd /home/user_lu/lcal/

將配置好的檔案傳送到其他節點 scp -r hadoop-2.7.1 [email protected]:/home/user_lu/lcal/ scp -r hadoop-2.7.1 [email protected]:/home/user_lu/lcal/

格式化hdfs cd /home/user_lu/lcal/hadoop-2.7.1/sbin

hdfs namenode -format

3 啟動hadopp ./start.dfs.sh ./start.yarn.sh 

[[email protected] sbin]# jps 532 SecondaryNameNode 299 NameNode 9675 Jps 3613 RunJar 799 ResourceManager [[email protected] sbin]# 

4 配置spark叢集

cd /home/user_lu/lcal/spark-2.0.2-bin-hadoop2.7/conf #從配置模板複製 cp spark-env.sh.template spark-env.sh   #新增配置內容 vi spark-env.sh 

spark-env.sh末尾新增以下內容:

export JAVA_HOME=/home/user_lu/lcal/jdk1.8.0_181 export HADOOP_HOME=/home/user_lu/lcal/hadoop-2.7.1 export SCALA_HOME=/home/user_lu/lcal/scala-2.11.8 export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop SPARK_MASTER_HOST=master SPARK_LOCAL_DIRS=/home/user_lu/lcal/spark-2.0.2-bin-hadoop2.7 SPARK_DRIVER_MEMORY=2G

mv slaves.template slaves

在slaves檔案下填上slave主機名

slave01 slave02

 master容器配置的spark目錄分別分發到slave01,slave02節點

cd /home/user_lu/lcal   scp -r spark-2.0.2-bin-hadoop2.7  [email protected]:/home/user_lu/lcal/ scp -r spark-2.0.2-bin-hadoop2.7  [email protected]:/home/user_lu/lcal/

5.啟動spark叢集: ./start.all.sh [[email protected] sbin]# jps 1747 Master 532 SecondaryNameNode 9733 Jps 299 NameNode 3613 RunJar 799 ResourceManager [[email protected] sbin]#

6:可以通過web介面檢視叢集狀況埠方別為50070,8088,8080 IP為宿主機ip

(三)hive安裝 解壓到對應路徑:

cd /home/user_lu/lcal/apache-hive-1.2.2-bin/conf

建立hive相關的目錄: hdfs dfs -mkdir -p /user/hive/log hdfs dfs -mkdir -p /user/hive/tmp hdfs dfs -mkdir -p /user/hive/warehouse

授權:否則hive啟動報錯 hdfs dfs -chmod -R 777 /user/hive/log hdfs dfs -chmod -R 777 /user/hive/tmp hdfs dfs -chmod -R 777 /user/hive/warehouse

重新命名配置檔案 mv hive-env.sh.template hive-env.sh mv hive-default.xml.template hive-site.xml

vi hive-env.sh  #新增如下內容

export JAVA_HOME=/home/user_lu/lcal/jdk1.8.0_181 export HADOOP_HOME=/home/user_lu/lcal/hadoop-2.7.1 export HIVE_HOME=/home/user_lu/lcal/apache-hive-1.2.2-bin vi hive-site.xml  #配置

<property>     <name>hive.exec.scratchdir</name>     <value>/user/hive/tmp</value> </property> <property>     <name>hive.metastore.warehouse.dir</name>     <value>/user/hive/warehouse</value> </property> <property>     <name>hive.querylog.location</name>     <value>/user/hive/log</value> </property> <property>     <name>javax.jdo.option.ConnectionURL</name>     <value>jdbc:mysql://172.17.0.2:3306/metastore?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value>   </property>   <property>     <name>javax.jdo.option.ConnectionDriverName</name>     <value>com.mysql.jdbc.Driver</value>   </property>   <property>     <name>javax.jdo.option.ConnectionUserName</name>     <value>root</value>   </property>   <property>     <name>javax.jdo.option.ConnectionPassword</name>     <value>root</value>   </property>       7:建立hive臨時目錄: mkdir -p /home/hadoop/hive/tmp

並在hive-site.xml中修改:

把{system:java.io.tmpdir} 改成 /home/hadoop/hive/tmp/

把 {system:user.name} 改成 {user.name}

否則hive啟動報錯

8:新增連結mysql驅動包到hive 的lib庫 docker cp mysql-connector-java-5.1.7-bin.jar master:/home/user_lu/lcal/apache-hive-1.2.2-bin/lib

9:修改hive,否則啟動會報找不到spark的相關jar包 找到 sparkAssemblyPath=`ls ${SPARK_HOME}/lib/spark-assembly-*.jar`   將其修改為:   sparkAssemblyPath=`ls ${SPARK_HOME}/jars/*.jar`    10:hive初始化 ./schematool -dbType mysql -initSchema --verbose 會遠端連結mysql,並建立元資料庫。

./hive #啟動hive

可以建庫建表查詢了。

退出後可以看下程序: [[email protected] lcal]# jps 5729 RunJar 1747 Master 9827 Jps 532 SecondaryNameNode 299 NameNode 3613 RunJar 799 ResourceManager

(四)sqoop安裝 安裝到slave1節點

在宿主機上執行; [[email protected]] docker cp sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz slave1:/home/user_lu/lcal

1 進入到slave1容器,到對應的目錄。 tar -zxvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz

直接可以執行。