【hadoop】5.彻底分布式模式

简介

前面咱们讲到了hadoop拥有3种运行模式,搭建了最简答的本地运行模式并在其上运行了两个简单案例,以后搭建了伪分布模式,并在其上运行了wordcount案例。本章节咱们学习彻底分布式的模式。顾名思义,该模式使用多台机器实现分布式。node

从本章节你能够学习到:shell

  1. hadoop的彻底分布式模式的搭建;
  2. 在彻底分布式模式下运行wordcount案例;
  3. 编写脚本实现一键多台服务器文件同步;
  4. 编写脚本实现一条命令多条服务器同步执行;

一、准备环境

咱们准备3台机器(分布式最小需求),其主机文件配置以下:apache

192.168.102.133 h133
192.168.102.134 h134
192.168.102.135 h135

也就是说,咱们准备的3台机器,主机名以h开头,13三、134以及135分别是他们的v4地址的最后一段,方便区别。centos

主机配置文件位于/etc/hosts,修改主机名使用命令hostname h133bash

3台机器都关闭防火墙systemctl stop firewalld服务器

按本地运行模式的安装方式hadoop安装在3台机器上,请参考本教程的2.运行环境搭建章节。ssh

若是您使用的是xshell进行各服务器的链接,最好使用工具-发送键到全部会话功能,一次性配置三台主机。分布式

二、准备工做:配置SSH无秘钥登陆

如今咱们已经在3台机器上(h13三、h134以及h135)。在使用scp的命令过程当中,你会发现每次都要输入节点的帐户密码才行,若是你安装了ssh(必装),每次输入ssh访问其余机器的时候,也须要输入密码。这不只让咱们操做起来很是麻烦,并且hadoop的一些集成脚本(如start-dfs.sh等)没法直接运行,须要咱们配置ssh无密码登陆。工具

一、进入用户的home目录oop

# cd ~

cd ~ 进入当前用户的用户目录。root用户为/root,其余用户的为/home/{$username}

二、进入.ssh目录,在该目录下生成秘钥对

# ssh-keygen -t rsa

输入该指令后连续3次回车,即关于秘钥对的设置都使用默认值。

三、复制秘钥对的公钥信息到各台服务器上,包括本身

# ssh-copy-id h133
# ssh-copy-id h134
# ssh-copy-id h135

注意不要漏掉主机自己的配置。

如今咱们能够从h133上直接经过命令'ssh hostname'无秘钥登陆到指定的主机上了。

通常状况下,咱们只需针对一台机器作此配置就能够了。可是因为咱们还会在另一台机器上就行调度,所以,还须要在h134主机上作此配置。也就说,3台机器里面,咱们选定两台配置无秘钥登陆。h135上的操做流程同刚才的,继续执行一遍便可。

.ssh目录下默认没有文件,当咱们第一次使用远程登陆命令以后会生成一个名为known_hosts的文件,记录访问的服务器信息;当咱们执行生成秘钥对命令以后,会生成公私钥两个文件id_rsaid_rsa.pub;当当前服务器接受了别的服务器的ssh-copy-id即被复制了公钥以后,会新生成文件authorized_keys,该文件记录认证了的主机及其秘钥对的公钥信息。

三、准备工做:编写集群辅助脚本

为了咱们接下来方便进行一些操做,咱们编写几个辅助脚本辅助操做。

3.一、编写xsync脚本

以前咱们进行远程文件调用的时候使用的是scp命令,但要注意,scp命令顾名思义是security copy的缩写,若目标拥有相同的文件,则会覆盖更新。而rsync则表明同步的意思,若文件没有修改,则不会复制,如有修改,则会更新。从这个角度上来看rsync相对比较快速一些。具体其余的差异,可能须要具体研究。

一、安装rsync命令工具

# yum install rsync -y

最小化安装的centos通常没有配备这个工具,须要咱们从镜像仓库拉取安装。

二、测试远程复制

# rsync -rvl test.txt root@h134:~

了解了rsync以后。

接下来咱们编写一个脚本,内部调用rsync命令帮咱们完成一个这样的操做:咱们只需执行命令

# xsync /目录/.../文件

