使用docker子网搭建hadoop集群

简介

由于之前按照网上的教程搭建并不能完全满足需求,经过几天的学习,整理了一套搭建方案。
最后的镜像大小1.4G多,使用docker子网,容器重新启动不需要重新配置/etc/hosts文件。
配置过程中参考了如下博客,有些细节问题这些博客里面解释的更加详细。
ssh配置部分:
https://blog.csdn.net/weixin_42051109/article/details/82744993
wordcount部分:
https://blog.csdn.net/alexwym/article/details/82497582
虽然配置完了,但是有些地方并不完全懂,后续有机会还会做一些补充解释。

0 环境

Ubuntu16.04虚拟机

1 准备工作

  1. 下载解压jdk1.8文件夹
  2. 下载解压hadoop2.8.5文件夹
  3. docker pull centos7基础镜像
  4. 建mydocker文件夹
  5. 将jdk1.8文件夹和hadoop文件夹移动到mydocker文件夹(这里为了简洁将hadoop2.8.5文件夹重命名为hadoop)
  6. 编辑hadoop文件夹内的文件(避免创建镜像后要修改三遍)

首先进入hadoop/etc/hadoop文件夹后修改hadoop.env.sh

tianyou@ubuntu:~/mydocker/hadoop/etc/hadoop$ vim hadoop-env.sh

将JAVA_HOME修改为如下路径

export JAVA_HOME= /usr/local/jdk1.8

修改core-site.xml如下

tianyou@ubuntu:~/mydocker/hadoop/etc/hadoop$ vim core-site.xml
<!-- Put site-specific property overrides in this file. -->
<configuration>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://hadoop0:9000</value>
      </property>
      <property>
         <name>io.file.buffer.size</name>
         <value>131072</value>
     </property>
     <property>
          <name>hadoop.tmp.dir</name>
          <value>/usr/local/hadoop/tmp</value>
     </property>
</configuration>

修改yarn-site.xml

tianyou@ubuntu:~/mydocker/hadoop/etc/hadoop$ vim yarn-site.xml
<configuration>
     <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
     </property>
     <property>
         <name>yarn.resourcemanager.address</name>
         <value>hadoop0:8032</value>
     </property>
     <property>
         <name>yarn.resourcemanager.scheduler.address</name>
         <value>hadoop0:8030</value>
     </property>
     <property>
         <name>yarn.resourcemanager.resource-tracker.address</name>
         <value>hadoop0:8031</value>
     </property>
     <property>
         <name>yarn.resourcemanager.admin.address</name>
         <value>hadoop0:8033</value>
     </property>
	 <property>
         <name>yarn.resourcemanager.webapp.address</name>
         <value>hadoop0:8088</value>
     </property>
     <property>
         <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
         <value>org.apache.hadoop.mapred.ShuffleHandler</value>
     </property>
</configuration>          

修改mapred-site.xml,我这里是mapred-site.xml.template

tianyou@ubuntu:~/mydocker/hadoop/etc/hadoop$ vim mapred-site.xml.template
<!-- Put site-specific property overrides in this file. -->
<configuration>
 <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

修改hdfs-site.xml(按照datanode配置)

tianyou@ubuntu:~/mydocker/hadoop/etc/hadoop$ vim hdfs-site.xml 
<configuration>
    <property>
      <name>dfs.replication</name>
      <value>2</value>
    </property>
    <property>
      <name>dfs.datanode.data.dir</name>
      <value>file:/usr/local/hadoop/hdfs/data</value>
    </property>
</configuration>

这里修改hadoop配置文件是为了构建镜像时直接将hadoop文件夹COPY到镜像中,再用镜像创建三个容器后不需要在三个容器中分别进行重复的配置工作

2 使用Dockerfile构建镜像

  1. 编辑Dockefile,基于准备好的centos:7基础镜像构建
FROM centos:7
# 选择一个已有的os镜像作为基a础  
# 镜像的作者  
MAINTAINER tianyou
# 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no  
RUN yum install -y openssh-server sudo \
        && sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \
#安装openssh-clients
        && yum  install -y openssh-clients \
        && yum install -y vim \
        && yum install -y which \

# 添加测试用户root,密码root,并且将此用户添加到sudoers里  
        && echo "root:root" | chpasswd \
        && echo "root   ALL=(ALL)       ALL" >> /etc/sudoers \
# 下面这两句比较特殊,在centos6上必须要有,否则创建出来的容器sshd不能登录  
        && ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key \
        && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \

        && mkdir /var/run/sshd

COPY jdk1.8  /usr/local/jdk1.8/
COPY hadoop /usr/local/hadoop/
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
  1. 在mydocker文件夹下执行构建命令(因为需要文件访问权限要加sudo,命令最后的 .不要丢)
tianyou@ubuntu:~/mydocker$ sudo docker build -t tianyou/centos-java-hadoop .

3 创建容器

  1. 创建子网 hadoopnetwork
tianyou@ubuntu:~/mydocker$ docker network create --subnet=172.19.0.0/16 hadoopnetwork
  1. 创建容器并指定子网和ip

创建hadoop0容器

tianyou@ubuntu:~/mydocker$ docker run -it -d --net hadoopnetwork --ip 172.19.0.2 --name hadoop0 -h hadoop0 tianyou/centos-java-hadoop

创建hadoop1容器

