1 Hadoop HA架构详解

1.1 HDFS HA背景

HDFS集群中NameNode 存在单点故障(SPOF)。对于只有一个NameNode的集群,如果NameNode机器出现意外情况,将导致整个集群无法使用,直到NameNode 重新启动。

影响HDFS集群不可用主要包括以下两种情况:一是NameNode机器宕机,将导致集群不可用,重启NameNode之后才可使用;二是计划内的NameNode节点软件或硬件升级,导致集群在短时间内不可用。

为了解决上述问题,Hadoop给出了HDFS的高可用HA方案:HDFS通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,比如处理来自客户端的RPC请求,而Standby NameNode则不对外提供服务,仅同步Active NameNode的状态,以便能够在它失败时快速进行切换。

1.2 HDFS HA架构

一个典型的HA集群,NameNode会被配置在两台独立的机器上,在任何时间上,一个NameNode处于活动状态,而另一个NameNode处于备份状态,活动状态的NameNode会响应集群中所有的客户端,备份状态的NameNode只是作为一个副本,保证在必要的时候提供一个快速的转移。

为了让Standby Node与Active Node保持同步,这两个Node都与一组称为JNS的互相独立的进程保持通信(Journal Nodes)。当Active Node上更新了namespace,它将记录修改日志发送给JNS的多数派。Standby noes将会从JNS中读取这些edits,并持续关注它们对日志的变更。Standby Node将日志变更应用在自己的namespace中,当failover发生时,Standby将会在提升自己为Active之前,确保能够从JNS中读取所有的edits,即在failover发生之前Standy持有的namespace应该与Active保持完全同步。

为了支持快速failover,Standby node持有集群中blocks的最新位置是非常必要的。为了达到这一目的,DataNodes上需要同时配置这两个Namenode的地址,同时和它们都建立心跳链接,并把block位置发送给它们。

任何时刻,只有一个Active NameNode是非常重要的,否则将会导致集群操作的混乱,那么两个NameNode将会分别有两种不同的数据状态,可能会导致数据丢失,或者状态异常,这种情况通常称为“split-brain”(脑裂,三节点通讯阻断,即集群中不同的Datanodes却看到了两个Active NameNodes)。对于JNS而言,任何时候只允许一个NameNode作为writer;在failover期间,原来的Standby Node将会接管Active的所有职能,并负责向JNS写入日志记录,这就阻止了其他NameNode基于处于Active状态的问题。

基于QJM的HDFS HA方案如上图所示,其处理流程为:集群启动后一个NameNode处于Active状态,并提供服务,处理客户端和DataNode的请求,并把editlog写到本地和share editlog(这里是QJM)中。另外一个NameNode处于Standby状态,它启动的时候加载fsimage,然后周期性的从share editlog中获取editlog,保持与Active节点的状态同步。为了实现Standby在Active挂掉后迅速提供服务,需要DataNode同时向两个NameNode汇报,使得Stadnby保存block to DataNode信息,因为NameNode启动中最费时的工作是处理所有DataNode的blockreport。为了实现热备,增加FailoverController和Zookeeper,FailoverController与Zookeeper通信,通过Zookeeper选举机制,FailoverController通过RPC让NameNode转换为Active或Standby。

1.3 HDFS HA配置要素

NameNode机器:两台配置对等的物理机器,它们分别运行Active和Standby Node。

JouralNode机器:运行JouralNodes的机器。JouralNode守护进程相当的轻量级,可以和Hadoop的其他进程部署在一起,比如NameNode、DataNode、ResourceManager等,至少需要3个且为奇数,如果你运行了N个JNS,那么它可以允许(N-1)/2个JNS进程失效并且不影响工作。

在HA集群中,Standby NameNode还会对namespace进行checkpoint操作(继承Backup Namenode的特性),因此不需要在HA集群中运行SecondaryNameNode、CheckpointNode或者BackupNode。

1.4 HDFS HA配置参数

需要在hdfs.xml中配置如下参数:

dfs.nameservices:HDFS NN的逻辑名称,例如myhdfs。

