您的位置:首页 > 大数据

Hadoop大数据框架研究(2)——Hadoop的HA高可用性集群环境部署

2018-02-23 16:24 831 查看
      近期对hadoop生态的大数据框架进行了实际的部署测试,并结合ArcGIS平台的矢量大数据分析产品进行空间数据挖掘分析。本系列博客将进行详细的梳理、归纳和总结,以便相互交流学习。

A. 部署规划及节点功能:

192.168.10.100-node1.gisxy.com、192.168.10.101-node2.gisxy.com、192.168.10.102-node3.gisxy.com
192.168.10.103-node4.gisxy.com、192.168.10.104-node5.gisxy.com
组件及机器node1node2node3node4node5
NameNode11   
DataNode  111
NodeManager  111
QuorumPeerMain  111
JournalNode  111
DFSZKFailoverController11   
ResourceManager11   
1.NameNode:hdfs的主节点,保存hdfs正常运行的各种必要元数据(保存在edits和fsimage文件中);
2.DataNode:hdfs的数据节点,保存真实数据的节点;
3.NodeManager:管理datanode,并随datanode的启动而启动
4.QuorumPeermain:zookeeper的java进程。各种分布式服务(如hdfs,hbase,resourcemanager)注册到zookeeper上去,即可启动2个以上的相同进程(其中一个状态为active,其他为standby),如果active节点挂了,可通过zookeeper进行切换到standby,让他active,保证进程正常运行;
5.JournalNode:日志节点,将namenode上的edits文件分离出来,形成一个集群,保证namenode不被挂掉;
6.DFSZKFailoverController(zkfc):监控并管理namenode的状态和切换;
7.Resourcemanager:管理并分配集群的资源,如为nodemanager分配计算资源等;

B. HA原理:

       在Hadoop2.0之前,NameNode只有一个,存在单点问题。如果这个机器或进程不可用,整个集群就无法使用。为了解决这个问题,在hadoop2.X引入了HA机制,它有2种方式,一种是NFS(Network File System)方式,另外一种是QJM(Quorum Journal Manager)方式。

        Hadoop2.x的HA 机制有两台互备的NameNode节点,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode。两者的状态可以切换,但不能同时都是Active状态,最多只有1个是Active状态。只有Active NameNode提供对外的服务,Standby NameNode不对外服务,主要维持足够的状态,如果必要,可以提供快速的故障恢复。Active NameNode和Standby NameNode之间通过NFS或者QJM来同步数据。

       Active NameNode会把最近的操作记录写到本地的一个edits文件中,并传输到NFS或者JN中。Standby NameNode定期的检查,从NFS或者JN把最近的edit文件读过来,然后把edits文件和fsimage文件合并成一个新的fsimage,合并完成之后会通知Active NameNode获取这个新fsimage。Active NameNode获得这个新的fsimage文件之后,替换原来旧的fsimage文件。这样,保持了Active NameNode和Standby NameNode的数据的实时同步,Standby NameNode可以随时切换成Active NameNode。
      NFS作为两台互备的NameNode数据共享的存储。缺点是,如果Active NameNode或者Standby NameNode有一个和NFS之间网络有问题,则会造成他们之前数据的同步出问题。

      QJM的方式可以解决NFS容错机制不足的问题。两台NameNode是通过一组JournalNode(数量是奇数,2n+1)来共享数据。Active NameNode把最近的edits文件写到2n+1个JournalNode上,只要有n+1个写入成功就认为这次写入操作成功了,然后Standby NameNode就可以从JournalNode上读取了。可以看到,QJM方式有容错的机制,可以容忍n个JournalNode的失败。

    NameNode 主备切换主要由 ZKFailoverController、HealthMonitor 和 ActiveStandbyElector 这 3 个组件来协同实现。ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。FailoverController 监测 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换。HealthMonitor是一个周期性工作的后台线程,它在一行个循环中周期性的同HA服务进心跳,负责跟踪NameNode服务的健康状况,并在健康状况变化时调用failover控制器的回调方法。HealthMonitor 主要负责检测 NameNode 的健康状态,如果检测到 NameNode 的状态发生变化,会回调 ZKFailoverController 的相应方法进行自动的主备选举。ActiveStandbyElector 主要负责完成自动的主备选举,内部封装了 Zookeeper 的处理逻辑,一旦 Zookeeper 主备选举完成,会回调ZKFailoverController 的相应方法来进行 NameNode 的主备状态切换。

