【转】Hadoop学习--第三篇:使用 Docker 搭建 Hadoop 集群

 

原文:使用Docker搭建hadoop集群

原文作者:繁城落叶 
原文地址:https://blog.csdn.net/Leafage_M/article/details/72633408 

说明:文中所有截图是我按原文步骤操作所截,与原文不一致。


刚开始搭建hadoop集群的时候,使用的是VMware创建的虚拟机。结果卡到心态爆炸。。。 
今天尝试使用Docker搭建hadoop集群,发现是如此的好用快捷,也比使用VMware简单。 
在这里记录一下防止以后忘记,为以后的学习做准备。


1. 获取镜像

如果是本地使用VMware搭建的话,需要准备java环境,hadoop安装包,还要配置环境变量。虽然不难,但是经常做这些工作也难免烦躁。 使用Docker容器的话,那这一切就变得简单多了。

首先要准备一个镜像,可以使用Dockerfile构建一个合适自己的镜像,或者可以在共有仓库中找一个具有hadoop环境的镜像来使用也可以。由于我是配置的阿里云的加速器,所以在阿里云的仓库中找了一个具有hadoop环境的镜像。

hadoop镜像地址

使用命令拉到本地:

docker pull registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop

下载完成之后,通过docker images 可以查看到该镜像:


2. 创建容器

有了镜像之后,我们根据该镜像创建三个容器,分别是一个Master用来作为hadoop集群的namenode,剩下两个Slave用来作为datanode。

可以使用命令:

docker run -i -t --name Master -h Master registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash

参数解释:

  • -h 为该容器设置了主机名,这里设置为Master,否则创建容器之后是一串随机的数字和字母不好辨认使用。
  • --name  指定容器的名字,也是为了方便区分使用
  • /bin/bash  使用bash命令

建立好Master节点的容器之后,再分别使用两次该命令,创建两个Slave节点。稍微改变其中的参数即可:

例如创建Slave1、Slave2节点:

docker run -i -t --name Slave1 -h Slave1 registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash
docker run -i -t --name Slave2 -h Slave2 registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash

这样集群的基本环境就准备好了。


3. 配置SSH

如果是本地搭建的话,需要配置的大概分为三步: 
1)  配置java环境。 
2)  配置无秘SSH。 
3)  配置hadoop环境。

但是下载的镜像已经包含了这些内容,我们只需要简单的配置一下就可以使用了。 
在这个镜像中,有关java和hadoop的内容都存放在了/opt/tools目录下。

1)  先查看下环境变量都包含了什么

从中间可以看出包含了jdk和hadoop的bin目录,所以我们可以直接使用这两个命令。

java环境已经不需要我们来配置了。

2)  配置一下无秘的SSH

(1) 首先将SSH运行起来。注意:每个容器都需要执行这一步,否则可能报错 。

/etc/init.d/ssh start

(2) 然后生成秘钥,保存到authorized_keys中。这个地方可以看一下这篇博客:ssh-keygen 的 详解

ssh-keygen -t rsa
cat id_rsa.pub > authorized_keys

执行的总体过程如下:

注意:

  • 执行操作 #ssh-keygen -t rsa时,全部回车,采用默认值。
  • 设置authorized_keys权限:chmod 600 authorized_keys 
  • 设置.ssh目录权限:chmod 700 -R .ssh

(3) 接下来在两个Slave节点中做相同的事情,并且将每个节点生成的秘钥互相保存在authorized_keys中。

也就是说,三个节点的都是这个样子的:

(4) 接下来查看一下各自节点的ip地址,但是如果直接使用熟悉的ifconfig时,就会发现没有这个命令。可以使用ip addr查看,或者:apt-get install ifconfig net-tools,安装相关命令。

(5) 然后修改/etc/hosts,将主机名和对应的ip地址添加进去,这样做为了方便调用ssh:

如果在Master节点,想要连接到Slave1节点,可以使用:ssh 172.17.0.3,也可以使用ssh Slave1。很明显能感觉到使用主机名比较方便理解使用。

如果使用ssh Slave1之后没有提示需要输入密码,就代表成功了(第一次的话会让输入yes或者no,是为了记住该地址,如果输入yes之后就可以直接连接就像下面这样):


4. 配置hadoop