tianyou@ubuntu:~/mydocker$ docker run -it -d --net hadoopnetwork --ip 172.19.0.3 --name hadoop1 -h hadoop1 tianyou/centos-java-hadoop

创建hadoop2容器

tianyou@ubuntu:~/mydocker$ docker run -it -d --net hadoopnetwork --ip 172.19.0.4 --name hadoop2 -h hadoop2 tianyou/centos-java-hadoop

4 配置ssh

1.进入hadoop0

tianyou@ubuntu:~/mydocker$ docker exec -it hadoop0 /bin/bash

2.配置ssh密钥

[root@hadoop0 /]# /usr/sbin/sshd && /usr/sbin/sshd-keygen -A && /usr/sbin/sshd

制作密钥,输入ssh-keygen -t rsa,然后敲三次Enter键

[root@hadoop0 /]# ssh-keygen -t rsa

生成的密钥存在 /root/.ssh/id_rsa.pub 文件中,执行指令把密钥存储在 /root/.ssh/authorized_keys 文件中
修改sshd_config配置使提示更简洁,合并指令如下:

[root@hadoop0 /]# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && vim /etc/ssh/sshd_config

将配置文件中对应行 修改为如下所示:

Port 22
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
PrintLastLog no

Esc进入命令模式,:wq保存
修改ssh_config文件中 StrictHostKeyChecking ask改成no

[root@Master local]# vim /etc/ssh/ssh_config 
StrictHostKeyChecking no

Ctrl+P+Q退出hadoop0容器
进入hadoop1和hadoop2容器,进行同样的操作生成ssh密钥和配置

3 将容器的秘钥互相添加
每个容器的 /root/.ssh/authorized_keys 文件都需要填入所有容器的密钥
以上操作结束后在hadoop2容器中,查看文件,复制出haoop2密钥

[root@hadoop2 /]#  vim  /root/.ssh/authorized_keys

ctrl+P+Q退出,同样复制出hadoop1和hadoop0秘钥,将三个秘钥全部复制到三个容器的/root/.ssh/authorized_keys文件中。
复制完成后在每个容器中都执行一次 /usr/sbin/sshd命令

[root@Master local]# /usr/sbin/sshd

至此,通过ssh可以互相访问,测试一下

[root@hadoop0 /]# ssh hadoop1

ctrl+D返回

5 完善hadoop配置

进入hadoop0,修改hdfs-site.xml 文件如下:

[root@hadoop0 /]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml 

因为在COPY进容器时按照datanode配置,所以要修改为namenode配置,只需要将三处data修改为name

<!-- Put site-specific property overrides in this file. -->
<configuration>
    <property>
      <name>dfs.replication</name>
      <value>2</value>
    </property>
    <property>
      <name>dfs.namenode.name.dir</name>
      <value>file:/usr/local/hadoop/hdfs/name</value>
    </property>
</configuration>

通过ssh进入hadoop1,删除重建hdfs文件

[root@hadoop0 /]# ssh hadoop1
[root@hadoop1 ~]# rm -rf /usr/local/hadoop/hdfs && mkdir -p /usr/local/hadoop/hdfs/data

ctrl+D退出,同样进入hadoop2,删除重建hdfs文件
ctrl+D退出,回到hadoop0,删除重建hdfs文件,注意这里是name。

[root@hadoop0 /]# rm -rf /usr/local/hadoop/hdfs && mkdir -p /usr/local/hadoop/hdfs/name

修改slaves文件

[root@hadoop0 local]# vim /usr/local/hadoop/etc/hadoop/slaves

填入hadoop1,hadoop2

localhost
hadoop1
hadoop2

格式化hdfs(这里当时报了一个错,找不到JAVA_HOME,因为hadoop-env.sh中JAVA_HOME=后面多敲了一个空格,删掉后成功运行)

[root@hadoop0 /]# hdfs namenode -format

修改/etc/profile文件 ,修改后可以使用jps 或 hadoop fs xx 指令

[root@hadoop0 local]# vim /etc/profile

将下面的代码添加到文件末尾,保存退出

export JAVA_HOME=/usr/local/jdk1.8
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source使配置生效

[root@hadoop1 ~]# source /etc/profile

ssh进入hadoop1和hadoop2做同样修改。
回到hadoop0进入hadoop/sbin,执行start-all命令启动

[root@hadoop0 local]# cd /usr/local/hadoop/sbin/
[root@hadoop0 sbin]# ./start-all.sh

可以运行如下命令查看节点情况

[root@hadoop0 sbin]# hadoop dfsadmin -report

6 测试wordcount程序

启动hadoop之后(一定要先启动),可以运行自带的wordcount程序来测试一下
进入hadoop文件夹 在hdfs建立input文件夹

[root@hadoop0 hadoop]# bin/hdfs dfs -mkdir -p /data/input

在容器中创建my_wordcount.txt文件,编辑一些单词 ,Esc :wq保存

[root@hadoop0 hadoop]# vim my_wordcount.txt

将本地的文件上传到hdfs

[root@hadoop0 hadoop]# bin/hdfs dfs -put my_wordcount.txt /data/input

启动wordcount程序,指定输入文件和输出文件(版本号需要改)

[root@hadoop0 hadoop]# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /data/input/my_wordcount.txt /data/out/my_wordcount

查看运行结果

[root@hadoop0 hadoop]# bin/hdfs dfs -cat /data/out/my_wordcount/part-r-00000
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值