使用docker搭建部署hadoop分布式集群

在网上找了非常长时间都没有找到使用docker搭建hadoop分布式集群的文档,没办法,仅仅能自己写一个了。

一:环境准备:

1:首先要有一个Centos7操作系统。能够在虚拟机中安装。

2:在centos7中安装docker,docker的版本号为1.8.2

安装过程例如以下:

<1>安装制定版本号的dockeryum install -y docker-1.8.2-10.el7.centos

<2>安装的时候可能会报错,须要删除这个依赖

rpm -e lvm2-7:2.02.105-14.el7.x86_64

启动docker

service docker start

验证安装结果:



<3>启动之后运行docker info会看到以下有两行警告信息

须要关闭防火墙并重新启动系统

systemctl stop firewalld
systemctl disable firewalld
注意:运行完上面的命令之后须要重新启动系统
reboot -h(重新启动系统)

<4>运行容器可能会报错

须要关闭selinux

解决方法:

1:setenforce 0(立马生效,不须要重新启动操作系统)
2:改动/etc/selinux/config文件里的SELINUX=disabled 。然后重新启动系统生效
建议两个步骤都运行,这样能够确保系统重新启动之后selinux也是关闭状态

3:须要先构建一个hadoop的基础镜像,使用dockerfile文件方式进行构建。

先构建一个具备ssh功能的镜像。方便后期使用。(可是这样对于容器的安全性会有影响)

注意:这个镜像中的root用户的password是root

Mkdir centos-ssh-root

Cd centos-ssh-root

Vi Dockerfile

# 选择一个已有的os镜像作为基础
FROM centos # 镜像的作者
MAINTAINER crxy # 安装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 # 加入測试用户root。passwordroot,而且将此用户加入到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服务而且暴露22port
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

构建命令:

docker build -t=”crxy/centos-ssh-root” .

查询刚才构建成功的镜像



4:基于这个镜像再构建一个带有jdk的镜像

注意:jdk使用的是1.7版本号的

Mkdir centos-ssh-root-jdk

Cd centos-ssh-root-jdk

Cp ../jdk-7u75-linux-x64.tar.gz .

Vi Dockerfile

FROM crxy/centos-ssh-root
ADD jdk-7u75-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.7.0_75 /usr/local/jdk1.7
ENV JAVA_HOME /usr/local/jdk1.7
ENV PATH $JAVA_HOME/bin:$PATH

构建命令:

docker build -t=”crxy/centos-ssh-root-jdk” .

查询构建成功的镜像

5:基于这个jdk镜像再构建一个带有hadoop的镜像

注意:hadoop使用的是2.4.1版本号的。

Mkdir centos-ssh-root-jdk-hadoop

Cd centos-ssh-root-jdk-hadoop

Cp ../hadoop-2.4.1.tar.gz .

Vi Dockerfile

FROM crxy/centos-ssh-root-jdk
ADD hadoop-2.4.1.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.4.1 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

构建命令:

docker build -t=”crxy/centos-ssh-root-jdk-hadoop” .

查询构建成功的镜像

二:搭建hadoop分布式集群

1:集群规划

准备搭建一个具有三个节点的集群,一主两从

主节点:hadoop0 ip:192.168.2.10

从节点1:hadoop1 ip:192.168.2.11

从节点2:hadoop2 ip:192.168.2.12

可是由于docker容器又一次启动之后ip会发生变化,所以须要我们给docker设置固定ip。使用pipework给docker容器设置固定ip

2:启动三个容器,分别作为hadoop0 hadoop1 hadoop2

在宿主机上运行以下命令。给容器设置主机名和容器的名称。而且在hadoop0中对外开放port50070 和8088

docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 crxy/centos-ssh-root-jdk-hadoop

docker run --name hadoop1 --hostname hadoop1 -d -P crxy/centos-ssh-root-jdk-hadoop

