前言
前面的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管理界面
(二)在Docker上配置三節(jié)點(diǎn)Yarn集群
上面已經(jīng)配置成功,直接啟動(dòng)yarn集群
#啟動(dòng)yarn
start-yarn.sh
瀏覽器輸入http://本機(jī)ip地址:8088/cluster 可以瀏覽節(jié)點(diǎn);
(三) 在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
總結(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