就能够将指定的路径同步到其余的服务器上,这样就省去咱们打太多命令的麻烦。在/usr/local/bin下建立脚本文件xsync,写入以下内容:

#!/bin/bash
# 1. get param num,if 0 exit.
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi

# 2. get file name.
p1=$1
fname=`basename $p1`
echo fname=$fname

# 3. get parent dir absolute path.
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

# 4. get user name.
user=`whoami`

# 5. loop all hosts to run command 'rsync -rvl'.
for((host=133; host<=135; host++)); do
        echo $pdir/$fname $user@h$host:$pdir
        echo --------------- h$host ----------------
        rsync -rvl $pdir/$fname $user@h$host:$pdir
done

注意最后的循环部分,是用h加上133到135拼接目标主机名(拼接结果依次为h133 h134 h135)进行循环处理的,若是您的环境不一样,请修改脚本此处的具体内容。

三、修改脚本运行权限

chmod 777 /usr/local/bin

777是一种很暴力的受权方式,相关受权的知识推荐书籍《Linux从入门到放弃 鸟哥版》。

四、执行脚本进行测试,在任何位置建立一个文件test.txt并写入内容,使用命令

xsync test.txt

显然,其余的两台服务器也会在相同的位置复制生成该文件。

3.二、编写xcall脚本

根据前面一个脚本的经验,咱们不妨在编写一个脚本,能够执行

相似xshell这类工具其实也有提供咱们多端同时输入的功能,这里的脚本比较简单,参数有关路径的必须填写绝对路径,不然出错。另外,能操做的服务器只涉及集群服务器,而不像xshell这类客户端同样能够自行配置。

一、在/usr/local/bin下建立xcall文件,并写入以下内容

#!/bin/bash
# 1.get parameter,no param wull be exit.
pcount=$#
if((pcount==0));then
        echo no args;
        exit;
fi

# 2.print localhost string.
echo -------------localhost----------
# 3.run command for each host.
for((host=133; host<=135; host++)); do
    echo ----------h$host---------
    ssh h$host $@
done

能够看到该脚本的执行原理是ssh h1xx command的方式执行的,也就是说,任何命令都是登陆到目标主机以后在执行的,这就会致使目录的不一致问题,所以,咱们须要提供的路径信息必须是绝对路径。

二、暴力受权:

# chmod 777 xcall

三、测试脚本

[root@localhost bin]# xcall ls /opt/module/
-------------localhost----------
----------h133---------
hadoop-2.7.2
jdk1.8.0_131
----------h134---------
hadoop-2.7.2
jdk1.8.0_131
----------h135---------
hadoop-2.7.2

四、集群规划及配置

接下来咱们规划一下集群的节点分配以及配置文件的设置。

4.一、集群规划

咱们按照下表所列的节点分配来规划咱们的集群 ||DataNode|NameNode|SecondaryNameNode|NodeManager|ResourceManager| |:-:|:-:|:-:|:-:|:-:|:-:| |h133|√|√||√|| |h134|√|||√|√| |h135|√||√|√||

也就是说,三台机都是DataNode节点,h133用做名称节点,h135用做辅助名称节点,h133和h135用做节点管理节点,h134用做资源管理节点。

NodeNode、SecondaryNameNode以及ResourceManager是比较耗费服务器资源的,所以咱们将他们分别放在三台服务器上。

4.二、配置文件

选定服务器h133,在其上进行文件配置,以后咱们再从h133上将配置文件推送到其余的集群服务就能够实现配置文件的同步了。

全部的配置文件都位于/opt/module/hadoop-2.7.2/etc/hadoop/下。如下配置是针对个人环境进行配置的,注意一些配置的值须要和你的环境保持对应。

一、core-site.xml:

<!-- 指定HDFS中NameNode的地址 -->
<property>
	<name>fs.defaultFS</name>
	<value>hdfs://h133:8020</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
	<name>hadoop.tmp.dir</name>
	<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>

二、配置HDFS

咱们先来配置HDFS组件相关的配置信息。

(1)hadoop-env.sh:

export JAVA_HOME=/opt/module/jdk1.8.0_131

(2)hdfs-site.xml:

<configuration>	
	<!-- 指定数据节点存储副本数,默认是3,所以可不配置-->
	<property>
		<name>dfs.replication</name>
		<value>3</value>
	</property>
	<!-- 指定SecondaryNameNode地址-->
	<property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>h135:50090</value>
    </property>