docker run --name hadoop2 --hostname hadoop2 -d -P crxy/centos-ssh-root-jdk-hadoop

使用docker ps 查看刚才启动的是三个容器

3:给这三台容器设置固定IP

1:下载pipework

下载地址:https://github.com/jpetazzo/pipework.git

2:把下载的zip包上传到宿主机服务器上,解压,改名字

unzip pipework-master.zip
mv pipework-master pipework
cp -rp pipework/pipework /usr/local/bin/

3:安装bridge-utils

yum -y install bridge-utils

4:创建网络

brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0

5:给容器设置固定ip

pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

验证一下。分别ping三个ip,能ping通就说明没问题

4:配置hadoop集群

先连接到hadoop0上,

使用命令

docker exec -it hadoop0 /bin/bash

以下的步骤就是hadoop集群的配置过程

1:设置主机名与ip的映射。改动三台容器:vi /etc/hosts

加入以下配置

192.168.2.10    hadoop0
192.168.2.11 hadoop1
192.168.2.12 hadoop2

2:设置ssh免password登录

在hadoop0上运行以下操作

cd  ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa(一直按回车就可以)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop0
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2
在hadoop1上运行以下操作
cd ~
cd .ssh
ssh-keygen -t rsa(一直按回车就可以)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop1
在hadoop2上运行以下操作
cd ~
cd .ssh
ssh-keygen -t rsa(一直按回车就可以)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop2

3:在hadoop0上改动hadoop的配置文件

进入到/usr/local/hadoop/etc/hadoop文件夹

改动文件夹下的配置文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml

(1)hadoop-env.sh

export JAVA_HOME=/usr/local/jdk1.7

(2)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>

(3)hdfs-site.xml

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

(4)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>
</configuration>

(5)改动文件名称:mv mapred-site.xml.template mapred-site.xml

vi mapred-site.xml

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

(6)格式化

进入到/usr/local/hadoop文件夹下

1、运行格式化命令

bin/hdfs namenode -format
注意:在运行的时候会报错,是由于缺少which命令。安装就可以 运行以下命令安装
yum install -y which

看到以下命令说明格式化成功。

格式化操作不能反复运行。假设一定要反复格式化。带參数-force就可以。

(7)启动伪分布hadoop

命令:sbin/start-all.sh

第一次启动的过程中须要输入yes确认一下。

使用jps。检查进程是否正常启动?能看到以下几个进程表示伪分布启动成功

[root@hadoop0 hadoop]# jps
3267 SecondaryNameNode
3003 NameNode
3664 Jps
3397 ResourceManager
3090 DataNode
3487 NodeManager

(8)停止伪分布hadoop

命令:sbin/stop-all.sh

(9)指定nodemanager的地址。改动文件yarn-site.xml

<property>
<description>The hostname of the RM.</description>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop0</value>
</property>

(10)改动hadoop0中hadoop的一个配置文件etc/hadoop/slaves

删除原来的全部内容,改动为例如以下

hadoop1
hadoop2

(11)在hadoop0中运行命令

  scp  -rq /usr/local/hadoop   hadoop1:/usr/local
scp -rq /usr/local/hadoop hadoop2:/usr/local

(12)启动hadoop分布式集群服务

运行sbin/start-all.sh

注意:在运行的时候会报错。是由于两个从节点缺少which命令,安装就可以

分别在两个从节点运行以下命令安装

yum install -y which

再启动集群(假设集群已启动,须要先停止)

sbin/start-all.sh

(13)验证集群是否正常

首先查看进程:

Hadoop0上须要有这几个进程

[root@hadoop0 hadoop]# jps
4643 Jps
4073 NameNode
4216 SecondaryNameNode
4381 ResourceManager

Hadoop1上须要有这几个进程

[root@hadoop1 hadoop]# jps
715 NodeManager
849 Jps
645 DataNode

Hadoop2上须要有这几个进程

[root@hadoop2 hadoop]# jps
456 NodeManager
589 Jps
388 DataNode

