目录
--------------------------到这里你的手动故障转移已经配置成功了-----------------------------------------
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 创建用户并添加权限
参考:
注意:配置过程中保证用户名一致,主机名不一致;
3.2 设置IP地址与主机名映射
千万注意:配置中如果出现连接失败,大多数原因都是hosts没配好,ip映射尽量使用具体ip对应(不要用127.0.0.1),不然会失败;
参考:
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连接
参考
配置免密
很多主机的时候
// 在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
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
参考;
安装单机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启动网址
等到完全启动了之后,就可以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