dfs.ha.namenodes.myhdfs:给定服务逻辑名称myhdfs的节点列表,如nn1、nn2。

dfs.namenode.rpc-address.myhdfs.nn1:myhdfs中nn1对外服务的RPC地址。

dfs.namenode.http-address.myhdfs.nn1:myhdfs中nn1对外服务http地址。

dfs.namenode.shared.edits.dir:JournalNode的服务地址。

dfs.journalnode.edits.dir:JournalNode在本地磁盘存放数据的位置。

dfs.ha.automatic-failover.enabled:是否开启NameNode失败自动切换。

dfs.ha.fencing.methods :配置隔离机制,通常为sshfence。

1.5 HDFS自动故障转移

HDFS的自动故障转移主要由Zookeeper和ZKFC两个组件组成。

Zookeeper集群作用主要有:一是故障监控。每个NameNode将会和Zookeeper建立一个持久session,如果NameNode失效,那么此session将会过期失效,此后Zookeeper将会通知另一个Namenode,然后触发Failover;二是NameNode选举。ZooKeeper提供了简单的机制来实现Acitve Node选举,如果当前Active失效,Standby将会获取一个特定的排他锁,那么获取锁的Node接下来将会成为Active。

ZKFC是一个Zookeeper的客户端,它主要用来监测和管理NameNodes的状态,每个NameNode机器上都会运行一个ZKFC程序,它的职责主要有:一是健康监控。ZKFC间歇性的ping NameNode,得到NameNode返回状态,如果NameNode失效或者不健康,那么ZKFS将会标记其为不健康;二是Zookeeper会话管理。当本地NaneNode运行良好时,ZKFC将会持有一个Zookeeper session,如果本地NameNode为Active,它同时也持有一个“排他锁”znode,如果session过期,那么次lock所对应的znode也将被删除;三是选举。当集群中其中一个NameNode宕机,Zookeeper会自动将另一个激活。

1.6 YARN HA架构

YARN的HA架构和HDFSHA类似,需要启动两个ResourceManager,这两个ResourceManager会向ZooKeeper集群注册,通过ZooKeeper管理它们的状态(Active或Standby)并进行自动故障转移。

2 高可用集群规划

2.1 集群规划

根据Hadoop的HA架构分析,规划整个集群由5台主机组成,具体情况如下表所示:

主机名

IP地址

安装的软件

JPS

hadoop-master1

172.16.20.81

Jdk/hadoop

Namenode/zkfc/resourcemanager/

JobHistoryServer

hadoop-master2

172.16.20.82

Jdk/hadoop

Namenode/zkfc/resourcemanager/

WebProxyServer

hadoop-slave1

172.16.20.83

Jkd/hadoop/zookeepe

Datanode/journalnode/nodemanager/

quorumPeerMain

hadoop-slave2

172.16.20.84

Jkd/hadoop/zookeeper

Datanode/journalnode/nodemanager/

quorumPeerMain

hadoop-slave3

172.16.20.85

Jkd/hadoop/zookeeper

Datanode/journalnode/nodemanager/

quorumPeerMain

需要说明以下几点:

HDFS HA通常由两个NameNode组成,一个处于Active状态,另一个处于Standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步Active NameNode的状态,以便能够在它失败时快速进行切换。

Hadoop 2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode,这里还配置了一个Zookeeper集群,用于ZKFC故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为Active状态。

YARN的ResourceManager也存在单点故障问题,这个问题在hadoop-2.4.1得到了解决:有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调。

YARN框架下的MapReduce可以开启JobHistoryServer来记录历史任务信息,否则只能查看当前正在执行的任务信息。

Zookeeper的作用是负责HDFS中NameNode主备节点的选举,和YARN框架下ResourceManaer主备节点的选举。

2.2 软件版本

操作系统:CentOS Linux release 7.0.1406

JDK:Java(TM)SE Runtime Environment (build 1.7.0_79-b15)

Hadoop:Hadoop 2.6.0-cdh5.7.1

