文档章节

【hadoop】5.完全分布式模式

Areya
 Areya
发布于 01/03 09:19
字数 3040
阅读 3
收藏 0

简介

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

从本章节你可以学习到:

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

1、准备环境

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

192.168.102.133 h133
192.168.102.134 h134
192.168.102.135 h135

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

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

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

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

如果您使用的是xshell进行各服务器的连接,最好使用工具-发送键到所有会话功能,一次性配置三台主机。

2、准备工作:配置SSH无秘钥登录

现在我们已经在3台机器上(h133、h134以及h135)。在使用scp的命令过程中,你会发现每次都要输入节点的账户密码才行,如果你安装了ssh(必装),每次输入ssh访问其他机器的时候,也需要输入密码。这不仅让我们操作起来非常麻烦,而且hadoop的一些集成脚本(如start-dfs.sh等)无法直接运行,需要我们配置ssh无密码登录。

1、进入用户的home目录

# cd ~

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

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

# ssh-keygen -t rsa

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

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、准备工作:编写集群辅助脚本

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

3.1、编写xsync脚本

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

1、安装rsync命令工具

# yum install rsync -y

最小化安装的centos一般没有配备这个工具,需要我们从镜像仓库拉取安装。

2、测试远程复制

# 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)进行循环处理的,如果您的环境不同,请修改脚本此处的具体内容。

3、修改脚本运行权限

chmod 777 /usr/local/bin

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

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

xsync test.txt

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

3.2、编写xcall脚本

根据前面一个脚本的经验,我们不妨在编写一个脚本,可以执行

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

1、在/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的方式执行的,也就是说,任何命令都是登录到目标主机之后在执行的,这就会导致目录的不一致问题,因此,我们需要提供的路径信息必须是绝对路径。

2、暴力授权:

# chmod 777 xcall

3、测试脚本

[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、集群规划及配置

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

4.1、集群规划

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

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

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

4.2、配置文件

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

所有的配置文件都位于/opt/module/hadoop-2.7.2/etc/hadoop/下。以下配置是针对我的环境进行配置的,注意一些配置的值需要和你的环境保持对应。

1、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>

2、配置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下。

4、配置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>

5、配置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脚本就可以了。

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

6、分发配置文件 来到hadoop配置文件上一级,将hadoop文件夹整体分发到集群的所有节点即可完成配置文件的同步。

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

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

5、启动集群

前面我们启动集群的时候是一个节点一个节点的启动的,现在我们使用集成脚本来启动集群。

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

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

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

[h133]# hdfs namenode -format

2、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节点,则说明有问题,请查看自己哪一步出现问题了。

4、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权威指南 第四版》

© 著作权归作者所有

Areya
粉丝 28
博文 95
码字总数 164784
作品 0
广州
私信 提问
hadoop本地(独立)模式-安装

本人博客开始迁移,博客整个架构自己搭建及编码http://www.cookqq.com/listBlog.action 本地(独立)模式 Hadoop的默认配置即为本地模式,此时Hadoop使用本地文件系统而非分布式文件系统,而且...

cookqq
2013/04/11
3K
0
Hadoop单机版和伪分布式部署

说明:本文的hadoop安装环境为Ubuntu环境。 运行Hadoop集群的准备工作 1. 安装JDK,配置Java环境 2. SSH免登录(这一步可以忽略,但是启动hadoop的时候,需要手动为每个节点服务输入密码) 先确...

Mr_YangFei
2016/03/24
69
0
Apache Hadoop 入门教程第四章

运行在单节点的 YARN 您可以通过设置几个参数,另外运行 ResourceManager 的守护进程和 NodeManager 守护进程以伪分布式模式在 YARN 上运行 MapReduce job。 以下是运行步骤。 (1)配置 et...

哈斗篷
2018/05/10
0
0
部署hadoop集群

Hadoop部署 1. 安装完全分布式Hadoop 1.1 安装准备工作 1.1.1 规划 本安装示例将使用六台服务器(CentOS 6.5 64bit)来实现,其规划如下所示: IP地址 主机名 运行的进程或扮演的角色192.168.4...

杜保强
2015/11/06
0
0
好程序员大数据笔记之:Hadoop集群搭建

在学习大数据的过程中,我们接触了很多关于Hadoop的理论和操作性的知识点,尤其在近期学习的Hadoop集群的搭建问题上,小细节,小难点拼频频出现,所以,今天集中总结以下笔记,希望对各位同学...

好程序员IT
05/21
17
0

没有更多内容

加载失败,请刷新页面

加载更多

Cantata 8.0有哪些新变化

Cantata 8.0 于2018年5月发布,这一重大版本的升级在以往技术的基础上增添了关键性新功能,并且对用户界面进行了全面改进,这个文档简要介绍了8.0中的主要变化。 Cantata 于2018年5月发布,本...

旋极科技
27分钟前
7
0
在线客服系统企业用的如何?

现在很多企业都在使用在线客服系统,但是销售订单没有显著增加这是为什么呢? 一:我们企业的客服人员是否有做好真正的接待工作? 是否每天都有对网站上的访客进行接待? 相关管理人员有没有做...

唯喏
37分钟前
5
0
Hystrix实现主线程和子线程的ThreadLocal上下文传递

问题描述 我在使用日志链路追踪的时候(基于SLF4J MDC机制实现日志的链路追踪),我发现使用Hystrix线程池隔离的时候,我不能将子线程没有复制主线程的MDC上下文(Slf4j MDC机制 ),导致日志链...

xiaolyuh
43分钟前
5
0
基于CentOS7搭建GitLab

基于CentOS7搭建GitLab 12018.11.02 16:38:51字数 959阅读 3790 本文作者:蓝雄威,叩丁狼高级讲师。原创文章,转载请注明出处。 一、简介 Git Lab GitLab是利用 Ruby on Rails 一个开源的版...

linjin200
44分钟前
4
0
AJAX技术

1.1 准备工作 因为AJAX也需要请求服务器,异步请求也是请求服务器,所以我们需要先写好服务器端代码,即编写一个Servlet! 这里,Servlet很简单,只需要输出“Hello AJAX!”。 public class...

Pak_key
45分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部