使用程序验证集群服务

创建一个本地文件

vi a.txt
hello you
hello me

上传a.txt到hdfs上

hdfs dfs -put a.txt /

运行wordcount程序

cd /usr/local/hadoop/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /a.txt /out

查看程序运行结果



这样就说明集群正常了。

通过浏览器訪问集群的服务

由于在启动hadoop0这个容器的时候把50070和8088映射到宿主机的相应port上了

adb9eba7142b        crxy/centos-ssh-root-jdk-hadoop   "/usr/sbin/sshd -D"   About an hour ago   Up About an hour    0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32770->22/tcp   hadoop0

所以在这能够直接通过宿主机訪问容器中hadoop集群的服务

宿主机的ip为:192.168.1.144

http://192.168.1.144:50070/
http://192.168.1.144:8088/



三:集群节点重新启动

停止三个容器,在宿主机上运行以下命令

docker stop hadoop0
docker stop hadoop1
docker stop hadoop2

容器停止之后,之前设置的固定ip也会消失,又一次再使用这几个容器的时候还须要又一次设置固定ip

先把之前停止的三个容器起来

docker start hadoop0
docker start hadoop1
docker start hadoop2

在宿主机上运行以下命令又一次给容器设置固定ip

pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

还须要又一次在容器中配置主机名和ip的映射关系,每次都手工写比較麻烦

写一个脚本。runhosts.sh

#!/bin/bash
echo 192.168.2.10 hadoop0 >> /etc/hosts
echo 192.168.2.11 hadoop1 >> /etc/hosts
echo 192.168.2.12 hadoop2 >> /etc/hosts

加入运行权限,chmod +x runhosts.sh

把这个脚本复制到全部节点。而且分别运行这个脚本

scp runhosts.sh  hadoop1:~
scp runhosts.sh hadoop2:~

运行脚本的命令 ./runhosts.sh

查看/etc/hosts文件里是否加入成功

注意:有一些docker版本号中不会在hosts文件里自己主动生成以下这些映射,所以我们才在这里手工给容器设置固定ip,并设置主机名和ip的映射关系。

172.17.0.25     hadoop0
172.17.0.25 hadoop0.bridge
172.17.0.26 hadoop1
172.17.0.26 hadoop1.bridge
172.17.0.27 hadoop2
172.17.0.27 hadoop2.bridge

启动hadoop集群

sbin/start-all.sh

**

假设有什么问题,能够进群一起交流!群号:295505811

**

大数据技术博客

www.bigdata1024.com