ZooKeeper:zookeeper-3.4.5-cdh5.7.1

3 Linux环境准备

集群各节点进行如下修改配置:

3.1 创建用户并添加权限

// 切换root用户

$ su root

// 创建hadoop用户组

# groupadd hadoop

// 在hadoop用户组中创建hadoop用户

# useradd -g hadoop hadoop

// 修改用户hadoop密码

# passwd hadoop

// 修改sudoers配置文件给hadoop用户添加sudo权限

# vim /etc/sudoers

hadoop    ALL=(ALL)      ALL

// 测试是否添加权限成功

# exit

$ sudo ls /root

3.2 修改IP地址和主机名

// 切换root用户

$ su root

// 修改本机IP地址

# vim /etc/sysconfig/network-scripts/ifcfg-eth0

// 重启网络服务

# service network restart

// 修改主机名

# hostnamectl set-hostname 主机名

// 查看主机名

# hostnamectl status

3.3 设置IP地址与主机名映射

// 切换root用户

$ su root

// 编辑hosts文件

# vim /etc/hosts

172.16.20.81    hadoop-master1

172.16.20.82    hadoop-master2

172.16.20.83    hadoop-slave1

172.16.20.84    hadoop-slave2

172.16.20.85    hadoop-slave3

3.4 关闭防火墙和Selinux

// 切换root用户

$ su root

// 停止firewall防火墙

# systemctl stop firewalld.service

// 禁止firewall开机启动

# systemctl disable firewalld.service

// 开机关闭Selinux

# vim /etc/selinux/config

SELINUX=disabled

// 重启机器后root用户查看Selinux状态

# getenforce

3.5 配置SSH免密码登录

// 在hadoop-master1节点生成SSH密钥对

$ ssh-keygen -t rsa

// 将公钥复制到集群所有节点机器上

$ ssh-copy-id hadoop-master1

$ ssh-copy-id hadoop-master2

$ ssh-copy-id hadoop-slave1

$ ssh-copy-id hadoop-slave2

$ ssh-copy-id hadoop-slave3

// 通过ssh登录各节点测试是否免密码登录成功

$ ssh hadoop-master2

备注:在其余节点上执行同样的操作,确保集群中任意节点都可以ssh免密码登录到其它各节点。

3.6 安装JDK

// 卸载系统自带的openjdk

$ suroot

# rpm-qa | grep java

# rpm-e --nodeps java-1.7.0-openjdk-1.7.0.75-2.5.4.2.el7_0.x86_64

# rpm-e --nodeps java-1.7.0-openjdk-headless-1.7.0.75-2.5.4.2.el7_0.x86_64

# rpm-e --nodeps tzdata-java-2015a-1.el7_0.noarch

# exit

// 解压jdk安装包

$ tar-xvf jdk-7u79-linux-x64.tar.gz

// 删除安装包

$ rmjdk-7u79-linux-x64.tar.gz

// 修改用户环境变量

$ cd ~

$ vim.bash_profile

exportJAVA_HOME=/home/hadoop/app/jdk1.7.0_79

exportPATH=$PATH:$JAVA_HOME/bin

// 使修改的环境变量生效

$ source.bash_profile

// 测试jdk是否安装成功

$ java-version

4 集群时间同步

如果集群节点时间不同步,可能会出现节点宕机或引发其它异常问题,所以在生产环境中一般通过配置NTP服务器实现集群时间同步。本集群在hadoop-master1节点设置ntp服务器,具体方法如下:

// 切换root用户

$ su root

// 查看是否安装ntp

# rpm -qa | grep ntp

// 安装ntp

# yum install -y ntp

// 配置时间服务器

# vim /etc/ntp.conf

# 禁止所有机器连接ntp服务器

restrict default ignore

# 允许局域网内的所有机器连接ntp服务器

restrict 172.16.20.0 mask 255.255.255.0 nomodify notrap

# 使用本机作为时间服务器

server 127.127.1.0

// 启动ntp服务器

# service ntpd start

// 设置ntp服务器开机自动启动

# chkconfig ntpd on

