【CSDN博客遷移】利用Docker搭建大數(shù)據(jù)處理集群(1)——HDFS和Spark

前言


前面的android項(xiàng)目剛完,項(xiàng)目總結(jié)文章還未寫完,公司需要研究大數(shù)據(jù)處理應(yīng)用平臺(tái),任務(wù)下達(dá)到我們部門了,鑒于部門物理機(jī)只有一臺(tái),而虛擬機(jī)啟動(dòng)太慢的原因,自己動(dòng)手在Docker搭建了三個(gè)三節(jié)點(diǎn)的數(shù)據(jù)分析集群,主要包括Hdfs集群(分布式存儲(chǔ)集群),YARN集群(分布式資源管理集群),Spark集群(分布式計(jì)算集群)。
在開始正文之前,需要掌握以下基礎(chǔ)知識(shí):

  • Linux基礎(chǔ)知識(shí)(推薦《鳥哥的Linux私房菜》,我早年看的時(shí)候是第三版,現(xiàn)在已經(jīng)有了新版本);
  • Doceker鏡像,容器和倉庫的概念(推薦《Docker — 從入門到實(shí)踐》);
  • Hadoop的基礎(chǔ)概念和原理;

在Centos7上搭建數(shù)據(jù)分析集群過程包括:

  • 在Cnetos7上安裝Docker并創(chuàng)建Hadoop鏡像和三節(jié)點(diǎn)容器
  • 在Docker上配置三節(jié)點(diǎn)Hdfs集群
  • 在Docker上配置三節(jié)點(diǎn)Yarn集群
  • 在Docker上配置三節(jié)點(diǎn)Spark集群

(一)安裝Docker與創(chuàng)建Hadoop鏡像和三節(jié)點(diǎn)容器


1.1 安裝Dcoker

本文在Cnetos7系統(tǒng)上安裝Docker,安裝Docker對(duì)于Linux系統(tǒng)的要求是
64 位操作系統(tǒng),內(nèi)核版本至少為 3.10。

1.1.1 安裝Docker

curl -sSL https://get.docker.com/ | sh

1.1.2 配置Docker加速器和開機(jī)啟動(dòng)服務(wù)

這里需要注冊(cè)一個(gè)阿里云賬號(hào),每個(gè)賬號(hào)有自己專屬的加速器,專屬加速器的地址,根據(jù)自己的地址配。

sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo service docker restart

1.2 在Docker上創(chuàng)建Hadoop鏡像

1.2.1 從Docker Hub官網(wǎng)倉庫上獲取centos鏡像庫

docker pull centos
#查看鏡像庫
docker images

1.2.2 生成帶有SSH功能的centos的鏡像文件

為了后面配置各節(jié)點(diǎn)之間的SSH免密碼登陸,需要在pull下的centos鏡像庫種安裝SSH,
這里利用 Dockerfile 文件來創(chuàng)建鏡像

cd /usr/local

# 創(chuàng)建一個(gè)存放帶ssh的centos鏡像Dockerfile文件的目錄
mkdir DockerImagesFiles/centos7.shh

#創(chuàng)建帶ssh的centos的Dockerfile 文件
vi Dockerfile

# Dockerfile文件內(nèi)容
#基于centos鏡像庫創(chuàng)建
FROM centos
MAINTAINER dys
#安裝ssh
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum  install -y openssh-clients

#配置root名
RUN echo "root:123456" | chpasswd
RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
#生成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

#配置sshd服務(wù)
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

1.2.3 根據(jù)上面的Dockerfile生成centos7-ssh鏡像

docker build -t="centos7-ssh" .
#執(zhí)行完成后,查看已安裝的鏡像庫
docker images

1.2.4 生成Hadoop鏡像庫文件

在構(gòu)建Hadoop鏡像庫的Dockerfile所在目錄下,上傳已經(jīng)下載的 jdk-8u101-linux-x64.tar.gz, hadoop-2.7.3.tar.gz,scala-2.11.8.tgz,spark-2.0.1-bin-hadoop2.7.tgz。

注意:這里要提前在Dockerfile文件配置環(huán)境變量,如果鏡像庫構(gòu)建完成后,在

容器中配置環(huán)境變量是不起作用的。

cd /usr/local

# 創(chuàng)建一個(gè)存放hadoop鏡像Dockerfile文件的目錄
mkdir DockerImagesFiles/hadoop

#創(chuàng)建帶ssh的centos的Dockerfile 文件
vi Dockerfile

