使用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. COCOS2DX 3.0 优化提升渲染速度 Auto-batching

    COCOS2DX 3.0 优化提升渲染速度 Auto-batching 近期在看COCOS2DX 3.0的Auto-batching合批与Auto Culling动态缩减功能以下就来细致看看吧:整合好 ...

  2. SSAO + FXAA

    如今已经完毕了渲染器的屏幕空间环境光遮挡(SSAO)算法和FXAA高速反走样算法,等有时间就把当中的相关原理和当中遇到的问题进行总结发表.

  3. 【翻译自mos文章】 11gR1版本号 asmcmd的新命令--cp、md_backup、md_restore

    11gR1版本号 asmcmd的新命令--cp.md_backup.md_restore 參考原文: ASMCMD - New commands in 11gR1 (Doc ID 451900.1) ...

  4. System.DirectoryServices Namespace

    https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices?view=netframework-4.7 The Syste ...

  5. pcap文件生成metadata——使用tshark解析tcpdump的pcap包

    pcap文件生成metadata #!/usr/bin/env python # -*- coding: utf-8 -*- import os import time, datetime impor ...

  6. FLAG_DISMISS_KEYGUARD & FLAG_SHOW_WHEN_LOCKED

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD): 这一个标志的意思是去掉锁屏界面,但这对安全锁(图案或者密 ...

  7. webapi+DataTables

    webapi + datatables 前言 之前写过一个关于DataTables的记录,是之前做webform的时候从后台一次性生成html代码,有很多弊端,就不多说了. 这次把最近研究的DataT ...

  8. android UI卡顿问题学习

    转自https://blog.csdn.net/joye123/article/details/79425398 https://blog.csdn.net/zhenjie_chang/article ...

  9. 使用 Object.create实现js 继承

    二.Object.create实现继承 本文将来学习第七种继承方式Object.create()方法来实现继承,关于此方法的详细描述,请戳这里.下面来通过几个实例来学习该方法的使用: var Pare ...

  10. ZBrush软件如何编辑物体

    新手在刚接触ZBrush®的时候,想要选中模型进行编辑,有时怎么都选不中,当再次画的时候只能在边上新建一个,还是不能进行编辑,遇到类似问题,你是如何解决的,本文将为您讲解ZBrush中怎么选中物体并进 ...