集群其它节点通过执行crontab定时任务,每天在指定时间向ntp服务器进行时间同步,方法如下:

// 切换root用户

$ su root

// 执行定时任务,每天00:00向服务器同步时间,并写入日志

# crontab -e

0      0      *      *      *      /usr/sbin/ntpdate hadoop-master1>> /home/hadoop/ntpd.log

// 查看任务

# crontab -l

更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2016-08/134180p2.htm

5 Zookeeper集群安装

Zookeeper是一个开源分布式协调服务,其独特的Leader-Follower集群结构,很好的解决了分布式单点问题。目前主要用于诸如:统一命名服务、配置管理、锁服务、集群管理等场景。大数据应用中主要使用Zookeeper的集群管理功能。

本集群使用zookeeper-3.4.5-cdh5.7.1版本。首先在Hadoop-slave1节点安装Zookeeper,方法如下:

// 新建目录

$ mkdir app/cdh

// 解压zookeeper安装包

$ tar -xvf zookeeper-3.4.5-cdh5.7.1.tar.gz -C app/cdh/

// 删除安装包

$ rm -rf zookeeper-3.4.5-cdh5.7.1.tar.gz

// 配置用户环境变量

$ vim .bash_profile

export ZOOKEEPER_HOME=/home/hadoop/app/cdh/zookeeper-3.4.5-cdh5.7.1

export PATH=$PATH:$ZOOKEEPER_HOME/bin

// 使修改的环境变量生效

$ source.bash_profile

// 修改zookeeper的配置文件

$ cd app/cdh/zookeeper-3.4.5-cdh5.7.1/conf/

$ cp zoo_sample.cfg zoo.cfg

$ vim zoo.cfg

# 客户端心跳时间(毫秒)

tickTime=2000

# 允许心跳间隔的最大时间

initLimit=10

# 同步时限

syncLimit=5

# 数据存储目录

dataDir=/home/hadoop/app/cdh/zookeeper-3.4.5-cdh5.7.1/data

# 数据日志存储目录

dataLogDir=/home/hadoop/app/cdh/zookeeper-3.4.5-cdh5.7.1/data/log

# 端口号

clientPort=2181

# 集群节点和服务端口配置

server.1=hadoop-slave1:2888:3888

server.2=hadoop-slave2:2888:3888

server.3=hadoop-slave3:2888:3888

# 以下为优化配置

# 服务器最大连接数,默认为10,改为0表示无限制

maxClientCnxns=0

# 快照数

autopurge.snapRetainCount=3

# 快照清理时间,默认为0

autopurge.purgeInterval=1

// 创建zookeeper的数据存储目录和日志存储目录

$ cd ..

$ mkdir -p data/log

// 在data目录中创建一个文件myid,输入内容为1

$ echo "1" >> data/myid

// 修改zookeeper的日志输出路径(注意CDH版与原生版配置文件不同)

$ vim libexec/zkEnv.sh

if [ "x${ZOO_LOG_DIR}" = "x" ]

then

ZOO_LOG_DIR="$ZOOKEEPER_HOME/logs"

fi

if [ "x${ZOO_LOG4J_PROP}" = "x" ]

then

ZOO_LOG4J_PROP="INFO,ROLLINGFILE"

fi

// 修改zookeeper的日志配置文件

$ vim conf/log4j.properties

zookeeper.root.logger=INFO,ROLLINGFILE

// 创建日志目录

$ mkdir logs

将hadoop-slave1节点上的Zookeeper目录同步到hadoop-slave2和hadoop-slave3节点,并修改Zookeeper的数据文件。此外,不要忘记设置用户环境变量。

// 在hadoop-slave1中将zookeeper目录复制到其它节点

$ cd ~

$ scp -r app/cdh/zookeeper-3.4.5-cdh5.7.1hadoop-slave2:/home/hadoop/app/cdh

$ scp -r app/cdh/zookeeper-3.4.5-cdh5.7.1 hadoop-slave3:/home/hadoop/app/cdh

//在hadoop-slave2中修改data目录中的myid文件