</configuration>

(3)配置slaves服务节点,也就是数据节点(datanode)的主机名称,咱们前面提到过,要将全部机器都做为datanode。修改slaves文件,加入以下内容:

h133
h134
h135

slaves文件的默认内容为localhost,咱们修改其为集群全部节点。salve文件一样位于/opt/module/hadoop-2.7.2/etc/hadoop下。

四、配置YARN

接下来咱们接着配置YARN组件相关的配置信息。

(1)yarn-env.sh:

export JAVA_HOME=/opt/module/jdk1.8.0_131

(2)yarn-site.xml:

<!-- reducer获取数据的方式 -->
<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
	<name>yarn.resourcemanager.hostname</name>
	<value>h134</value>
</property>

五、配置MapReduce

最后咱们配置MapReduce组件

(1)mapred-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0_131

(2)使用mapred-site.xml.tempalte模板,修改其名字为:mapred-site.xml,添加以下配置:

<!-- 指定mr运行在yarn上 -->
<property>
	<name>mapreduce.framework.name</name>
	<value>yarn</value>
</property>

接下来,咱们的配置工做就在一台机器上完成了。这样的操做咱们还须要从其余集群机器上再来一次,不过没必要那么麻烦,直接使用咱们前面的xsync脚本就能够了。

在此以前,请再一次检查你的配置文件是否有遗漏、勘误——这是个细心活。

六、分发配置文件 来到hadoop配置文件上一级,将hadoop文件夹总体分发到集群的全部节点便可完成配置文件的同步。

# cd /opt/module/hadoop-2.7.2/etc/
# xsync hadoop

执行命令后您能够在其余服务器上查看配置文件是否成功同步。

五、启动集群

前面咱们启动集群的时候是一个节点一个节点的启动的,如今咱们使用集成脚原本启动集群。

格式化NameNode的时候请在namenode所在的节点上执行操做。

若是NameNode和ResourceManager不在同一台机器上,例如咱们如今的例子。不能在NameNode上启动Yarn,应该在ResourceManager指定的服务器上启动Yarn。

一、到namenode所在服务器,即h133上格式化NameNode。

[h133]# hdfs namenode -format

二、h133上启动dfs组件

(1)调用dfs集成脚本启动

[h133]# start-dfs.sh

(2)查看节点启动状况

[h133]# xcall $JAVA_HOME/bin/jps
-------------localhost----------
----------h133---------
2227 NameNode
2347 DataNode
2575 Jps
----------h134---------
2513 DataNode
2607 Jps
----------h135---------
2168 Jps
2009 DataNode
2073 SecondaryNameNode

若是你的环境输出和这个不一致,例如h133上没有发现有NM DN节点,则说明有问题,请查看本身哪一步出现问题了。

四、h134上启动yarn组件

注意,启动dfs组件在h133。而如今,咱们切换到h134,即ResourceManager所在的服务器上执行yarn组件的启动。

(1)调用yarn集成脚本启动组件

[h134] start-yarn.sh

(2)查看启动状况

[h134 ]# xcall $JAVA_HOME/bin/jps
-------------localhost----------
----------h133---------
2721 Jps
2227 NameNode
2615 NodeManager
2347 DataNode
----------h134---------
2656 ResourceManager
2513 DataNode
2754 NodeManager
3055 Jps
----------h135---------
2320 Jps
2211 NodeManager
2009 DataNode
2073 SecondaryNameNode

若是您的进程开启状况和这个一致,恭喜你,集群搭建成功了!。

若是中间过程出错了,要回退到初始状态,只须要中止全部的集群节点sbin/stop-xxx.sh,而后删除各服务器的{HADOOP_HOME}/data 以及 {HADOOP_HOME}/logs以后。盘查完问题在从头来过。

参考

  1. 官方网站:http://hadoop.apache.org/
  2. 官方文档:https://archive.apache.org/dist/hadoop/common/hadoop-2.7.2/
  3. 官方文档:http://hadoop.apache.org/docs/r2.7.2/
  4. 书籍《hadoop权威指南 第四版》
相关文章
相关标签/搜索