天天看点

配置高可用的Hadoop平台配置高可用的Hadoop平台

  在hadoop2.x之后的版本,提出了解决单点问题的方案--ha(high available 高可用)。这篇博客阐述如何搭建高可用的hdfs和yarn,执行步骤如下:

创建hadoop用户

安装jdk

配置hosts

安装ssh

关闭防火墙

修改时区

zk(安装,启动,验证)

hdfs+ha的结构图

角色分配

环境变量配置

核心文件配置

slave

启动命令(hdfs和yarn的相关命令)

ha的切换

效果截图

  下面我们给出下载包的链接地址:

  注:若jdk无法下载,请到oracle的官网下载jdk。

  到这里安装包都准备好了,接下来我们开始搭建与配置。

<a target="_blank"></a>

useradd hadoop

passwd hadoop

 然后根据提示,设置密码。接着我给hadoop用户设置面免密码权限,也可自行添加其他权限。

chmod +w /etc/sudoers

hadoop all=(root)nopasswd:all

chmod -w /etc/sudoers

  将下载好的安装包解压到 /usr/java/jdk1.7,然后设置环境变量,命令如下:

sudo vi /etc/profile

  然后编辑配置,内容如下:

export java_home=/usr/java/jdk1.7

export path=$path:$java_home/bin

  然后使环境变量立即生效,命令如下:

source /etc/profile

  然后验证jdk是否配置成功,命令如下:

java -version

  若显示对应版本号,即表示jdk配置成功。否则,配置无效!

  集群中所有机器的hosts配置要要相同(推荐)。可以避免不必要的麻烦,用域名取代ip,方便配置。配置信息如下:

10.211.55.12 nna  # namenode active

10.211.55.13 nns  # namenode standby

10.211.55.14 dn1  # datanode1

10.211.55.15 dn2  # datanode2

10.211.55.16 dn3  # datanode3

  然后用scp命令,将hosts配置分发到各个节点。命令如下:

# 这里以nns节点为例子

scp /etc/hosts hadoop@nns:/etc/

  输入如下命令:

ssh-keygen –t rsa

  然后一路按回车键,最后在将id_rsa.pub写到authorized_keys,命令如下:

cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys

  在hadoop用户下,需要给authorized_keys赋予600的权限,不然免密码登陆无效。在其他节点只需要使用 ssh-keygen –t rsa 命令,生产对应的公钥,然后将各个节点的id_rsa.pub追加到nna节点的authorized_keys中。最后,将nna节点下的authorized_keys文件通过scp命令,分发到各个节点的 ~/.ssh/ 目录下。目录如下:

# 这里以nns节点为例子

scp ~/.ssh/authorized_keys hadoop@nns:~/.ssh/

   然后使用ssh命令相互登录,看是否实现了免密码登录,登录命令如下:

ssh nns

  若登录过程中木有提示需要输入密码,即表示密码配置成功。

  由于hadoop的节点之间需要通信(rpc机制),这样一来就需要监听对应的端口,这里我就直接将防火墙关闭了,命令如下:

chkconfig iptables off

  注:如果用于生产环境,直接关闭防火墙是存在安全隐患的,我们可以通过配置防火墙的过滤规则,即将hadoop需要监听的那些端口配置到防火墙接受规则中。关于防火墙的规则配置参见“linux防火墙配置”,或者通知公司的运维去帮忙配置管理。

  同时,也需要关闭selinux,可修改 /etc/selinux/config 文件,将其中的 selinux=enforcing 改为 selinux=disabled即可。

  各个节点的时间如果不同步,会出现启动异常,或其他原因。这里将时间统一设置为shanghai时区。命令如下:

# cp /usr/share/zoneinfo/asia/shanghai /etc/localtime