$ echo "2" >app/cdh/zookeeper-3.4.5-cdh5.7.1/data/myid

//在hadoop-slave3中修改data目录中的myid文件

$ echo "3" >app/cdh/zookeeper-3.4.5-cdh5.7.1/data/myid

最后,在安装了Zookeeper的各节点上启动Zookeeper,并查看节点状态,方法如下:

// 启动

$ zkServer.sh start

// 查看状态

$ zkServer.sh status

// 关闭

$ zkServer.sh stop

6 Hadoop HA配置

// 在hadoop-master1节点解压hadoop安装包

$ tar-xvf hadoop-2.6.0-cdh5.7.1.tar.gz -C /home/hadoop/app/cdh/

// 删除安装包

$ rmhadoop-2.6.0-cdh5.7.1.tar.gz

// 修改hadoop-env.sh文件

$ cd/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/etc/hadoop

$ vimhadoop-env.sh

exportJAVA_HOME=/home/hadoop/app/jdk1.7.0_79

// 配置core-site.xml文件

$ vim core-site.xml

<configuration><!-- 指定hdfs的nameservices名称为mycluster,与hdfs-site.xml的HA配置相同 --><property><name>fs.defaultFS</name><value>hdfs://mycluster</value></property><!-- 指定缓存文件存储的路径 --><property><name>hadoop.tmp.dir</name><value>/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/data/tmp</value></property><!-- 配置hdfs文件被永久删除前保留的时间(单位:分钟),默认值为0表明垃圾回收站功能关闭 --><property><name>fs.trash.interval</name><value>1440</value></property><!-- 指定zookeeper地址,配置HA时需要 --><property><name>ha.zookeeper.quorum</name><value>hadoop-slave1:2181,hadoop-slave2:2181,hadoop-slave3:2181</value></property>
</configuration>

// 配置hdfs-site.xml文件

$ vim hdfs-site.xml

<configuration><!-- 指定hdfs元数据存储的路径 --><property><name>dfs.namenode.name.dir</name><value>/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/data/namenode</value></property><!-- 指定hdfs数据存储的路径 --><property><name>dfs.datanode.data.dir</name><value>/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/data/datanode</value></property><!-- 数据备份的个数 --><property><name>dfs.replication</name><value>3</value></property><!-- 关闭权限验证 --><property><name>dfs.permissions.enabled</name><value>false</value></property><!-- 开启WebHDFS功能(基于REST的接口服务) --><property><name>dfs.webhdfs.enabled</name><value>true</value></property><!-- //以下为HDFS HA的配置// --><!-- 指定hdfs的nameservices名称为mycluster --><property><name>dfs.nameservices</name><value>mycluster</value></property><!-- 指定mycluster的两个namenode的名称分别为nn1,nn2 --><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value></property><!-- 配置nn1,nn2的rpc通信端口 --><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop-master1:8020</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop-master2:8020</value></property><!-- 配置nn1,nn2的http通信端口 --><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop-master1:50070</value></property><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop-master2:50070</value></property><!-- 指定namenode元数据存储在journalnode中的路径 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop-slave1:8485;hadoop-slave2:8485;hadoop-slave3:8485/mycluster</value></property><!-- 指定journalnode日志文件存储的路径 --><property><name>dfs.journalnode.edits.dir</name><value>/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/data/journal</value></property><!-- 指定HDFS客户端连接active namenode的java类 --><property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 配置隔离机制为ssh --><property><name>dfs.ha.fencing.methods</name><value>sshfence</value></property><!-- 指定秘钥的位置 --><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/hadoop/.ssh/id_rsa</value></property><!-- 开启自动故障转移 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property>
</configuration>

// 配置mapred-site.xml文件

$ vim mapred-site.xml