C. Zookeeper集群部署

1.下载zookeeper-3.4.10:https://archive.apache.org/dist/zookeeper/
2.传递zookeeper到node3的/home/hadoop/hadoop/目录下并解压
3.修改conf下的配置文件
[hadoop@node3 conf]$cp -a zoo_sample.cfg zoo.cfg 

[hadoop@node3 conf]$vim zoo.cfg tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/hadoop/zookeeperData
clientPort=2181
server.1=node3.gisxy.com:2888:3888
server.2=node4.gisxy.com:2888:3888
server.3=node5.gisxy.com:2888:38884.创建zookeeperData目录及myid值
[hadoop@node3 hadoop]$ mkdir zookeeperData
[hadoop@node3 hadoop]$ cd zookeeperData
[hadoop@node3 zookeeperData]$ echo 1 > myid
5.传递zookeeper到node4、node5节点并创建zookeeperData目录和myid值
[hadoop@node3 hadoop]$ scp zookeeper-3.4.10 hadoop@node4.gixy.com:/home/hadoop/hadoop/
[hadoop@node3 hadoop]$ scp zookeeper-3.4.10 hadoop@node5.gixy.com:/home/hadoop/hadoop/
[hadoop@node4 zookeeperData]$ echo 2 > myid
[hadoop@node5 zookeeperData]$ echo 3 > myid
6.启动zookeeper集群并查看状态,默认情况第二个启动的节点作为leader,其他为follower
[hadoop@node3 bin]$ ./zkServer.sh start
[hadoop@node4 bin]$ ./zkServer.sh start
[hadoop@node5 bin]$ ./zkServer.sh start
[hadoop@node5 bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/hadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

D. Hadoop环境部署

1.下载spark-2.2.1-bin-hadoop2.7:http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.5/
2.传递spark到node1的/home/hadoop/hadoop/目录下并解压
3.修改hadoop相关配置文件
[hadoop@node1 hadoop]$ cd hadoop-2.7.5/etc/hadoop
a.hadoop-env.shexport JAVA_HOME=/usr/local/jdk1.8.0_151
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}
for f in $HADOOP_HOME/contrib/capacity-scheduler/*.jar; do
if [ "$HADOOP_CLASSPATH" ]; then
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
else
export HADOOP_CLASSPATH=$f
fi
done
export HADOOP_COMMON_LIB_NATIVE_DIR="/home/hadoop/hadoop/hadoop-2.7.5/lib/native/"
#export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"
export HADOOP_OPTS="-Djava.library.path=/home/hadoop/hadoop/hadoop-2.7.5/lib"
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_NFS3_OPTS="$HADOOP_NFS3_OPTS"
export HADOOP_PORTMAP_OPTS="-Xmx512m $HADOOP_PORTMAP_OPTS"

# The following applies to multiple commands (fs, dfs, fsck, distcp etc)
export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS"
export HADOOP_SECURE_DN_USER=${HADOOP_SECURE_DN_USER}

export HADOOP_SECURE_DN_LOG_DIR=${HADOOP_LOG_DIR}/${HADOOP_HDFS_USER}

export HADOOP_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}

# A string representing this instance of hadoop. $USER by default.
export HADOOP_IDENT_STRING=$USERb.core-site.xml<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://HA</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop/hadoop275_tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node3.gisxy.com:2181,node4.gisxy.com:2181,node5.gisxy.com:2181</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
</configuration>c.hdfs-site.xml<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.nameservices</name>
<value>HA</value>
</property>
<property>
<name>dfs.ha.namenodes.HA</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.HA.nn1</name>
<value>node1.gisxy.com:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.HA.nn1</name>
<value>node1.gisxy.com:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.HA.nn2</name>
<value>node2.gisxy.com:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.HA.nn2</name>
<value>node2.gisxy.com:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node3.gisxy.com:8485;node4.gisxy.com:8485;node5.gisxy.com:8485/HA</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/hadoop/journalData</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.HA</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>d.mapred-site.xml<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration> e.yarn-site.xml<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node1.gisxy.com</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node2.gisxy.com</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node3.gisxy.com:2181,node4.gisxy.com:2181,node5.gisxy.com:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>f.slavesnode3.gisxy.com
node4.gisxy.com
node5.gisxy.com4.传递hadoop到其他各个节点
[hadoop@node1 hadoop]$ scp -r /home/hadoop/hadoop node2.gisxy.com:/home/hadoop/hadoop/
[hadoop@node1 hadoop]$ scp -r /home/hadoop/hadoop node3.gisxy.com:/home/hadoop/hadoop/
[hadoop@node1 hadoop]$ scp -r /home/hadoop/hadoop node4.gisxy.com:/home/hadoop/hadoop/
[hadoop@node1 hadoop]$ scp -r /home/hadoop/hadoop node5.gisxy.com:/home/hadoop/hadoop/
5.创建相关目录
node1的/home/hadoop/hadoop/hadoop275_tmp
node3、node4、node5的/home/hadoop/hadoop/journalData
[hadoop@node1 hadoop]$ mkdir hadoop275_tmp
[hadoop@node3 hadoop]$ mkdir journalData
[hadoop@node4 hadoop]$ mkdir journalData
[hadoop@node5 hadoop]$ mkdir journalData
6.顺序启动相关服务
检查zookeeper集群的三个节点是否启动正常
[hadoop@node3 bin]$ ./zkServer.sh status
[hadoop@node3 bin]$ jps
启动journalnode集群
[hadoop@node3 sbin]$ ./hadoop-daemon.sh start journalnode
[hadoop@node4 sbin]$ ./hadoop-daemon.sh start journalnode
[hadoop@node5 sbin]$ ./hadoop-daemon.sh start journalnode
node1上格式化hdfs
[hadoop@node1 bin]$ ./hadoop namenode –format
拷贝node1的hadoop275_tmp目录到node2
[hadoop@node1 hadoop]$ scp -r hadoop27_tmp node2.gisxy.com:/home/hadoop/hadoop/
node1上格式化zkfc
[hadoop@node1 bin]$ ./hdfs zkfc -formatZK
node1上启动hadoop集群
[hadoop@node1 sbin]$ ./start-all.sh
node2上启动namenode和resourcemanager
[hadoop@node2 sbin]$ ./hadoop-daemon.sh start namenode
[hadoop@node2 sbin]$ ./yarn-daemon.sh start resourcemanager
[hadoop@node2 sbin]$ ./hadoop-daemon.sh start zkfc

7.hadoop集群HA环境测试
[hadoop@node1 sbin]$ jps37091 Jps
4052 NameNode
4392 DFSZKFailoverController
4494 ResourceManager[hadoop@node2 sbin]$ jps
36048 DFSZKFailoverController
3332 NameNode
3640 ResourceManager
43817 Jps[hadoop@node3 sbin]$ jps
3638 DataNode
3851 NodeManager
21355 Jps
3516 QuorumPeerMain
3743 JournalNode[hadoop@node4 sbin]$ jps
3617 DataNode
3832 NodeManager
3722 JournalNode
21482 Jps
3500 QuorumPeerMain[hadoop@node5 sbin]$ jps
3553 DataNode
3666 JournalNode
3446 QuorumPeerMain
21402 Jps
3787 NodeManager浏览器查看





通过kill掉node1的namenode进程,node2由standby切换到active,hdfs使用不受影响。
[hadoop@node1 bin]$ ./hadoop fs -mkdir /bigdatas
[hadoop@node1 bin]$ ./hadoop fs -put /home/hadoop/hadoop/hadoop275_tmp/yellow_tripdata_2014-01.csv /bigdatas
[hadoop@node1 bin]$ ./hadoop fs -ls /bigdatas
[hadoop@node1 bin]$ ./hadoop fs -ls /bigdatas
Found 1 items
-rw-r--r--   3 hadoop supergroup 2273626703 2018-02-11 15:31 /bigdatas/yellow_tripdata_2014-01.csv


[hadoop@node1 bin]$ hadoop fs -rm /bigdatas/wordcount.txt
[hadoop@node1 bin]$ hadoop fs -rm -r /bigdatas/output/
[hadoop@node1 bin]$ hadoop fs -mv /bigdatas/output /bigdatas/output2

参考博客: http://blog.csdn.net/qq_32166627/article/details/50994029 http://blog.csdn.net/qq_32166627/article/details/51553394
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: