Docker搭建hadoop开发测试集群

由于项目需要,最近在研究阿里云的E-Mapreduce,出于开发需要,想搭建一个hadoop集群,
关于Hadoop集群的配置,网上有很多这方面的文章,本文不再赘述。
本文主要讲述通过docker自动化完成一个hadoop的步骤。

本文目标:

  1. 熟悉Docker相关操作
  2. 熟悉hadoop集群的安装配置
  3. 熟练使用Shell去创建自动化脚本初始化hadoop容器,自动互信等

本文使用相关软件版本

  • Centos 7
  • Docker 1.11.2

相关步骤简介:

  1. 构建基础镜像
  2. 配置相应hadoop配置
  3. 基于基础镜像以及配置完全的hadoop2.X.tar.gz构建hadoop镜像
  4. 创建自动化配置脚本,初始化hadoop容器
  5. 提交一个文件到hdfs,运行wordcount的样例Mapreduce

Note:

本文最终会启动三个容器,hadoop0,hadoop1,hadoop2,
设置静态IP,100.10.0.100,100.10.0.101,100.10.0.102,
其中hadoop0是master,hadoop1和2是slave

一、构建基础镜像

基于一个已经存在的centos,由于hadoop集群在启动的时候,需要依赖一些软件,比如建立互信需要ssh相关,在自动化配置的时候需要自动输入expect等。

详细的Dockfile如下:

# 选择一个已有的os镜像作为基础
FROM centos

# 镜像的作者
MAINTAINER xingchuan.qxc

# 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
#安装openssh-clients
RUN yum install -y openssh-clients
# 安装网络相关命令
RUN yum install -y net-tools
# 安装编辑器
RUN yum install -y vim
# 安装which
RUN yum install -y which
# 安装expect
RUN yum install -y expect

# 添加测试用户root,密码root,并且将此用户添加到sudoers里
RUN echo "root:root" | chpasswd
RUN echo "root   ALL=(ALL)   ALL" >> /etc/sudoers
# 下面这两句比较特殊,在centos6上必须要有,否则创建出来的容器sshd不能登录
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服务并且暴露22端口
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

运行 docker build -t "xingchuan/centos" .

docker build 相关的命令,自行google,这里是通过该命令构建一个叫xingchuan/centos的镜像

二、 基于基础镜像,构建Jdk8的镜像

在Oracle官网下载jdk8,我今天下载的是jdk-8u121-linux-x64.tar.gz

构建JDK8的镜像Dockfile如下:

FROM xingchuan/centos
MAINTAINER xingchuan.qxc
ADD jdk-8u121-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_121
ENV PATH $JAVA_HOME/bin:$PATH
RUN echo "export JAVA_HOME=/usr/local/jdk1.8.0_121" >> /etc/profile
RUN echo "export CLASSPATH=.:$JAVA_HOME/lib" >> /etc/profile
RUN echo "export PATH=$JAVA_HOME/bin:$PATH" >> /etc/profile

Note:

Dockerfile的ADD命令,含有解压功能,详细用法可以自行查找相关资料
这个地方我使用ENV发现JDK的环境变量没有自动给配置上(具体原因回头详查),
所以在最后加了三个RUN,手动配置了一下JDK环境变量

运行 docker build -t "xingchuan/jdk8" . 完成JDK8镜像的构建

三、 构建hadoop环境的镜像,基于Jdk8镜像

3.1、基础配置

在hadooop.apache.org下载hadoop,我这里使用的是hadoop-2.7.3.tar.gz,下载后,我做了如下配置。
解压后,修改相关配置

hadoop-env.sh

export JAVA_HOME=/usr/local/jdk1.7

core-site.xml

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop0:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/hadoop/tmp</value>
        </property>
         <property>
                 <name>fs.trash.interval</name>
                 <value>1440</value>
        </property>
</configuration>

hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>

yarn-site.xml

<configuration>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property> 
                <name>yarn.log-aggregation-enable</name> 
                <value>true</value> 
        </property>
        <property>
            <description>The hostname of the RM.</description>
            <name>yarn.resourcemanager.hostname</name>
            <value>hadoop0</value>
        </property>
</configuration>

mapred-site.xml (不存在则创建)

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

**slaves **

hadoop1
hadoop2

配置完成后,重新打包成hadoop-2.7.3.tar.gz

3.2 创建互信自动脚本

3.2.1 genSSH.exp

目的:

在容器启动的时候,hadoop三个节点之间需要互信,本文目标就是全部自动化完成,
所以必须借助expect软件(该软件Centos默认没有安装,执行 yum install -y expect可以安装调试)

脚本如下:

#!/usr/bin/expect
set timeout 10
set username [lindex $argv 0]
set password [lindex $argv 1]
set hostname [lindex $argv 2]
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $username@$hostname
expect {
            #first connect, no public key in ~/.ssh/known_hosts
            "Are you sure you want to continue connecting (yes/no)?" {
            send "yes\r"
            expect "password:"
                send "$password\r"
            }
            #already has public key in ~/.ssh/known_hosts
            "password:" {
                send "$password\r"
            }
            "Now try logging into the machine" {
                #it has authorized, do nothing!
            }
        }
expect eof

3.2.2 startHadoop.exp

目的

容器初始化成功之后,一切配置都ok了,自动启动hadoop集群

脚本如下:

#!/usr/bin/expect
set timeout 30
spawn /usr/local/hadoop/sbin/start-all.sh
expect "Are you sure you want to continue connecting (yes/no)?" {
    send "yes\r"
    }

Note:expect其他高级用法,自行Google

3.3 构建Hadoop镜像

Dockerfile如下:

FROM xingchuan/jdk8

MAINTAINER xingchuan.qxc

ADD hadoop-2.7.3.tar.gz /usr/local
ADD genSSH.exp /root
ADD startHadoop.exp /root
RUN chmod +x /root/genSSH.exp
RUN chmod +x /root/startHadoop.exp
RUN mv /usr/local/hadoop-2.7.3 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH
RUN echo "export HADOOP_HOME=/usr/local/hadoop" >> /etc/profile
RUN echo "export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH" >> /etc/profile

上述文件创建好之后,我都是丢在同一个目录的,目录结构如下:


Paste_Image.png

创建一个Dockerfile的软链接

运行docker build -t "xingchuan/hadoop:2.7" .

镜像创建成功后,如图:

Paste_Image.png

4、构建自动初始化脚本

创建一个startHadoop.sh,脚本内容如下:

#/bin/bash
# hadoop的三个容器名字
hadoop_arr=("hadoop0" "hadoop1" "hadoop2");
# hadoop三个容器对应的ip地址
hadoop_ip=("100.10.0.100" "100.10.0.101" "100.10.0.102");
for((m=0;m<${#hadoop_arr[*]};m++));
do
docker run -tid --name ${hadoop_arr[$m]} -h ${hadoop_arr[m]} --add-host hadoop0:100.10.0.100 --add-host hadoop1:100.10.0.101 --add-host hadoop2:100.10.0.102 --net=HZ --ip=${hadoop_ip[m]} xingchuan/hadoop:2.7
done;
# 创建ssh公钥私钥
for((m=0;m<${#hadoop_arr[*]};m++));
do
docker exec ${hadoop_arr[m]} rm -rf ~/.ssh;
docker exec ${hadoop_arr[m]} mkdir -p ~/.ssh;
docker exec ${hadoop_arr[m]} ssh-keygen -t rsa -f ~/.ssh/id_rsa -P "";
done;

# 建立互信
for((m=0;m<${#hadoop_arr[*]};m++));
do
  for((n=0;n<${#hadoop_arr[*]};n++));
  do
    docker exec ${hadoop_arr[m]} expect -f /root/genSSH.exp root root ${hadoop_arr[n]};
  done;
done;

# format hdfs
docker exec hadoop0 hdfs namenode -format
# 启动hadoop集群
docker exec hadoop0 /root/startHadoop.exp

Note:

--add-host 可以在容器启动的时候自动配置/etc/hosts

在宿主机给startHadoop.sh加上可执行权限

chmod +x startHadoop.sh

运行后,容器启动成功且互信关系创建完成


Paste_Image.png
Paste_Image.png

Paste_Image.png

检查相应进程是否都启动完成:

hadoop0

[root@hadoop0 ~]# jps
1120 Jps
403 NameNode
596 SecondaryNameNode
756 ResourceManager

hadoop1

[root@hadoop0 ~]# ssh hadoop1
Last login: Sat Feb  4 12:38:35 2017 from hadoop0
[root@hadoop1 ~]# jps
354 NodeManager
547 Jps
252 DataNode

hadoop2

[root@hadoop1 ~]# ssh hadoop2
Last login: Sat Feb  4 12:38:39 2017 from hadoop1
[root@hadoop2 ~]# jps
357 NodeManager
550 Jps
255 DataNode

5、测试验证:

Paste_Image.png
Paste_Image.png
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容