卷前:

  1. 微服务是趋势,docker对于快速高效打包,又作为一个轻量级虚拟机容器,目前的生态已经发展得越来越好;
  2. hadoop生态系列涉足不多,此文来讲述简化复杂的hadoop部署。

准备相关资源:

  • linux操作系统环境(虚拟机也可以),建议centos7
  • hadoop发行版下载官方链接
  • jdk下载官方链接(不建议使用linux下自带openJDK)

资源下载:

wget https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.0.3/hadoop-3.0.3.tar.gz

可以在/root/myhadoop/下进行以下所有操作

Docker安装:

  • 使用centos自带yum源安装
  • yum update
    yum install docker
  • 使用官网提供release安装

部署思路:

  1. 拉取centos的docker镜像包作为基础环境
  2. 将ssh、jdk、hadoop软件包打包到docker-centos上,作为后续环境支撑
  3. 配置hadoop集群工作节点,配置相关core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
  4. 配置hadoop启动用户、启动脚本
  5. 测试成功能访问hadoop提供的web控制台
  6. 打包成自定义docker镜像,方便后续集群部署与扩展

一、拉取centos的docker镜像作为基础包:

docker pull centos

二、使用dockerFile构建centos7-ssh镜像

vi Dockerfile
FROM centos
MAINTAINER pcshao@pcshao.cn

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

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

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

编辑Dockerfile编辑构建脚本,以centos镜像为基础,构建用户名root、密码pcshao,构建ssh服务,构建ssh免密登录的秘钥

docker build -t="centos7-ssh" .

使用dockerfile构建docker镜像,注意此条命令最后一位参数为“ . ”

三、使用dockerFile构建hadoop_base镜像

vi DockerFile
FROM centos7-ssh
ADD jdk-8u191-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_191 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH

ADD hadoop-3.0.3.tar.gz /usr/local
RUN mv /usr/local/hadoop-3.0.3 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

RUN yum install -y which sudo

通过上面打包的centos7-ssh自定义镜像,将同目录下官网下载的jdk-8u191-linux-x64.tar.gz、hadoop-3.0.3.tar.gz打包成新镜像

docker build -t="hadoop_base" .

使用dockerfile构建docker镜像,注意此条命令最后一位参数为“ . ”

四、启动hadoop_base自定义docker镜像,配置ssh-key相关

docker run --name hadoop2 --add-host hadoop2:172.17.0.2 --add-host hadoop3:172.17.0.3 --add-host hadoop4:172.17.0.4 hadoop_base

基于hadoop_base启动一个名为hadoop2的镜像,进入Hadoop2容器,配置ssh秘钥

docker exec -it hadoop2 bash #主机进入镜像名为hadoop2的docker容器
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

五、在自定义hadoop_base>hadoop2镜像上配置相关基础环境

HADOOP_HOME目录

docker exec -it hadoop2 bash #主机进入镜像名为hadoop2的docker容器
#进入到docker容器内
cd /usr/local/hadoop

以下命令都在hadoop_home目录(/usr/local/hadoop)下操作

在etc/hadoop/hadoop-env.sh中,添加JAVA_HOME信息
vi etc/hadoop/hadoop-env.sh
#添加到文件

export JAVA_HOME=/usr/local/jdk1.8
在etc/hadoop/core-site.xml中,添加hadoop配置,使拥有此配置文件的节点有个共同namenode
<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://hadoop2:9000</value>
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/tmp</value>
    <description>Abase for other temporary directories.</description>
  </property>
</configuration>
在etc/hadoop/hdfs-site.xml中,添加hadoop配置
<configuration>
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop2:9001</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/hadoop/dfs/name</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/hadoop/dfs/data</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
    <description># 每个Block有2个备份</description>
  </property>
  <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
  </property>
</configuration>
在etc/hadoop/yarn-site.xml中,添加hadoop配置
<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>hadoop2:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>hadoop2:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>hadoop2:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>hadoop2:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>hadoop2:8088</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>1024</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>1</value>
    </property>
</configuration>
在etc/hadoop/mapred-site.xml中,添加hadoop配置
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop2:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop2:19888</value>
    </property>
</configuration>
在sbin/start-dfs.sh 和 sbin/stop-dfs.sh 中,添加hadoop用户配置
HDFS_DATANODE_USER=root
#HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
在sbin/start-yarn.sh 和 sbin/stop-yarn.sh 中,添加hadoop用户配置
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

六、ctrl+P+Q退出容器到主机并开始打基础包

在打包之前确认下JAVA_HOME环境变量是否完全配置成功

java -version

如果显示命令找不到说明需要重新配置JAVA环境变量

vi /etc/profile

#在文本文件最后追加如下三行
export JAVA_HOME=/usr/local/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

#bash 使立即生效
source /etc/profile
#停止当前镜像名为hadoop2的容器
docker stop hadoop2
#打包镜像
docker commit hadoop2 hadoop_base:v1.0 -a="pcshao.cn" -m="注释"
#docker images查看

七、从打包好的自定义base_v1.0版本的镜像包中run开启多个容器

#删除之前的hadoop2容器
docker rm hadoop2
#基于新镜像开启新的hadoop2容器
docker run --name hadoop2 --add-host hadoop2:172.17.0.2 --add-host hadoop3:172.17.0.3 --add-host hadoop4:172.17.0.4 --add-host hadoop5:172.17.0.5 -d -p 5002:22 -p 9870:9870 -p 8088:8088 -p 19888:19888 hadoop_base:v1.0
#基于新镜像开启hadoop3容器
docker run --name hadoop3 --add-host hadoop2:172.17.0.2 --add-host hadoop3:172.17.0.3 --add-host hadoop4:172.17.0.4 --add-host hadoop5:172.17.0.5 -d -p 5003:22 hadoop_base:v1.0
#基于新镜像开启hadoop4容器
docker run --name hadoop4 --add-host hadoop2:172.17.0.2 --add-host hadoop3:172.17.0.3 --add-host hadoop4:172.17.0.4 --add-host hadoop5:172.17.0.5 -d -p 5004:22 hadoop_base:v1.0
#基于新镜像开启hadoop5容器
docker run --name hadoop5 --add-host hadoop2:172.17.0.2 --add-host hadoop3:172.17.0.3 --add-host hadoop4:172.17.0.4 --add-host hadoop5:172.17.0.5 -d -p 5005:22 hadoop_base:v1.0

八、格式化镜像并配置namenode、datanode开启集群

使hadoop2为master节点,使hadoop3~5为slaves节点

配置slaves
#还是回到HADOOP_HOME目录下
cd /usr/local/hadoop
#配置slaves节点
vi etc/hadoop/slaves
#覆盖
hadoop3
hadoop4
hadoop5
配置workers
#还是回到HADOOP_HOME目录下
cd /usr/local/hadoop
#配置workers
vi etc/hadoop/workers
#覆盖
hadoop3
hadoop4
hadoop5

格式化namenode,即此master

#还是回到HADOOP_HOME目录下
cd /usr/local/hadoop
#格式化
bin/hdfs namenode -format

scp同步到节点主机

scp  -rq /usr/local/hadoop  hadoop3:/usr/local
scp  -rq /usr/local/hadoop  hadoop4:/usr/local
scp  -rq /usr/local/hadoop  hadoop5:/usr/local

启动脚本

#还是回到HADOOP_HOME目录下
cd /usr/local/hadoop
#启动脚本 sbin目录
sbin/start-all.sh

九、web控制台即可访问,通过8088、9870

 

参考自:https://www.linuxidc.com/Linux/2018-08/153683.htm 访问

配置中有任何问题都可以联系作者@pcshao

shaocover@163.com