转自:http://blog.csdn.net/iigeoxiaoyang/article/details/53020066
所需安装包已放入百度网盘,链接:https://pan.baidu.com/s/1i5tCWjN
在开始正文之前,需要掌握以下基础知识:
Linux基础知识(推荐《鸟哥的Linux私房菜》,我早年看的时候是第三版,现在已经有了新版本);Doceker镜像,容器和仓库的概念(推荐《Docker — 从入门到实践》);Hadoop的基础概念和原理;
在Centos7上搭建数据分析集群过程包括:
在Cnetos7上安装Docker并创建Hadoop镜像和三节点容器在Docker上配置三节点Hdfs集群在Docker上配置三节点Yarn集群在Docker上配置三节点Spark集群
(一)安装Docker与创建Hadoop镜像和三节点容器
1.1 安装Dcoker
本文在Cnetos7系统上安装Docker,安装Docker对于Linux系统的要求是 64 位操作系统,内核版本至少为 3.10。
1.1.1 安装Docker
curl -
sSL https://
get.docker.com/ | sh
1
1
1.1.2 配置Docker加速器和开机启动服务
这里需要注册一个阿里云账号,每个账号有自己专属的加速器,专属加速器的地址,根据自己的地址配。
sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo service docker restart
123
123
1.2 在Docker上创建Hadoop镜像
1.2.1 从Docker Hub官网仓库上获取centos镜像库
docker pull centos
#查看镜像库
docker images
123
123
1.2.2 生成带有SSH功能的centos的镜像文件
为了后面配置各节点之间的SSH免密码登陆,需要在pull下的centos镜像库种安装SSH, 这里利用 Dockerfile 文件来创建镜像
cd /usr/local
# 创建一个存放带ssh的centos镜像Dockerfile文件的目录
mkdir DockerImagesFiles/centos7.shh
#创建带ssh的centos的Dockerfile 文件
vi Dockerfile
# Dockerfile文件内容
#基于centos镜像库创建
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服务
RUN mkdir /
var/run/sshd
EXPOSE
22
CMD [
"/usr/sbin/sshd",
"-D"]
12345678910111213141516171819202122232425262728
12345678910111213141516171819202122232425262728
1.2.3 根据上面的Dockerfile生成centos7-ssh镜像
docker build -t=
"centos7-ssh" .
#执行完成后,查看已安装的镜像库
docker images
123
123
1.2.4 生成Hadoop镜像库文件
在构建Hadoop镜像库的Dockerfile所在目录下,上传已经下载的 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文件配置环境变量,如果镜像库构建完成后,在
容器中配置环境变量是不起作用的。
cd /usr/
local
mkdir DockerImagesFiles/hadoop
vi Dockerfile
FROM centos7-ssh
ADD jdk-
8u101-linux-x64.tar.gz /usr/
local/
RUN mv /usr/
local/jdk1.
8.0_101 /usr/
local/jdk1.
8
ENV JAVA_HOME /usr/
local/jdk1.
8
ENV PATH
$JAVA_HOME/bin:
$PATH
ADD hadoop-
2.7.
3.tar.gz /usr/
local
RUN mv /usr/
local/hadoop-
2.7.
3 /usr/
local/hadoop
ENV HADOOP_HOME /usr/
local/hadoop
ENV PATH
$HADOOP_HOME/bin:
$PATH
ADD scala-
2.11.
8.tgz /usr/
local
RUN mv /usr/
local/scala-
2.11.
8 /usr/
local/scala2.
11.8
ENV SCALA_HOME /usr/
local/scala
ENV PATH
$SCALA_HOME/bin:
$PATH
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
ENV SPARK_HOME /usr/local/spark2.0.1
ENV PATH
$SPARK_HOME/bin:
$PATH
RUN useradd hdfs
RUN echo
"hdfs:12345678" | chpasswd
RUN yum install -
y which sudo
123456789101112131415161718192021222324252627282930313233343536373839404142434445
123456789101112131415161718192021222324252627282930313233343536373839404142434445
1.2.5 根据上面的Dockerfile构建Hadoop镜像库
docker build -t=
"hadoop" .
#执行完成后,查看已安装的镜像库
docker images
123
123
1.2.6 生成三节点Hadoop容器集群
1.2.6.1首先规划一下节点的主机名称,IP地址(局域网内构建docker镜像时,自动分配172.17.0.1/16网段的IP)和端口号
master 172.17.0.2 slave01 172.17.0.3 slave02 172.17.0.4
1.2.6.2下面在Hadoop镜像上创建三个容器,做为集群的节点
#创建
master容器,50070和8088,8080是用来在浏览器中访问
hadoop yarn spark #WEB界面,这里分别映射到物理机的50070和8088,80
80端口。
#重点注意:容器启动后,映射比较麻烦,最好在这里映射。
docker run -d -P -p 50070
:50070 -p 8088
:8088 -p 8080
:8080 --name master -h master --add-host slave01:172.17.0.3 --add-host slave02:172.17.0.4 hadoop
#创建
slave01容器,在容器
host文件,添加
hostname,并配置其他节点主机名称和
IP地址
docker run -d -P --name slave01 -h slave01 --add-host master:172.17.0.2 --add-host slave02:172.17.0.4 hadoop
#创建
slave02容器
docker run -d -P --name slave02 -h slave02 --add-host master:172.17.0.2 --add-host slave01:172.17.0.3 hadoop
12345678910
12345678910
1.2.6.3 查看已创建的容器并更改hadoop和spark2.0.1目录所属用户
docker ps -a
chown -R hdfs:hdfs /usr/
local/hadoop
chown -R hdfs:hdfs /usr/
local/spark2.
0.
1
12345
12345
(二)在Docker上配置三节点Hdfs集群
2.1开启三个容器终端
docker
exec -it master /bin/bash
docker
exec -it slave01 /bin/bash
docker
exec -it slave02 /bin/bash
123
123
2.1 配置hdfs账号容器各节点间的SSH免密码登陆
分别进入master,slave01,slave02三个容器节点,执行下面命令
su hdfs
ssh-keygen
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
ssh slave01
12345678910
12345678910
2.2 配置hadoop
这里主要配置hdfs,因为我们的计算框架要用spark,所以maprreduce的不需要配置。 进入master容器的hadoop配置目录,需要配置有以下7个文件: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
1
1
2.2.2 在slaves中配置子节点主机名
进入slaves文件,添加下面名称
slave01
slave02
12
12
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>
12345678910
12345678910
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>
12345678910111213141516171819202122
12345678910111213141516171819202122
2.2.5 修改mapred-site.xml
2.2.5.1 复制mapred-site.xml文件
#这个文件默认不存在,需要从 mapred-site.xml.template 复制过来
cp mapred-site
.xml.template mapred-site
.xml
12
12
2.2.5.2 修改mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name
</name>
<value>yarn
</value>
</property>
</configuration>
123456
123456
2.2.6 修改yarn-site.xml
<configuration>
<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>
1234567891011121314151617181920212223242526272829303132
1234567891011121314151617181920212223242526272829303132
2.2.7 master容器配置的hadoop目录分别分发到slave01,slave02节点
scp
-r hadoop slave01:/usr/
local/
scp
-r hadoop slave02:/usr/
local/
12
12
2.3 启动HDFS集群,验证是否搭建成功
#如果配置环境变量,就直接执行
hdfs namenode -format #格式化namenode
start-dfs.sh #启动dfs
# 在 master上执行jps
$ jps
#运行结果应该包含下面的进程
1200 SecondaryNameNode
3622 Jps
988 NameNode
# 在 slave上执行jps
$ jps
#运行结果应该包含下面的进程
2213 Jps
1962 DataNode
12345678910111213141516
12345678910111213141516
浏览器输入http://本机ip地址:50070 ,可以浏览hadoop node管理界面
(二)在Docker上配置三节点Yarn集群
上面已经配置成功,直接启动yarn集群
#启动yarn
start-yarn.sh
12
12
浏览器输入http://本机ip地址:8088/cluster 可以浏览节点;
(三) 在Docker上配置三节点spark集群
3.1 配置spark
进入master容器的spark配置目录,需要配置有两个文件:spark-env.sh,slaves
3.1.1 配置spark-env.sh
cd /usr/l
ocal/spark2
.0.1/conf
#从配置模板复制
cp spark-env
.sh.template spark-env
.sh
#添加配置内容
vi spark-env
.sh
12345
12345
在spark-env.sh末尾添加以下内容:
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
1234567
1234567
3.1.2 在slaves文件下填上slave主机名
slave01
slave02
12
12
3.1.3 master容器配置的spark目录分别分发到slave01,slave02节点
scp
-r spark2
.0.1 slave01:/usr/
local/
scp
-r spark2
.0.1 slave02:/usr/
local/
12
12
3.2 启动spark集群
start-all.sh
1
1
浏览Spark的Web管理页面: http://本机ip地址:8080
总结
本文只是搭建了数据分析的开发环境,作为开发测试使用,距离生成环境的标准还很远。例如容器节点的自动化扩容,容器的CPU内存,调整,有待继续研究。
参考文章
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