Hadoo集群--高可用HA配置(两台主机)

Source

目录

1 Hadoop HA架构详解

1.1 HDFS HA背景

1.2 HDFS HA架构

1.3 HDFS HA配置要素

1.4 HDFS HA配置参数

1.5 HDFS自动故障转移

1.6 YARN HA架构

2 高可用集群规划

2.1 集群规划

2.2 软件版本

3 Linux环境准备

3.1 创建用户并添加权限

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

3.3 关闭防火墙和Selinux

3.4 配置SSH免密码登录

3.6 安装JDK

4 集群时间同步

5 Zookeeper集群安装

6 Hadoop HA配置

7 Hadoop集群的初始化

--------------------------到这里你的手动故障转移已经配置成功了-----------------------------------------

8 其它说明


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架构分析,规划整个集群由2台主机组成,具体情况如下表所示:

主机名

IP地址

安装的软件

JPS

hadoop-master1

172.16.20.81

Jdk/hadoop/zookeeper

Namenode/zkfc/resourcemanager/

JobHistoryServer

hadoop-master2

172.16.20.82

Jdk/hadoop/zookeeper

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 软件版本

操作系统:Ubuntu Linux 14

JDK:Java(TM)SE Runtime Environment (jdk1.8.0_231

Hadoop:hadoop-2.10.0

ZooKeeper:zookeeper-3.4.14

3 Linux环境准备

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

3.1 创建用户并添加权限

参考:

Ubuntu系统修改用户名,主机名,保留配置。

注意:配置过程中保证用户名一致,主机名不一致;

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

千万注意:配置中如果出现连接失败,大多数原因都是hosts没配好,ip映射尽量使用具体ip对应(不要用127.0.0.1),不然会失败;

参考:

Ubuntu系统修改用户名,主机名,保留配置。

wyh@ai-lab:~$ cat /etc/hosts

127.0.0.1    localhost
110.2101.10.241    wyh
1210.101.10.241  ns1 nn1
122.128.64.128     weekend01 
120.201.10.127    ai-lab nn2

wyh@wyh:~$ cat /etc/hosts

127.0.0.1    localhost
110.201.10.127  ai-lab
21.0.1.1    sdu-All-Series-Invalid-entry-length-16-Fixed-up-to-11
21.201.10.241    wyh ns1 nn1
21.168.64.128    weekend01
10.201.10.127    nn2

注意:保持用户名一致,主机名不一致

3.3 关闭防火墙和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.4 配置SSH免密码登录

配置ssh连接

参考

Ubuntu远程连接服务器操作方法

配置免密

很多主机的时候

// 在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免密码登录到其它各节点。

我的实践

$ ssh-keygen -t rsa

$ ssh-copy-id  ai-lab

3.6 安装JDK

linux安装java.jdk环境

4 集群时间同步

自行查阅百度,一般来讲,主机时间是网络时间,是一致的

5 Zookeeper集群安装

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

本集群使用zookeeper-3.4.14版本。首先在wyh主机节点安装Zookeeper,方法如下(此次安装软件全部安装在/usr/local路径下):

1 下载解压

进入要下载的版本的目录,选择.tar.gz文件下载,这里选择zookeeper-3.4.14.tar.gz格式

下载链接:http://archive.apache.org/dist/zookeeper/


// 解压zookeeper安装包
tar -xvf zookeeper-3.4.14.tar.gz
//将安装包移动到路径
cp -r zookeeper-3.4.14 /usr/local

2 修改配置文件 zoo.cfg

//将zookeeper压缩文件解压后,我们进入到 conf 目录:
wyh@wyh:/usr/local/zookeeper-3.4.14$ cd conf
wyh@wyh:/usr/local/zookeeper-3.4.14/conf$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
//将 zoo_sample.cfg 文件复制并重命名为 zoo.cfg 文件。
wyh@wyh:/usr/local/zookeeper-3.4.14/conf$ cp zoo_sample.cfg zoo.cfg
wyh@wyh:/usr/local/zookeeper-3.4.14/conf$ ls
configuration.xsl  log4j.properties  zoo.cfg  zoo_sample.cfg
//然后通过 vim zoo.cfg 命令对该文件进行修改:
wyh@wyh:/usr/local/zookeeper-3.4.14/conf$ sudo vim zoo.cfg 

最后记得删除zoo_sample.cfg,或者更换名字,否则可能不成功

# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
##这两个地址是需要修改的地方
dataDir=/usr/local/zookeeper-3.4.14/data
dataLogDir=/usr/local/zookeeper-3.4.14/logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
##两台主机的配置
server.1=wyh:2888:3888
server.2=ai-lab:2888:3888

上面红色框住的内容即是我们修改的内容:

  ①、tickTime:基本事件单元,这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳;最小 的session过期时间为2倍tickTime

  ②、dataDir:存储内存中数据库快照的位置,除非另有说明,否则指向数据库更新的事务日志。注意:应该谨慎的选择日志存放的位置,使用专用的日志存储设备能够大大提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会很大程度上影像系统性能。

  ③、client:监听客户端连接的端口。

  ④、initLimit:允许follower连接并同步到Leader的初始化连接时间,以tickTime为单位。当初始化连接时间超过该值,则表示连接失败。

  ⑤、syncLimit:表示Leader与Follower之间发送消息时,请求和应答时间长度。如果follower在设置时间内不能与leader通信,那么此follower将会被丢弃。

  ⑥、server.A=B:C:D

    A:其中 A 是一个数字,表示这个是服务器的编号;

    B:是这个服务器的 ip 地址;

    C:Leader选举的端口;

    D:Zookeeper服务器之间的通信端口。

  我们需要修改的第一个是 dataDir ,在指定的位置处创建好目录。

  第二个需要新增的是 server.A=B:C:D 配置,其中 A 对应下面我们即将介绍的myid 文件。B是集群的各个IP地址,C:D 是端口配置。

3 创建 myid 文件

在上面指定的路径创建logs,data文件夹

在 上一步 dataDir 指定的目录下,创建 myid 文件。

因为对应主机序号是

##两台主机的配置
server.1=wyh:2888:3888
server.2=ai-lab:2888:3888

所以将wyh主机是序号1

在myid里写入1即可

wyh@wyh:/usr/local/zookeeper-3.4.14/data$ cat myid 
1

后面的机器依次在相应目录创建myid文件,写上相应配置数字即可。

4 配置环境变量

为了能够在任意目录启动zookeeper集群,我们需要配置环境变量。

  ps:你也可以不配,这不是搭建集群的必要操作,只不过如果你不配置环境变量,那么每次启动zookeeper需要到安装文件的 bin 目录下去启动。

  首先进入到 /etc/profile 目录,添加相应的配置信息:

#set zookeeper environment
export ZK_HOME=/usr/local/zookeeper-3.4.14
export PATH=$PATH:$ZK_HOME/bin

 然后通过如下命令使得环境变量生效:

source /etc/profle

5 复制配置环境

如果复制不过去,请更改/usr/local的权限

wyh@wyh:/usr/local$ sudo scp -r zookeeper-3.4.14 wyh@ai-lab:/usr/local

更改ai-lab主机的配置

wyh@ai-lab:/usr/local/zookeeper-3.4.14/data$ cat myid
2
wyh@ai-lab:/usr/local/zookeeper-3.4.14/data$ sudo vim /etc/profile
//加入
#set zookeeper environment
export ZK_HOME=/usr/local/zookeeper-3.4.14
export PATH=$PATH:$ZK_HOME/bin

6 启动zookeeper服务

 启动命令:

zkServer.sh start

  停止命令:

zkServer.sh stop

  重启命令:

zkServer.sh restart

  查看集群节点状态:

zkServer.sh status

  我们分别对集群2台机器执行启动命令。执行完毕后,分别查看集群节点状态:

  出现如下即是集群搭建成功:

wyh@wyh:/usr/local/zookeeper-3.4.14/bin$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: leader

 7 搭建问题

注意:搭建过程很难一帆风顺,一定要会看错误日志;zookeeper 日志文件目录非常有可能不在datadir配置目录下,而是在zookeeper/bin的目录下;

  如果没有出现上面的状态,说明搭建过程出了问题,那么解决问题的首先就是查看日志文件:

  zookeeper 日志文件目录在:

  dataDir 配置的目录下,文件名称为:zookeeper.out。通过查看日志来解决相应的问题。下面是两种常见的问题:

  ①、防火墙为关闭

  查看防火墙状态:

service iptables status

  关闭防火墙:

chkconfig iptables off

  ②、dataDir 配置的目录没有创建

  在 zoo.cfg 文件中,会有对 dataDir 的一项配置,需要创建该目录,并且注意要在该目录下创建 myid 文件,里面的配置和 zoo.cfg 的server.x 配置保持一致。

6 Hadoop HA配置

1.安装hadoop

参考;

linux下配置hadoop教程

安装单机hadoop

2 修改配置文件

注意:在很多配置讲解中,nameservice出现ns1,nn1,nn2配置;

经我亲自实践检测,ns1,nn1,nn2要配置对应的ip映射host文件,即/etc/hosts里面的映射;并且对应的是ip地址,比如

123.201.10.201  ns1 nn1
123.168.64.128 	weekend01
123.201.10.107	ai-lab nn2

不能是127.0.0.1这种对应,这样会出现问题,我这里配置的是ns1,nn1对应wyh主机,nn2对应ai-lab主机的ip地址

文件 core-site.xml 改为下面的配置:

<configuration>
    <!-- 指定缓存文件存储的路径 --> 
    <property>         
		<name>hadoop.tmp.dir</name>	 
		<value>/usr/local/hadoop-2.10.0/tmp</value>	 
		<description>Abase for other temporary directories.</description>	 
    </property>

      <!-- 指定hdfs的nameservices名称为ns1,与hdfs-site.xml的HA配置相同 -->  
	<property>
		<name>fs.defaultFS</name>
        <!-- 注意这个名字不是随意取,一定是包含ip和主机名映射的,这里ns1已经在/etc/hosts中有映射关系了 -->  
		<value>hdfs://ns1</value>
	</property>
    <!-- 指定zookeeper地址,配置HA时需要 -->  
	 <property>	 
		<name>ha.zookeeper.quorum</name>	 
		<value>wyh:2181,ai-lab:2181</value>	 
	 </property>
</configuration>

配置hdfs-site.xml文件

<configuration>
     <!-- //以下为HDFS HA的配置// -->  
    <!-- 指定hdfs的nameservices名称为ns1 -->  
	<property> 
		<name>dfs.nameservices</name>	 
		<value>ns1</value> 
    </property>
    
    <!-- 指定的两个namenode的名称分别为nn1, nn2-->
	<property> 
		<name>dfs.ha.namenodes.wyh</name>	 
		<value>nn1,nn2</value> 
    </property>

    <!-- 配置nn1,nn2的rpc通信端口 -->  
    <!-- 配置nn1,nn2的http通信端口 --> 
	<property> 
		<name>dfs.namenode.rpc-address.ns1.nn1</name>	 
		<value>wyh:8020</value> 
    	</property>
	<property> 
		<name>dfs.namenode.http-address.ns1.nn1</name>	 
		<value>wyh:50070</value> 
    </property>
	<property> 
		<name>dfs.namenode.rpc-address.ns1.nn2</name>	 
		<value>ai-lab:8020</value> 
    </property>
	<property> 
		<name>dfs.namenode.http-address.ns1.nn2</name>	 
		<value>ai-lab:50070</value> 
    </property>

     <!-- 数据备份的个数 -->  
 	<property> 
		<name>dfs.replication</name>	 
		<value>3</value> 
    </property>
    <!-- 关闭权限验证 -->
	  <property>  
	    <name>dfs.permissions.enabled</name>  
	    <value>false</value>  
	  </property>  
    <!-- 指定namenode元数据存储在journalnode中的路径 --> 
	<property> 
		<name>dfs.namenode.shared.edits.dir</name>	 
		<value>qjournal://wyh:8485;ai-lab:8485/ns1</value> 
    </property>

    <!-- 指定namenode元数据存储在journalnode中的路径 -->  
	<property> 
		<name>dfs.journalnode.edits.dir</name>	 
		<value>/usr/local/hadoop-2.10.0/journaldata</value> 
    </property>
     <!-- 开启自动故障转移 -->  
	<property> 
		<name>dfs.ha.automatic-failover.enabled</name>	 
		<value>true</value> 
    </property>

    <!-- 指定HDFS客户端连接active namenode的java类 -->  
	<property> 
		<name>dfs.cilent.failover.proxy.provide.ns1</name>	 		               
     
 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 
    </property>

    <!-- 配置隔离机制 -->  
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>
			shell(/bin/true)
		</value>
	</property>
    <!-- 指定秘钥的位置 -->  
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/home/wyh/.ssh/id_rsa</value>
	</property>
	<property>
		<name>dfs.ha.fencing.ssh.connect-timeout</name>
		<value>30000</value>
	</property>

</configuration>

配置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>wyh:10020</value>  
  </property>    
  <!-- 指定jobhistory server的http地址 -->  
  <property>  
    <name>mapreduce.jobhistory.webapp.address</name>  
    <value>wyh: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文件

<configuration>

<!-- Site specific YARN configuration properties -->
<!-- NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可运行MapReduce程序 -->  
<property>  
    <name>yarn.nodemanager.aux-services</name>  
    <value>mapreduce_shuffle</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>ns1</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>wyh</value>
 </property>
<property>
   <name>yarn.resourcemanager.hostname.rm2</name>
   <value>ai-lab</value>
 </property>
<!-- 配置YARN的http端口 -->  
<property>
	<name>yarn.resourcemanager.webapp.address.rm1</name>
	<value>wyh:8088</value>
</property>
<property>	
	<name>yarn.resourcemanager.webapp.address.rm2</name>
	<value>ai-lab:8088</value>
</property>
<!-- 配置zookeeper的地址 -->  
 <property>
   <name>yarn.resourcemanager.zk-address</name>
   <value>wyh:2181,ai-lab:2181</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>

7 Hadoop集群的初始化

严格按照步骤来

启动过程

1)首先zookeeper已经启动好了吧(三台都要启动,我这里是两台)
开启命令 bin/zkServer.sh start
2)启动三台journalnode(这个是用来同步两台namenode的数据的)
sbin/hadoop-daemon.sh start journalnode
3)操作namenode(只要格式化一台,另一台同步,两台都格式化,你就做错了!!)
格式化第一台:bin/hdfs namenode -format

注意:多次格式化的时候,要注意cluster-id保持一致,否则datanode无法启动;

第一台启动刚格式化好的namenode:sbin/hadoop-daemon.sh start namenode

wyh@wyh:/usr/local/hadoop-2.10.0$ jps
30672 Jps
30470 NameNode
30136 QuorumPeerMain
30189 JournalNode
 


在第二台机器上同步namenode的数据:bin/hdfs namenode -bootstrapStandby
启动第二台的namenode:sbin/hadoop-daemon.sh start namenode


4)查看web(这里应该两台都是stanby)

或者用ip地址访问也可以
http://wyh:50070/
http://ai-lab:50070/


5)然后手动切换namenode状态
手动切换namenode状态(也可以在第一台切换第二台为active,毕竟一个集群)
$ bin/hdfs haadmin -transitionToActive nn1 ##切换成active
$ bin/hdfs haadmin -transitionToStandby nn1 ##切换成standby
注: 如果不让你切换的时候,bin/hdfs haadmin -transitionToActive nn2 --forceactive

 hdfs haadmin -transitionToActive --forcemanual nn1 ##强制切换
也可以直接通过命令行查看namenode状态, bin/hdfs haadmin -getServiceState nn1

--------------------------到这里你的手动故障转移已经配置成功了-----------------------------------------