cp: overwrite `/etc/localtime'? yes

修改为中国的东八区

# vi /etc/sysconfig/clock

zone="asia/shanghai"

utc=false

arc=false

  将下载好的安装包,解压到指定位置,这里为直接解压到当前位置,命令如下:

tar -zxvf zk-{version}.tar.gz

  修改zk配置,将zk安装目录下conf/zoo_sample.cfg重命名zoo.cfg,修改其中的内容:

# the number of milliseconds of each tick

# 服务器与客户端之间交互的基本时间单元(ms)

ticktime=2000

# the number of ticks that the initial

# synchronization phase can take

# zookeeper所能接受的客户端数量

initlimit=10

# the number of ticks that can pass between

# sending a request and getting an acknowledgement

# 服务器和客户端之间请求和应答之间的时间间隔

synclimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just

# example sakes.

# 保存zookeeper数据,日志的路径

datadir=/home/hadoop/data/zookeeper

# the port at which the clients will connect

# 客户端与zookeeper相互交互的端口

clientport=2181

server.1= dn1:2888:3888

server.2= dn2:2888:3888

server.3= dn3:2888:3888

#server.a=b:c:d

#其中a是一个数字,代表这是第几号服务器;b是服务器的ip地址;

#c表示服务器与群集中的“领导者”交换信息的端口;当领导者失效后,d表示用来执行选举时服务器相互通信的端口。

  接下来,在配置的datadir目录下创建一个myid文件,里面写入一个0-255之间的一个随意数字,每个zk上这个文件的数字要是不一样的,这些数字应该是从1开始,依次写每个服务器。文件中序号要与dn节点下的zk配置序号一直,如:server.1=dn1:2888:3888,那么dn1节点下的myid配置文件应该写上1。

  分别在各个dn节点启动zk进程,命令如下:

bin/zkserver.sh start

  然后,在各个节点输入jps命令,会出现如下进程:

quorumpeermain

  上面说的输入jps命令,若显示对应的进程,即表示启动成功,同样我们也可以输入zk的状态命令查看,命令如下:

bin/zkserver.sh status

  会出现一个leader和两个follower。

  hdfs配置ha的结构图如下所示:

配置高可用的Hadoop平台配置高可用的Hadoop平台

  上图大致架构包括:

  1. 利用共享存储来在两个nn间同步edits信息。以前的hdfs是share nothing but nn,现在nn又share storage,这样其实是转移了单点故障的位置,但中高端的存储设备内部都有各种raid以及冗余硬件,包括电源以及网卡等,比服务器的可靠性还是略有 提高。通过nn内部每次元数据变动后的flush操作,加上nfs的close-to-open,数据的一致性得到了保证。

  2. dn同时向两个nn汇报块信息。这是让standby nn保持集群的最新状态的必须步骤。

  3. 用于监视和控制nn进程的failovercontroller进程。显然,我们不能在nn进程内部进行心跳等信息同步,最简单的原因,一次fullgc 就可以让nn挂起十几分钟,所以,必须要有一个独立的短小精悍的watchdog来专门负责监控。这也是一个松耦合的设计,便于扩展或更改,目前版本里是 用zookeeper(简称zk)来做同步锁,但用户可以方便的把这个zookeeper failovercontroller(简称zkfc)替换为其他的ha方案或leader选举方案。

  4. 隔离(fencing),防止脑裂,就是保证在任何时候只有一个主nn,包括三个方面:

    共享存储fencing,确保只有一个nn可以写入edits。

    客户端fencing,确保只有一个nn可以响应客户端的请求。

    dn fencing,确保只有一个nn向dn下发命令,譬如删除块,复制块等等。

名称

host

职责

nna

10.211.55.12

zkfc

nns

10.211.55.13

dn1

10.211.55.14

zookeeper

dn2

10.211.55.15

dn3

10.211.55.16

  这里列出了所有的配置,后面配置其他组件,可以参考这里的配置。 配置完成后,输入:. /etc/profile(或source /etc/profile)使之立即生效。严重是否环境变量配置成功与否,输入:echo $hadoop_home,若输出对应的配置路径,即可认定配置成功。

  注:hadoop2.x以后的版本conf文件夹改为etc文件夹了

  配置内容如下所示:

export hadoop_home=/home/hadoop/hadoop-2.6.0

export zk_home=/home/hadoop/zookeeper-3.4.6

export path=$path:$java_home/bin:$hadoop_home/bin:$hadoop_hom

  注:这里特别提醒,配置文件中的路径在启动集群之前,得存在(若不存在,请事先创建)。下面为给出本篇文章需要创建的路径脚本,命令如下:

mkdir -p /home/hadoop/tmp

mkdir -p /home/hadoop/data/tmp/journal

mkdir -p /home/hadoop/data/dfs/name

mkdir -p /home/hadoop/data/dfs/data

mkdir -p /home/hadoop/data/yarn/local

mkdir -p /home/hadoop/log/yarn

core-site.xml

&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;configuration&gt;

&lt;property&gt;

&lt;name&gt;fs.defaultfs&lt;/name&gt;

&lt;value&gt;hdfs://cluster1&lt;/value&gt;

&lt;/property&gt;

&lt;name&gt;io.file.buffer.size&lt;/name&gt;

&lt;value&gt;131072&lt;/value&gt;

&lt;name&gt;hadoop.tmp.dir&lt;/name&gt;

&lt;value&gt;/home/hadoop/tmp&lt;/value&gt;

&lt;name&gt;hadoop.proxyuser.hduser.hosts&lt;/name&gt;

&lt;value&gt;*&lt;/value&gt;

&lt;name&gt;hadoop.proxyuser.hduser.groups&lt;/name&gt;

&lt;name&gt;ha.zookeeper.quorum&lt;/name&gt;

&lt;value&gt;dn1:2181,dn2:2181,dn3:2181&lt;/value&gt;

&lt;/configuration&gt;

hdfs-site.xml

&lt;name&gt;dfs.nameservices&lt;/name&gt;

&lt;value&gt;cluster1&lt;/value&gt;

&lt;name&gt;dfs.ha.namenodes.cluster1&lt;/name&gt;

&lt;value&gt;nna,nns&lt;/value&gt;

&lt;name&gt;dfs.namenode.rpc-address.cluster1.nna&lt;/name&gt;

&lt;value&gt;nna:9000&lt;/value&gt;

&lt;name&gt;dfs.namenode.rpc-address.cluster1.nns&lt;/name&gt;

&lt;value&gt;nns:9000&lt;/value&gt;

&lt;name&gt;dfs.namenode.http-address.cluster1.nna&lt;/name&gt;

&lt;value&gt;nna:50070&lt;/value&gt;

&lt;name&gt;dfs.namenode.http-address.cluster1.nns&lt;/name&gt;

&lt;value&gt;nns:50070&lt;/value&gt;

&lt;name&gt;dfs.namenode.shared.edits.dir&lt;/name&gt;

&lt;value&gt;qjournal://dn1:8485;dn2:8485;dn3:8485/cluster1&lt;/value&gt;

&lt;name&gt;dfs.client.failover.proxy.provider.cluster1&lt;/name&gt;

&lt;value&gt;org.apache.hadoop.hdfs.server.namenode.ha.configuredfailoverproxyprovider&lt;/value&gt;

&lt;name&gt;dfs.ha.fencing.methods&lt;/name&gt;

&lt;value&gt;sshfence&lt;/value&gt;

&lt;name&gt;dfs.ha.fencing.ssh.private-key-files&lt;/name&gt;

&lt;value&gt;/home/hadoop/.ssh/id_rsa&lt;/value&gt;

&lt;name&gt;dfs.journalnode.edits.dir&lt;/name&gt;

&lt;value&gt;/home/hadoop/data/tmp/journal&lt;/value&gt;

&lt;name&gt;dfs.ha.automatic-failover.enabled&lt;/name&gt;

&lt;value&gt;true&lt;/value&gt;

&lt;name&gt;dfs.namenode.name.dir&lt;/name&gt;

&lt;value&gt;/home/hadoop/data/dfs/name&lt;/value&gt;

&lt;name&gt;dfs.datanode.data.dir&lt;/name&gt;

&lt;value&gt;/home/hadoop/data/dfs/data&lt;/value&gt;

&lt;name&gt;dfs.replication&lt;/name&gt;

&lt;value&gt;3&lt;/value&gt;

&lt;name&gt;dfs.webhdfs.enabled&lt;/name&gt;

&lt;name&gt;dfs.journalnode.http-address&lt;/name&gt;

&lt;value&gt;0.0.0.0:8480&lt;/value&gt;

&lt;name&gt;dfs.journalnode.rpc-address&lt;/name&gt;

&lt;value&gt;0.0.0.0:8485&lt;/value&gt;

map-site.xml

&lt;name&gt;mapreduce.framework.name&lt;/name&gt;

&lt;value&gt;yarn&lt;/value&gt;

&lt;name&gt;mapreduce.jobhistory.address&lt;/name&gt;

&lt;value&gt;nna:10020&lt;/value&gt;

&lt;name&gt;mapreduce.jobhistory.webapp.address&lt;/name&gt;

&lt;value&gt;nna:19888&lt;/value&gt;

yarn-site.xml

&lt;name&gt;yarn.resourcemanager.connect.retry-interval.ms&lt;/name&gt;

&lt;value&gt;2000&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.ha.enabled&lt;/name&gt;

&lt;name&gt;yarn.resourcemanager.ha.rm-ids&lt;/name&gt;

&lt;value&gt;rm1,rm2&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.ha.automatic-failover.enabled&lt;/name&gt;

&lt;name&gt;yarn.resourcemanager.hostname.rm1&lt;/name&gt;

&lt;value&gt;nna&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.hostname.rm2&lt;/name&gt;

&lt;value&gt;nns&lt;/value&gt;

&lt;!--在namenode1上配置rm1,在namenode2上配置rm2,注意:一般都喜欢把配置好的文件远程复制到其它机器上,但这个在yarn的另一个机器上一定要修改 --&gt;

&lt;name&gt;yarn.resourcemanager.ha.id&lt;/name&gt;

&lt;value&gt;rm1&lt;/value&gt;

&lt;!--开启自动恢复功能 --&gt;

&lt;name&gt;yarn.resourcemanager.recovery.enabled&lt;/name&gt;

&lt;!--配置与zookeeper的连接地址 --&gt;

&lt;name&gt;yarn.resourcemanager.zk-state-store.address&lt;/name&gt;

&lt;name&gt;yarn.resourcemanager.store.class&lt;/name&gt;

&lt;value&gt;org.apache.hadoop.yarn.server.resourcemanager.recovery.zkrmstatestore&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.zk-address&lt;/name&gt;

&lt;name&gt;yarn.resourcemanager.cluster-id&lt;/name&gt;

&lt;value&gt;cluster1-yarn&lt;/value&gt;

&lt;!--schelduler失联等待连接时间 --&gt;

&lt;name&gt;yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms&lt;/name&gt;

&lt;value&gt;5000&lt;/value&gt;

&lt;!--配置rm1 --&gt;

&lt;name&gt;yarn.resourcemanager.address.rm1&lt;/name&gt;

&lt;value&gt;nna:8132&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.scheduler.address.rm1&lt;/name&gt;

&lt;value&gt;nna:8130&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.webapp.address.rm1&lt;/name&gt;

&lt;value&gt;nna:8188&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.resource-tracker.address.rm1&lt;/name&gt;

&lt;value&gt;nna:8131&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.admin.address.rm1&lt;/name&gt;

&lt;value&gt;nna:8033&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.ha.admin.address.rm1&lt;/name&gt;

&lt;value&gt;nna:23142&lt;/value&gt;

&lt;!--配置rm2 --&gt;

&lt;name&gt;yarn.resourcemanager.address.rm2&lt;/name&gt;

&lt;value&gt;nns:8132&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.scheduler.address.rm2&lt;/name&gt;

&lt;value&gt;nns:8130&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.webapp.address.rm2&lt;/name&gt;

&lt;value&gt;nns:8188&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.resource-tracker.address.rm2&lt;/name&gt;

&lt;value&gt;nns:8131&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.admin.address.rm2&lt;/name&gt;

&lt;value&gt;nns:8033&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.ha.admin.address.rm2&lt;/name&gt;

&lt;value&gt;nns:23142&lt;/value&gt;

&lt;name&gt;yarn.nodemanager.aux-services&lt;/name&gt;

&lt;value&gt;mapreduce_shuffle&lt;/value&gt;

&lt;name&gt;yarn.nodemanager.aux-services.mapreduce.shuffle.class&lt;/name&gt;

&lt;value&gt;org.apache.hadoop.mapred.shufflehandler&lt;/value&gt;

&lt;name&gt;yarn.nodemanager.local-dirs&lt;/name&gt;

&lt;value&gt;/home/hadoop/data/yarn/local&lt;/value&gt;

&lt;name&gt;yarn.nodemanager.log-dirs&lt;/name&gt;

&lt;value&gt;/home/hadoop/log/yarn&lt;/value&gt;

&lt;name&gt;mapreduce.shuffle.port&lt;/name&gt;

&lt;value&gt;23080&lt;/value&gt;

&lt;!--故障处理类 --&gt;

&lt;name&gt;yarn.client.failover-proxy-provider&lt;/name&gt;

&lt;value&gt;org.apache.hadoop.yarn.client.configuredrmfailoverproxyprovider&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.ha.automatic-failover.zk-base-path&lt;/name&gt;

&lt;value&gt;/yarn-leader-election&lt;/value&gt;

hadoop-env.sh

# the java implementation to use.

yarn-env.sh

# some java parameters

2.12slave

  修改hadoop安装目录下的slave文件:

  由于我们配置了qjm,所以我们需要先启动qjm的服务,启动顺序如下所示:

进入到dn节点,启动zk的服务:zkserver.sh start,之后可以输入zkserver.sh status查看启动状态,本次我们配置了三个dn节点,会出现一个leader和两个follower。输入jps,会显示启动进程:quorumpeermain

在nn节点上(选一台即可,这里我选择的是一台预nna节点),然后启动journalnode服务,命令如下:hadoop-daemons.sh start journalnode。或者单独进入到每个dn输入启动命令:hadoop-daemon.sh start journalnode。输入jps显示启动进程:journalnode。

接着若是配置后,我们首次启动,需要格式化hdfs,命令如下:hadoop namenode –format。

之后我们需要格式化zk,命令如下:hdfs zkfc –formatzk。

接着我们启动hdfs和yarn,命令如下:start-dfs.sh和start-yarn.sh,我们在nna输入jps查看进程,显示如下:dfszkfailovercontroller,namenode,resourcemanager。

接着我们在nns输入jps查看,发现只有dfszkfailovercontroller进程,这里我们需要手动启动nns上的namenode和resourcemanager进程,命令如下:hadoop-daemon.sh start namenode和yarn-daemon.sh start resourcemanager。需要注意的是,在nns上的yarn-site.xml中,需要配置指向nns,属性配置为rm2,在nna中配置的是rm1。

最后我们需要同步nna节点的元数据,命令如下:hdfs namenode –bootstrapstandby,若执行正常,日志最后显示如下信息:

15/02/21 10:30:59 info common.storage: storage directory /home/hadoop/data/dfs/name has been successfully formatted.

15/02/21 10:30:59 warn common.util: path /home/hadoop/data/dfs/name should be specified as a uri in configuration files. please update hdfs configuration.

15/02/21 10:31:00 info namenode.transferfsimage: opening connection to http://nna:50070/imagetransfer?getimage=1&amp;txid=0&amp;storageinfo=-60:1079068934:0:cid-1dd0c11e-b27e-4651-aad6-73bc7dd820bd

15/02/21 10:31:01 info namenode.transferfsimage: image transfer timeout configured to 60000 milliseconds

15/02/21 10:31:01 info namenode.transferfsimage: transfer took 0.01s at 0.00 kb/s

15/02/21 10:31:01 info namenode.transferfsimage: downloaded file fsimage.ckpt_0000000000000000000 size 353 bytes.

15/02/21 10:31:01 info util.exitutil: exiting with status 0

15/02/21 10:31:01 info namenode.namenode: shutdown_msg: /************************************************************ shutdown_msg: shutting down namenode at nns/10.211.55.13 ************************************************************/

  由于我配置的是自动切换,若nna节点宕掉,nns节点会立即由standby状态切换为active状态。若是配置的手动状态,可以输入如下命令进行人工切换:

hdfs haadmin -failover --forcefence --forceactive nna nns

  这条命令的意思是,将nna变成standby,nns变成active。而且手动状态下需要重启服务。

配置高可用的Hadoop平台配置高可用的Hadoop平台
配置高可用的Hadoop平台配置高可用的Hadoop平台
配置高可用的Hadoop平台配置高可用的Hadoop平台
配置高可用的Hadoop平台配置高可用的Hadoop平台

  这篇文章就赘述到这里,若在配置过程中有什么疑问或问题,可以加入qq群讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

----------------------------------------------------------------------------------------------------------------------------