博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【hadoop】5.完全分布式模式
阅读量:6620 次
发布时间:2019-06-25

本文共 6622 字,大约阅读时间需要 22 分钟。

hot3.png

简介

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

从本章节你可以学习到:

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

1、准备环境

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

192.168.102.133 h133192.168.102.134 h134192.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)); thenecho no args;exit;fi# 2. get file name.p1=$1fname=`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:$pdirdone

注意最后的循环部分,是用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.2jdk1.8.0_131----------h134---------hadoop-2.7.2jdk1.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:

fs.defaultFS
hdfs://h133:8020
hadoop.tmp.dir
/opt/module/hadoop-2.7.2/data/tmp

2、配置HDFS

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

(1)hadoop-env.sh:

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

(2)hdfs-site.xml:

dfs.replication
3
dfs.namenode.secondary.http-address
h135:50090

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

h133h134h135

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:

yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname
h134

5、配置MapReduce

最后我们配置MapReduce组件

(1)mapred-env.sh

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

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

mapreduce.framework.name
yarn

接下来,我们的配置工作就在一台机器上完成了。这样的操作我们还需要从其他集群机器上再来一次,不过不必那么麻烦,直接使用我们前面的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 NameNode2347 DataNode2575 Jps----------h134---------2513 DataNode2607 Jps----------h135---------2168 Jps2009 DataNode2073 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 Jps2227 NameNode2615 NodeManager2347 DataNode----------h134---------2656 ResourceManager2513 DataNode2754 NodeManager3055 Jps----------h135---------2320 Jps2211 NodeManager2009 DataNode2073 SecondaryNameNode

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

如果中间过程出错了,要回退到初始状态,只需要停止所有的集群节点sbin/stop-xxx.sh,然后删除各服务器的{HADOOP_HOME}/data 以及 {HADOOP_HOME}/logs之后。盘查完问题在从头来过。

参考

  1. 官方网站:
  2. 官方文档:
  3. 官方文档:
  4. 书籍《hadoop权威指南 第四版》

转载于:https://my.oschina.net/u/3091870/blog/2996276

你可能感兴趣的文章
centos7.2 环境下 mysql-5.1.73 安装配置
查看>>
在w3cschool学完html,css,javascript,jquery以后,还是不会做前端怎么办?
查看>>
二分查找
查看>>
angular 单页应用程序实现浏览器后退按钮跳转到前一页面,优化用户体验
查看>>
CSS3选择器用法小结
查看>>
iphone 源码推荐:BASequenceControl
查看>>
link-hover-visited-active
查看>>
用ie调试的时候显示:脚本调试程序无法连接到目标进程,已附加调试程序。...
查看>>
Sybase 出错解决步骤
查看>>
母函数问题【转】
查看>>
Hadoop之mapreduce 实例二
查看>>
【JDK和Open JDK】平常使用的JDK和Open JDK有什么区别
查看>>
数据库编程
查看>>
实体类中用基本类型好,还是用包装类型
查看>>
readl(), writel() 函数使用举例
查看>>
linux的命令
查看>>
IE11 开启F12开发人员工具中的 始终从服务器刷新
查看>>
取得某个数组前key大 PHP实现
查看>>
用友NC V6.3打造集团企业高效信息平台
查看>>
Python web前端 07 函数及作用域
查看>>