<configuration><!-- 指定MapReduce计算框架使用YARN --><property><name>mapreduce.framework.name</name><value>yarn</value></property><!-- 指定jobhistory server的rpc地址 --><property><name>mapreduce.jobhistory.address</name><value>hadoop-master1:10020</value></property><!-- 指定jobhistory server的http地址 --><property><name>mapreduce.jobhistory.webapp.address</name><value>hadoop-master1:19888</value></property><!-- 开启uber模式(针对小作业的优化) --><property><name>mapreduce.job.ubertask.enable</name><value>true</value></property><!-- 配置启动uber模式的最大map数 --><property><name>mapreduce.job.ubertask.maxmaps</name><value>9</value></property><!-- 配置启动uber模式的最大reduce数 --><property><name>mapreduce.job.ubertask.maxreduces</name><value>1</value></property>
</configuration>

// 配置yarn-site.xml文件

$ vim yarn-site.xml

<configuration><!-- NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可运行MapReduce程序 --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><!-- 配置Web Application Proxy安全代理(防止yarn被攻击) --><property><name>yarn.web-proxy.address</name><value>hadoop-master2:8888</value></property><!-- 开启日志 --><property><name>yarn.log-aggregation-enable</name><value>true</value></property><!-- 配置日志删除时间为7天,-1为禁用,单位为秒 --><property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value></property><!-- 修改日志目录 --><property><name>yarn.nodemanager.remote-app-log-dir</name><value>/logs</value></property><!-- 配置nodemanager可用的资源内存 --><property><name>yarn.nodemanager.resource.memory-mb</name><value>2048</value></property><!-- 配置nodemanager可用的资源CPU --><property><name>yarn.nodemanager.resource.cpu-vcores</name><value>2</value></property><!-- //以下为YARN HA的配置// --><!-- 开启YARN HA --><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!-- 启用自动故障转移 --><property><name>yarn.resourcemanager.ha.automatic-failover.enabled</name><value>true</value></property><!-- 指定YARN HA的名称 --><property><name>yarn.resourcemanager.cluster-id</name><value>yarncluster</value></property><!-- 指定两个resourcemanager的名称 --><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><!-- 配置rm1,rm2的主机 --><property><name>yarn.resourcemanager.hostname.rm1</name><value>hadoop-master1</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>hadoop-master2</value></property><!-- 配置YARN的http端口 --><property><name>yarn.resourcemanager.webapp.address.rm1</name><value>hadoop-master1:8088</value></property>    <property><name>yarn.resourcemanager.webapp.address.rm2</name><value>hadoop-master2:8088</value></property><!-- 配置zookeeper的地址 --><property><name>yarn.resourcemanager.zk-address</name><value>hadoop-slave1:2181,hadoop-slave2:2181,hadoop-slave3:2181</value></property><!-- 配置zookeeper的存储位置 --><property><name>yarn.resourcemanager.zk-state-store.parent-path</name><value>/rmstore</value></property><!-- 开启yarn resourcemanager restart --><property><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><!-- 配置resourcemanager的状态存储到zookeeper中 --><property><name>yarn.resourcemanager.store.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property><!-- 开启yarn nodemanager restart --><property><name>yarn.nodemanager.recovery.enabled</name><value>true</value></property><!-- 配置nodemanager IPC的通信端口 --><property><name>yarn.nodemanager.address</name><value>0.0.0.0:45454</value></property>
</configuration>

// 配置slaves文件

$ vimslaves

hadoop-slave1

hadoop-slave2

hadoop-slave3

// 创建配置文件中涉及的目录

$ cd/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/

$ mkdir-p data/tmp

$ mkdir-p data/journal

$ mkdir-p data/namenode

$ mkdir-p data/datanode

// 将hadoop工作目录同步到集群其它节点

$ scp-r /home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/hadoop-master2:/home/hadoop/app/cdh/

scp -r/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/ hadoop-slave1:/home/hadoop/app/cdh/

scp -r/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/ hadoop-slave2:/home/hadoop/app/cdh/

scp -r/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/ hadoop-slave3:/home/hadoop/app/cdh/

// 在集群各节点上修改用户环境变量

$ vim .bash_profile

export HADOOP_HOME=/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1

export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

// 使修改的环境变量生效

$ source.bash_profile

// 解决本地库文件不存在的问题