6)这时候就应该配置自动故障转移了!(其实完整的配置我在上面已经给过了)
首先你要把你的集群完整的关闭,一定要全关了!!
自动故障转移的配置其实要在zookeeper上生成一个节点 hadoop-ha,这个是自动生成的,通过下面的命令生成:
bin/hdfs zkfc -formatZK
然后你登录zookeeper的客户端,就是bin/zkCli.sh里面通过 “ls /” 可以看到多了个节点
这时候讲道理集群应该是没问题了!


你可以直接通过sbin/start-dfs.sh去启动hdfs,默认会启动zkfc的,其实就是一个自动故障转移的进程,会在你的namenode存在的两台机器上有这么一个节点。

启动hdfs和yarn命令

start-dfs.sh

start-yarn.sh

start-all.sh ##启动全部,相当于以上两个指令

访问yarn启动网址

http://wyh:8088/


等到完全启动了之后,就可以kill掉active的namenode,你就会发现stanby的机器变成active,然后再去启动那台被你kill掉的namenode(启动起来是stanby的状态),然后你再去kill掉active,stanby的机器又会变成active,到此你的HA自动故障转移已经完成了。

故障解决:

大多数情况下,是不能一次成功的,需要不停的看日志解决问题;

日志的路径在hadoop下的logs文件夹下,

