? 自Hadoop2.x版本后可以增加多个namenode节点【保存着整个系统的名称空间和文件数据块的地址映射又称“元数据”】,多个namenode有活跃(active)和 准备(Standby)两种状态 , 即一个帮派有一个正一个副,平时都是正帮主主持大局,但如果正帮主遭遇不测被Kill S掉后,这时候副帮主就得出来主持大局了。
? Hadoop HA 的正帮主(active)选举一般都要借助长老会(Zookeeper)帮助。长老会保存着每个帮会成员的生命水晶,生命水晶一般会检测到每个帮员生命特征,一但生命水晶熄灭也就代表人死亡。长老会会定时查看帮主的生命水晶状况,一但帮主生命水晶熄灭,长老会会立刻在副帮主之间推选出新的正帮主,从而继续管理帮内事务。
? 当长老会(Zookeeper)推选出新的正帮主,那被推出的帮主他是如何快速接手帮内事务呢?答案是正副帮主之间有一个小本本,这个小本本记录着大小帮内的事务,帮主会将帮内事务写在这个正副帮主共享的小本本上面,所以一但帮主惨遭不测,其他帮主凭借帮主小本本也能快速上位处理帮内事务。
?
ip | 主机名 | 服务 | 备注 |
---|---|---|---|
192.168.216.111 | hadoop01 | jdk、NameNode、DataNode、JouranlNode、ResourceManger、NodeManager | 正帮主 |
192.168.216.112 | hadoop02 | jdk、NameNode、DataNode、JouranlNode、ResourceManger、NodeManager | 副帮主 |
192.168.216.113 | hadoop03 | jdk、DataNode、JouranlNode、NodeManager |
# 解压Hadoop
[root@hadoop01 src]# tar -zxvf /home/hadoop-2.7.6.tar.gz -C /usr/local/src/
#配置hadoop环境变量
[root@hadoop01 src]# vi /etc/profile
#增加jdk、zookeeper、hadoop的地址
#注意:要添加你自己解压所在的地址,下面是我的解压地址
export JAVA_HOME=/usr/local/src/jdk1.8.0_152/
export ZK_HOME=/usr/local/src/zookeeper-3.4.10/
export HADOOP_HOME=/usr/local/src/hadoop-2.7.6/
export PATH=$PATH:$JAVA_HOME/bin:$ZK_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
#刷新环境变量
[root@hadoop01 src]# source /etc/profile
NameNode和ResourceManager配置高可用大概需要配置如下6个配置文件:
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/core-site.xml
<configuration>
<!--指定hdfs文件系统的默认名-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://sw</value>
</property>
<!--指定zk的集群地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!--指定hadoop的临时目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadata/tmp</value>
</property>
</configuration>
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/hdfs-site.xml
<configuration>
<!--指定块的副本数,默认是3-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定数据块的大小-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!--指定namenode的元数据目录-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadata/dfs/name</value>
</property>
<!--指定datanode存储数据目录-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadata/dfs/data</value>
</property>
<!--hdfs的命名空间,逻辑名称-->
<property>
<name>dfs.nameservices</name>
<value>sw</value>
</property>
<!--qianfeng下的namenode的别名-->
<property>
<name>dfs.ha.namenodes.sw</name>
<value>nn1,nn2</value>
</property>
<!--指定nn1和nn2的通信地址-->
<property>
<name>dfs.namenode.rpc-address.qianfeng.nn1</name>
<value>hadoop01:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.qianfeng.nn2</name>
<value>hadoop02:9000</value>
</property>
<!--指定namenode的web通信地址-->
<property>
<name>dfs.namenode.http-address.qianfeng.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.qianfeng.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--指定共享日志目录, 这个就是帮主的小本本-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/sw</value>
</property>
<!--指定开启namenode失败自动转移,这个就是长老会根据生命水晶检测选举新帮主-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--指定失败转移的类-->
<property>
<name>dfs.client.failover.proxy.provider.qianfeng</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--防止namenode的脑裂-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--指定超时时间设置-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!--指定日志的本地目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadata/journal1</value>
</property>
<!--是否开启webhdfs的-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!--是否开启hdfs的权限-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
[root@hadoop01 hadoop-2.7.6]# mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/mapred-site.xml
<configuration>
<!--配置mapreduce的框架名称-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<final>true</final>
</property>
<!--指定jobhistoryserver的内部通信地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<!--指定jobhistoryserver的web地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
</configuration>
jobhistoryserver: 历史服务器,管理者可以通过历史服务器查看已经运行完成的Mapreduce作业记录。
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/yarn-site.xml
<configuration>
<!--指定mapreduce的shuffle服务-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--是否开启yarn的HA-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>sw_yarn</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop02</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop02:8088</value>
</property>
<!--指定zookeeper的集群地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/slaves
hadoop01
hadoop02
hadoop03
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/hadoop-env.sh
#添加jdk路径
export JAVA_HOME=/usr/local/src/jdk1.8.0_152/
#节点1
[root@hadoop01 hadoop-2.7.6]# zkServer.sh start
#节点2
[root@hadoop02 hadoop-2.7.6]# zkServer.sh start
#节点3
[root@hadoop03 hadoop-2.7.6]# zkServer.sh start
JournalNode : 作为独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。(即帮主会把本帮的事务写在小本本上,副帮主也能同时获取小本本的记录)
[root@hadoop01 hadoop-2.7.6]# hadoop-daemons.sh start journalnode
HDFS集群有两类节点以管理节点-工作节点模式运行,即一个namenode(管理节点)和多个datanode(工作节点)。
namenode(管理文件系统的命名空间):它维护着文件系统树及整棵树内的所有文件和目录。namenode以两个文件形式永久保存在本地磁盘上 ”命名空间镜像文件“ 和 ”编辑日志文件“。
[root@hadoop01 ~]# hdfs namenode -format
[root@hadoop01 ~]# hadoop-daemon.sh start namenode
副帮主查看帮主在小本本写的”羞羞“事,并记录在自己这里
[root@hadoop02 ~]# hdfs namenode -bootstrapStandby
#选择其中一个namenode节点进行格式化zkfc
#前提QuorumPeerMain服务必须处于开启状态,客户端zkfc才能格式化成功
[root@hadoop01 ~]# hdfs zkfc -formatZK
[root@hadoop01 ~]# start-all.sh
大家好,我是狂聊君。 今天来聊一聊 Mysql 缓存池原理。 提纲附上,话不多说,直...
在Flash Player 10.1及以上版本中,adobe新增了全局错误处理程序UncaughtErrorEv...
本文实例讲述了AJAX+Servlet实现的数据处理显示功能。分享给大家供大家参考,具...
idea官方推送了2020.2.4版本的更新,那么大家最关心的问题来了,之前激活idea202...
来源:DeepenStudy 漏洞文件:js.asp % Dimoblog setoblog=newclass_sys oblog.a...
本文转载自微信公众号「SQL数据库」,作者丶平凡世界 。转载本文请联系开发公众...
本文转载自微信公众号「SH的全栈笔记」,作者SH。转载本文请联系SH的全栈笔记公...
前言 项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值...
CKeditor,以前叫FCKeditor,已经使用过好多年了,功能自然没的说。最近升级到3....
问题:我们在做flex的开发中,如果用到别人搭建好的框架,而别人的server名称往...