# Dockerfile文件內(nèi)容
#基于centos7-ssh構(gòu)建
FROM centos7-ssh
#安裝java
ADD jdk-8u101-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_101 /usr/local/jdk1.8
#配置JAVA環(huán)境變量
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
#安裝hadoop
ADD hadoop-2.7.3.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.7.3 /usr/local/hadoop
#配置hadoop環(huán)境變量
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

#安裝scala 注意Spark2.0.1對(duì)于Scala的版本要求是2.11.x
ADD scala-2.11.8.tgz /usr/local
RUN mv /usr/local/scala-2.11.8 /usr/local/scala2.11.8

#配置scala環(huán)境變量
ENV SCALA_HOME /usr/local/scala
ENV PATH $SCALA_HOME/bin:$PATH

#安裝spark
ADD spark-2.0.1-bin-hadoop2.7.tgz /usr/local
RUN mv /usr/local/spark-2.0.1-bin-hadoop2.7.tgz /usr/local/spark2.0.1

#配置spark環(huán)境變量
ENV SPARK_HOME /usr/local/spark
ENV PATH $SPARK_HOME/bin:$PATH

#創(chuàng)建hdfs賬號(hào)
RUN useradd hdfs
RUN echo "hdfs:12345678" | chpasswd

RUN yum install -y which sudo

1.2.5 根據(jù)上面的Dockerfile構(gòu)建Hadoop鏡像庫

docker build -t="hadoop" .
#執(zhí)行完成后,查看已安裝的鏡像庫
docker images

1.2.6 生成三節(jié)點(diǎn)Hadoop容器集群

1.2.6.1首先規(guī)劃一下節(jié)點(diǎn)的主機(jī)名稱,IP地址(局域網(wǎng)內(nèi)構(gòu)建docker鏡像時(shí),自動(dòng)分配172.17.0.1/16網(wǎng)段的IP)和端口號(hào)

master 172.17.0.2
slave01 172.17.0.3
slave02 172.17.0.4

1.2.6.2下面在Hadoop鏡像上創(chuàng)建三個(gè)容器,做為集群的節(jié)點(diǎn)

#創(chuàng)建master容器,50070和8088,8080是用來在瀏覽器中訪問hadoop yarn spark #WEB界面,這里分別映射到物理機(jī)的50070和8088,8900端口。

#重點(diǎn)注意:容器啟動(dòng)后,映射比較麻煩,最好在這里映射。
docker run   -d -P -p 50070:50070 -p 8088:8088 -p 8080:8900 --name master -h master --add-host slave01:172.17.0.3 --add-host slave02:172.17.0.4 hadoop

#創(chuàng)建slave01容器,在容器host文件,添加hostname,并配置其他節(jié)點(diǎn)主機(jī)名稱和IP地址
docker run   -d -P --name slave01 -h slave01 --add-host master:172.17.0.2 --add-host slave02:172.17.0.4  hadoop

#創(chuàng)建slave02容器
docker run   -d -P --name slave02 -h slave02 --add-host master:172.17.0.2 --add-host slave01:172.17.0.3  hadoop

1.2.6.3 查看已創(chuàng)建的容器并更改hadoop和spark2.0.1目錄所屬用戶

#查看已創(chuàng)建的容器
docker ps -a
#更改hadoop和spark2.0.1目錄所屬用戶
chown -R hdfs:hdfs /usr/local/hadoop
chown -R hdfs:hdfs /usr/local/spark2.0.1

(二)在Docker上配置三節(jié)點(diǎn)Hdfs集群


2.1開啟三個(gè)容器終端

docker exec -it master /bin/bash
docker exec -it slave01 /bin/bash
docker exec -it slave02 /bin/bash

2.1 配置hdfs賬號(hào)容器各節(jié)點(diǎn)間的SSH免密碼登陸

分別進(jìn)入master,slave01,slave02三個(gè)容器節(jié)點(diǎn),執(zhí)行下面命令

#切換到hdfs賬號(hào)
su hdfs
#生成hdfs賬號(hào)的key,執(zhí)行后會(huì)有多個(gè)輸入提示,不用輸入任何內(nèi)容,全部直接回車即可
ssh-keygen
#拷貝到其他節(jié)點(diǎn)
ssh-copy-id -i /home/hdfs/.ssh/id_rsa -p 22 hdfs@master
ssh-copy-id -i /home/hdfs/.ssh/id_rsa -p 22 hdfs@slave01
ssh-copy-id -i /home/hdfs/.ssh/id_rsa -p 22 hdfs@slave02
#驗(yàn)證是否設(shè)置成功
ssh slave01

2.2 配置hadoop