使用docker搭建hadoop分布式集群的更多相关文章

  1. 超快速使用docker在本地搭建hadoop分布式集群

    超快速使用docker在本地搭建hadoop分布式集群 超快速使用docker在本地搭建hadoop分布式集群 学习hadoop集群环境搭建是hadoop入门的必经之路.搭建分布式集群通常有两个办法: ...

  2. 暑假第二弹:基于docker的hadoop分布式集群系统的搭建和测试

    早在四月份的时候,就已经开了这篇文章.当时是参加数据挖掘的比赛,在计科院大佬的建议下用TensorFlow搞深度学习,而且要在自己的hadoop分布式集群系统下搞. 当时可把我们牛逼坏了,在没有基础的 ...

  3. 使用Docker在本地搭建Hadoop分布式集群

    学习Hadoop集群环境搭建是Hadoop入门必经之路.搭建分布式集群通常有两个办法: 要么找多台机器来部署(常常找不到机器) 或者在本地开多个虚拟机(开销很大,对宿主机器性能要求高,光是安装多个虚拟 ...

  4. 分布式计算(一)Ubuntu搭建Hadoop分布式集群

    最近准备接触分布式计算,学习分布式计算的技术栈和架构知识.目前的分布式计算方式大致分为两种:离线计算和实时计算.在大数据全家桶中,离线计算的优秀工具当属Hadoop和Spark,而实时计算的杰出代表非 ...

  5. 在 Ubuntu 上搭建 Hadoop 分布式集群 Eclipse 开发环境

    一直在忙Android FrameWork,终于闲了一点,利用空余时间研究了一下Hadoop,并且在自己和同事的电脑上搭建了分布式集群,现在更新一下blog,分享自己的成果. 一 .环境 1.操作系统 ...

  6. CentOS7.5搭建Hadoop分布式集群

    材料:3台虚拟主机,ip分别为: 192.168.1.201 192.168.1.202 192.168.1.203 1.配置主机名称 三个ip与主机名称分别对应关系如下: 192.168.1.201 ...

  7. VM搭建hadoop分布式集群

    1.  安装VMware Workstation Pro 2.安装Ubuntu-16.04 3.以下全程使用sudo –s 切换root权限 4.更新deb软件包列表:apt-get update 5 ...

  8. Hadoop分布式集群搭建hadoop2.6+Ubuntu16.04

    前段时间搭建Hadoop分布式集群,踩了不少坑,网上很多资料都写得不够详细,对于新手来说搭建起来会遇到很多问题.以下是自己根据搭建Hadoop分布式集群的经验希望给新手一些帮助.当然,建议先把HDFS ...

  9. hadoop分布式集群的搭建

    电脑如果是8G内存或者以下建议搭建3节点集群,如果是搭建5节点集群就要增加内存条了.当然实际开发中不会用虚拟机做,一些小公司刚刚起步的时候会采用云服务,因为开始数据量不大. 但随着数据量的增大才会考虑 ...

随机推荐

  1. UML中的序列图(时序图)

    序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸. 横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时.生命 ...

  2. 通过PowerShell卸载全部的SharePoint 2010 解决方式

    通过PowerShell卸载全部的SharePoint 2010 解决方式         为了演示.我常常须要拆毁再重建SharePoint 2010 环境.         我常常须要用到的操作就 ...

  3. 【DataStructure】The difference among methods addAll(),retainAll() and removeAll()

    In the Java collection framework, there are three similar methods, addAll(),retainAll() and removeAl ...

  4. sdwebimage缓存图片

    当使用SDWebImage时,如果用相同图片名的图片替换掉了原始缓存的图片,当再次请求的时候,还是使用的缓存图片,图片不会发生改变 原因:图片在NSCache中是以absolute url作为key存 ...

  5. Mediator 基于内存的发布订阅

    Github Mediator 使用方法 /// <summary> /// 返回值 BaseEntity /// </summary> public class Ping1 ...

  6. sql server 授权相关命令

    原文:https://blog.csdn.net/hfdgjhv/article/details/83834076 https://www.cnblogs.com/shi-yongcui/p/7755 ...

  7. 软件测试中的fault,error,failure

    问题:给定两段代码,设计fault,error,failure的测试用例. fault:即引起错误的原因,类似病因. error:类似疾病引起的内部结果. failure:类似疾病引起的症状. 代码1 ...

  8. appium连接夜游神的方法

    很多小伙伴想连接夜游神模拟器,但是无法连接,下面是夜游神的链接方法 第一步:先打开夜游神模拟器 第二步:打开运行输入cmd,输入夜游神连接方法:adb connect 127.0.0.1:62001第 ...

  9. bootstrap-导航条

    默认样式的导航条 导航条是在您的应用或网站中作为导航页头的响应式基础组件.它们在移动设备上可以折叠(并且可开可关),且在视口(viewport)宽度增加时逐渐变为水平展开模式. 两端对齐的导航条导航链 ...

  10. ZBrush2018中文版全球同步发售,终身授权

    ZBrush 2018于2018.3.28发布了!这个我们期待已久的2018新版本等了几年,它终于来了! 不负众望,ZBrush 2018的这一次更新,简直炸裂,新功能真是太好用了!2018版是ZBr ...