在apache官网下载hadoop-2.6.0.tar.gz,解压后将lib/native下所有文件复制到$HADOOP_HOME/lib/native中。

7 Hadoop集群的初始化

// 启动zookeeper集群(分别在slave1、slave2和slave3上执行)

$ zkServer.shstart

// 格式化ZKFC(在master1上执行)

$ hdfszkfc -formatZK

// 启动journalnode(分别在slave1、slave2和slave3上执行)

$ hadoop-daemon.shstart journalnode

// 格式化HDFS(在master1上执行)

$ hdfsnamenode -format

// 将格式化后master1节点hadoop工作目录中的元数据目录复制到master2节点

$ scp-r app/cdh/hadoop-2.6.0-cdh5.7.1/data/namenode/*hadoop-master2:/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/data/namenode/

// 初始化完毕后可关闭journalnode(分别在slave1、slave2和slave3上执行)

$ hadoop-daemon.shstop journalnode

8 Hadoop集群的启动

8.1 集群启动步骤

// 启动zookeeper集群(分别在slave1、slave2和slave3执行)

$ zkServer.shstart

// 启动HDFS(在master1执行)

$ start-dfs.sh

备注:此命令分别在master1/master2节点启动了NameNode和ZKFC,分别在slave1/slave2/slave3节点启动了DataNode和JournalNode,如下图所示。

// 启动YARN(在master2执行)

$ start-yarn.sh

备注:此命令在master2节点启动了ResourceManager,分别在slave1/slave2/slave3节点启动了NodeManager。

// 启动YARN的另一个ResourceManager(在master1执行,用于容灾)

$ yarn-daemon.sh start resourcemanager

// 启动YARN的安全代理(在master2执行)

$ yarn-daemon.sh start proxyserver

备注:proxyserver充当防火墙的角色,可以提高访问集群的安全性

// 启动YARN的历史任务服务(在master1执行)

$ mr-jobhistory-daemon.sh starthistoryserver

备注:yarn-daemon.sh start historyserver已被弃用;CDH版本似乎有个问题,即mapred-site.xml配置的mapreduce.jobhistory.address和mapreduce.jobhistory.webapp.address参数似乎不起作用,实际对应的端口号是10200和8188,而且部需要配置就可以在任意节点上开启历史任务服务。

8.2 集群启动截图

hadoop-master1开启了NameNode、ResourceManager、HistoryServer和ZKFC,如下图所示:

hadoop-master2开启了NameNode、ResourceManager、ProxyServer和ZKFC,如下图所示:

hadoop-slave1、hadoop-slave2和hadoop-slave3分别开启了DataNode、JournalNode、NodeManager和ZooKeeper,如下图所示:

8.3 Web UI

下图为http://hadoop-master1:50070,可看到NameNode为active状态:

下图为http://hadoop-master2:50070,可看到NameNode为standby状态:

HDFS还有一个隐藏的UI页面http://hadoop-master1:50070/dfshealth.jsp比较好用:

下图为http://hadoop-master2:8088,可看到ResourceManager为active状态:

下图为http://hadoop-master1:8088,可看到ResourceManager为standby状态,它会自动跳转到http://hadoop-master2:8088:

下图为http://hadoop-master1:19888,可查看历史任务信息:

9 功能测试

// 向HDFS上传数据

$ hadoopfs -put webcount.txt /input

// 查看HDFS上的数据

$ hadoopfs -ls /input

$ hadoopfs -cat /input/webcount.txt

// 向YARN提交MapReduce任务,该任务用于分析网站日志文件webcount.txt统计每小时的点击次数

$ hadoopjar mr-webcount-0.0.1-SNAPSHOT.jar com.mr.demo.WebCountDriver/input/webcount.txt /output/webcount 1 1

// 在HDFS查看结果

$ hadoopfs -ls /output/webcount

$ hadoopfs -cat /output/webcount/part-r-00000

// 通过Web UI查看任务信息和历史任务信息

更多Hadoop相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-08/134180.htm

Hadoop 2.6.0 HA高可用集群配置详解相关推荐

  1. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  2. Centos7.6+Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    本文转自https://mshk.top/2019/03/centos-hadoop-zookeeper-hbase-hive-spark-high-availability/,因为原链接打不开,故在 ...

  3. Hadoop系列-YARN RM HA 高可用集群

    ResourceManager HA集群 修改 yarn-site.xml yarn-site.xml分发到其他节点 scpyarn-site.xml hadoop@hadoop-cluster-02 ...

  4. Hadoop HA 高可用集群搭建

    Hadoop HA 高可用集群搭建 一.首先配置集群信息 1 vi /etc/hosts 二.安装zookeeper 1.解压至/usr/hadoop/下 1 tar -zxvf zookeeper- ...

  5. Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)

    一.服务器环境 主机名 IP 用户名 密码 安装目录 master 192.168.142.124 root xxx /usr/hadoop-2.6.5/ slave1 192.168.142.125 ...

  6. Hadoop HA 高可用集群启动报错 Encountered exception loading fsimage 解决方案

    笔者在搭建好Hadoop HA 高可用集群启动时报如下错误,后面是解决方案. 报错信息: 2018-08-24 11:18:07,475 INFO org.apache.hadoop.hdfs.ser ...

  7. [转]HA高可用集群中“脑裂“问题解决

    什么是脑裂(split-brain) 在"双机热备"高可用(HA)系统中,当联系两个节点的"心跳线"断开时(即两个节点断开联系时),本来为一个整体.动作协调的H ...

  8. 基于Kubeadm部署Kubernetes1.13.3 HA 高可用集群

    Table of Contents 目录 基于Kubeadm部署Kubernetes1.13.3 HA 高可用集群 01. 部署目的 1.1 Kubernetes的特性 1.2 贴微服务,开发环境快速 ...

  9. 红帽436——HA高可用集群之概念篇

    一.集群概念: 集群:提高性能,降低成本,提高可扩展性,增强可靠性,任务调度室集群中的核心技术. 集群作用:保证业务不断 集群三种网络:业务网络,集群网络,存储网络 二.集群三种类型: HA:高可用集 ...

  10. conga下HA高可用集群的搭建(redhat6.5)

    实验环境 redhat6.5虚拟机三台,各1G内存,时间同步 server1  172.25.44.1 server2  172.25.44.2 server3  172.25.44.3 火墙和sel ...

最新文章

  1. 判断小数是否相等_四年级上册数学填空+计算+判断易错题整理练习,收藏练一练!...
  2. Linux的常用命令!
  3. 基尼不纯度简介 - Gini Impurity
  4. java--设计模式总结
  5. [Android基础] VideoView
  6. 【090】Excel VBA 基础
  7. 安装kerberos报错 error: command 'gcc' failed with exit status 1
  8. linux03-学习记录
  9. 如何主动触发时间选择器弹窗_请合理使用Alert弹窗
  10. 《JavaScript高级程序设计 第三版》学习笔记 (十三)高级函数
  11. Python3通过Everything SDK访问本地文件
  12. 迅雷精简版 for Mac(迅雷下载器)v4.1.2中文版
  13. Powerdesigner下载安装
  14. kaggle猫狗分类
  15. GreeDAO 使用
  16. 美多次透露加息 国债收益率持续走高
  17. 请不用条件转移指令JG,JGE,JL,JLE等指令实现如下程序片段的功能
  18. UIGestureRecognizer触控手势
  19. PKUWC2019纪中游记
  20. 第三章 产品数据 第3节 物料清单BOM

热门文章

  1. Android应用开发的一些思考
  2. asp.net页面生命周期之页面的终结阶段
  3. 【10-26】java调试技术学习笔记
  4. What decide the USB OTG port as host or device
  5. 基于C++的模板引擎
  6. png?wxfrom=5wx_lazy=1
  7. 重新加载maven项目的依赖项
  8. swift中闭包的循环引用
  9. Unity多个场景叠加或大场景处理方法小结
  10. 网页设计找灵感——汽车酷站赞赏