這里主要配置hdfs,因?yàn)槲覀兊挠?jì)算框架要用spark,所以maprreduce的不需要配置。
進(jìn)入master容器的hadoop配置目錄,需要配置有以下7個(gè)文件:hadoop-env.sh,slaves,core-site.xml,hdfs-site.xml,maprd-site.xml,yarn-site.xml

2.2.1 在hadoop-env.sh中配置JAVA_HOME

export JAVA_HOME=/usr/local/jdk1.8

2.2.2 在slaves中配置子節(jié)點(diǎn)主機(jī)名

進(jìn)入slaves文件,添加下面名稱

slave01
slave02

2.2.3 修改core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000/</value>
    </property>
    <property>
         <name>hadoop.tmp.dir</name>
         <value>file:/usr/local/hadoop/tmp</value>
    </property>
</configuration>

2.2.4 修改hdfs-site.xml

<configuration>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>master:9001</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/dfs/data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
</configuration>

2.2.5 修改mapred-site.xml

2.2.5.1 復(fù)制mapred-site.xml文件

#這個(gè)文件默認(rèn)不存在,需要從 mapred-site.xml.template 復(fù)制過來
cp mapred-site.xml.template mapred-site.xml

2.2.5.2 修改mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

2.2.6 修改yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<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>
</configuration>

2.2.7 master容器配置的hadoop目錄分別分發(fā)到slave01,slave02節(jié)點(diǎn)

scp -r hadoop  slave01:/usr/local/
scp -r hadoop  slave02:/usr/local/

2.3 啟動(dòng)HDFS集群,驗(yàn)證是否搭建成功

#如果配置環(huán)境變量,就直接執(zhí)行
hdfs namenode -format     #格式化namenode
start-dfs.sh               #啟動(dòng)dfs 

# 在 master上執(zhí)行jps 
$ jps
#運(yùn)行結(jié)果應(yīng)該包含下面的進(jìn)程
1200 SecondaryNameNode
3622 Jps
988 NameNode

# 在 slave上執(zhí)行jps 
$ jps   
#運(yùn)行結(jié)果應(yīng)該包含下面的進(jìn)程
2213 Jps
1962 DataNode

瀏覽器輸入http://本機(jī)ip地址:50070 ,可以瀏覽hadoop node管理界面


hadoop界面.png

(二)在Docker上配置三節(jié)點(diǎn)Yarn集群

上面已經(jīng)配置成功,直接啟動(dòng)yarn集群

#啟動(dòng)yarn
start-yarn.sh             

瀏覽器輸入http://本機(jī)ip地址:8088/cluster 可以瀏覽節(jié)點(diǎn);


yarn集群界面.png

(三) 在Docker上配置三節(jié)點(diǎn)spark集群


3.1 配置spark

進(jìn)入master容器的spark配置目錄,需要配置有兩個(gè)文件:spark-env.sh,slaves

3.1.1 配置spark-env.sh

cd /usr/lcoal/spark2.0.1/conf
 #從配置模板復(fù)制
cp spark-env.sh.template spark-env.sh  
#添加配置內(nèi)容
vi spark-env.sh    

在spark-env.sh末尾添加以下內(nèi)容:

export SCALA_HOME=/usr/local/scala2.11.8
export JAVA_HOME=/usr/local/jdk1.8
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
SPARK_MASTER_IP=master
SPARK_LOCAL_DIRS=/usr/local/spark2.0.1
SPARK_DRIVER_MEMORY=1G

3.1.2 在slaves文件下填上slave主機(jī)名

slave01
slave02

3.1.3 master容器配置的spark目錄分別分發(fā)到slave01,slave02節(jié)點(diǎn)

scp -r spark2.0.1  slave01:/usr/local/
scp -r spark2.0.1  slave02:/usr/local/

3.2 啟動(dòng)spark集群

start-all.sh

瀏覽Spark的Web管理頁面: http://本機(jī)ip地址:8900


spark集群界面.png

總結(jié)

本文只是搭建了數(shù)據(jù)分析的開發(fā)環(huán)境,作為開發(fā)測(cè)試使用,距離生成環(huán)境的標(biāo)準(zhǔn)還很遠(yuǎn)。例如容器節(jié)點(diǎn)的自動(dòng)化擴(kuò)容,容器的CPU內(nèi)存,調(diào)整,有待繼續(xù)研究。

參考文章

1.https://www.sdk.cn/news/5278 . Docker部署Hadoop集群
2.http://wuchong.me/blog/2015/04/04/spark-on-yarn-cluster-deploy/ .Spark On YARN 集群安裝部署
3.http://shinest.cc/static/post/scala/hadoop_cluster_on_docker.md.html . Hadoop Cluster On Docker

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容