到现在为止,我们已经准备好了haoop搭建的所有基本工作。也是由于该Docker镜像为我们准备好了需要才会这么简单的。

我们只需要在配置一下hadoop相关的内容。

为了方便起见,我们可以直接在Master节点进行配置,然后使用scp命令发送到各节点覆盖原来的即可。

这里不废话,直接上代码,至于其中的意思可以参考书籍资料,或者查看这个文档:hadoop安装指南,这个文档是在VMware上配置的。

以下配置文件均在:/opt/tools/hadoop/etc/hadoop 目录下。

(1) hadoop-env.sh:修改有关java的环境

export JAVA_HOME=/opt/tools/jdk1.8.0_77

(2) core-site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://Master:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/hadoop/tmp</value>
  </property>
</configuration>

(3) hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/hadoop/data</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/hadoop/name</value>
  </property>
</configuration>

(4) mapred-site.xml

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

(5) yarn-site.xml

<configuration>
  <property>
    <name>yarn.resourcemanager.address</name>
    <value>Master:8032</value>
  </property>
  <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>Master:8030</value> 
  </property> 
  <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>Master:8031</value>
  </property>
  <property>
    <name>yarn.resourcemanager.admin.address</name>
    <value>Master:8033</value>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>Master:8088</value>
  </property>
  <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>
</configuration>

(6) 修改主节点的hadoop的一个配置文件etc/hadoop/slaves 把二级节点的名称,即为 /etc/hosts的名称加进去

Slave1
Slave2

相关目录会在格式化的时候会自动创建,hdfs-site.xml中的有关目录都是以core-site.xml中的hadoop.tmp.dir为主进行配置的,所以可以先创建hadoop.tmp.dir的目录。

然后将这些文件通过scp发送到各个Slave节点上覆盖原来的文件:

scp core-site.xml hadoop-env.sh hdfs-site.xml mapred-site.xml yarn-site.xml Slave1:/opt/tools/hadoop/etc/hadoop/
scp core-site.xml hadoop-env.sh hdfs-site.xml mapred-site.xml yarn-site.xml Slave2:/opt/tools/hadoop/etc/hadoop/

到这里为止,所有的准备工作都做好了。


5. 运行hadoop

(1) 进行格式化操作 [只有第一次启动的时候格式化]:

hadoop namenode -format

(2) 启动集群:

使用./start-all.sh,如果启动过程中提示关于0.0.0.0地址输入yes或no,输入yes即可:

(3) 在Master上使用jps查看相关进程是否启动:

(4) 在Slave节点上使用jps查看相关进程是否启动:

(5) 使用命令查看各节点信息:hadoop dfsadmin -report

(6) 然后再运行一个统计单词的例子:

Step1: 现在hsfs上创建一个文件夹:

hadoop fs -mkdir /input

Strp2: 查看该文件夹:

hadoop fs -ls /

Step3: 上传文件到hdfs,这里直接将当前目录的 LICENSE.txt、README.txt进行上传:

hadoop fs -put LICENSE.txt README.txt /input/

Step4: 之后运行相关例子:

在/opt/tools/hadoop/share/hadoop/mapreduce目录中执行:

hadoop jar hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output

这个目录不需要提前创建,运行的时候指定一下,会自动创建的。

Step5: 查看相关结果输出:

查看一下统计结果:

hadoop fs -cat /output/part-r-00000 


6. 检测集群状况

可以通过Master节点的50070端口来进行检测集群节点运行状态。

但是由于是服务器,而且是Centos系统没有图形化界面,可以采用端口映射的方法,直接在任何地方来进行查看。

通过图中的步骤就可以对运行中的Docker容器进行端口映射,这样子我们就可以通过本地的浏览器访问服务器地址的50070端口,就可以直接查看运行在Docker容器的集群状况。


7. 注意事项

      1. 当 使用 docker ps -a 发现容器状态是:Exited 时,需要启动容器:

# Master如果退出,依次执行下面语句:
docker start Master
docker exec -it Master /bin/bash
/etc/init.d/ssh start
vim /etc/hosts 

 当Master,Slave1 , Slave2都 没问题后,然后再启动 Hadoop 集群:./start-all.sh。

 2. 如果执行ssh Slave1 报错:ssh: connect to host slave1 port 22: Connection refused,可能是因为 ssh 没有启动,需要执行 /etc/init.d/ssh start。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值