zookeeper的日志在bin路径下

8 其它说明

由于NameNode状态的变更,导致笔者之前很多mapreduce程序都得改来改去,这个时候,只需要重启需要切换成standby状态机器上面DFSZKFailoverController进程即可将active/standby状态切换回来,

               先停掉  hadoop-daemon.sh stop zkfc

               重启  hadoop-daemon.sh start  zkfc

storm启动命令

./storm nimbus &

./storm ui &

./storm supervisor &

 

======================================kafka命令============================

启动:./kafka-server-start.sh ../config/server.properties &

生产者消费者:

./kafka-topics.sh --zookeeper 127.0.0.1:2181 --list #查看本机topic

./kafka-console-consumer.sh --bootstrap-server weekend01:9092 --from-beginning --topic mygirls ##表示从指定主题中有效的起始位移位置开始消费所有分区的消息。

 

1,开启zookeeper集群 startzk.sh
2,开启kafka集群  start-kafka.sh
2,开启kafka可视化界面 kafka-manager : start-kafka-manager.sh
 
3,生产者操作:
./kafka-console-producer.sh --broker-list weekend01:9092 --topic test    //my-kafka-topic时topic的名字
 
4,消费者操作:
./kafka-console-consumer.sh --bootstrap-server weekend01:9092 --topic test
# 通过以上命令,可以看到消费者可以接收生产者发送的消息
 
# 如果需要从头开始接收数据,需要添加--from-beginning参数
kafka-console-consumer.sh --bootstrap-server node01:9092 --from-beginning --topic my-kafka-topic
 
 
5,a.创建topic
kafka-topics.sh --create --zookeeper weekend01:2181 --replication-factor 1 --partitions 1 --topic my-kafka-topic
 
b.查看topic列表
./kafka-topics.sh --list --zookeeper weekend01:2181
 
c.如果需要查看topic的详细信息,需要使用describe命令
kafka-topics.sh --describe --zookeeper node1:2181 --topic test-topic
 
d.#若不指定topic,则查看所有topic的信息
kafka-topics.sh --describe --zookeeper node1:2181
 
e.删除topic
kafka-topics.sh --delete --zookeeper node1:2181 --topic my-kafka-topic