简介
hadoop中的NameNode比如是人的心脏,很是首要,绝对不成以停止工作。在hadoop1时代,只有一个NameNode。若是该NameNode数据丧失或者不克不及工作,那么全部集群就不克不及恢复了。这是hadoop1中的单点题目,也是hadoop1不成靠的发挥解析,如图1所示。hadoop2就解决了这个题目。
图1
hadoop2.2.0中HDFS的高靠得住指的是可以同时启动2个NameNode。此中一个处于工作状况,另一个处于随时待命状况。如许,当一个NameNode地点的办事器宕机时,可以在数据不丧失的景象下,手工或者主动切换到另一个NameNode供给办事。
这些NameNode之间经由过程共享数据,包管数据的状况一致。多个NameNode之间共享数据,可以经由过程Nnetwork File System或者Quorum Journal Node。前者是经由过程linux共享的文件体系,属于操纵体系的设备;后者是hadoop自身的器材,属于软件的设备。
我们这里讲述应用Quorum Journal Node的设备体式格式,体式格式是手工切换。
集群启动时,可以同时启动2个NameNode。这些NameNode只有一个是active的,另一个属于standby状况。active状况意味着供给办事,standby状况意味着处于休眠状况,只进行数据同步,时刻筹办着供给办事,如图2所示。
图2
架构
在一个典范的HA集群中,每个NameNode是一台自力的办事器。在任一时刻,只有一个NameNode处于active状况,另一个处于standby状况。此中,active状况的NameNode负责所有的客户端操纵,standby状况的NameNode处于附属地位,保护着数据状况,随时筹办切换。
两个NameNode为了数据同步,会经由过程一组称作JournalNodes的自力过程进行彼此通信。当active状况的NameNode的定名空间有任何批改时,会告诉大项目组的JournalNodes过程。standby状况的NameNode有才能读取JNs中的变革信息,并且一向监控edit log的变更,把变更应用于本身的定名空间。standby可以确保在集群失足时,定名空间状况已经完全同步了,如图3所示。
图3
为了确保快速切换,standby状况的NameNode有须要知道集群中所稀有据块的地位。为了做到这点,所有的datanodes必须设备两个NameNode的地址,发送数据块地位信息和心跳给他们两个。
对于HA集群而言,确保同一时刻只有一个NameNode处于active状况是至关首要的。不然,两个NameNode的数据状况就会产生不合,可能丧失数据,或者产生错误的成果。为了包管这点,JNs必须确保同一时刻只有一个NameNode可以向本身写数据。
硬件资料
为了安排HA集群,应当筹办以下工作:
* NameNode办事器:运行NameNode的办事器应当有雷同的硬件设备。
* JournalNode办事器:运行的JournalNode过程很是轻量,可以安排在其他的办事器上。重视:必须容许至少3个节点。当然可以运行更多,然则必须是奇数个,如3、5、7、9个等等。当运行N个节点时,体系可以容忍至少(N-1)/2个节点失败而不影响正常运行。
在HA集群中,standby状况的NameNode可以完成checkpoint操纵,是以没须要设备Secondary NameNode、CheckpointNode、BackupNode。若是真的设备了,还会报错。
设备
HA集群须要应用nameservice ID区分一个HDFS集群。别的,HA中还要应用一个词,叫做NameNode ID。同一个集群中的不合NameNode,应用不合的NameNode ID区分。为了支撑所有NameNode应用雷同的设备文件,是以在设备参数中,须要把“nameservice ID”作为NameNode ID的前缀。
HA设备内容是在文件hdfs-site.xml中的。下面介绍关键设备项。
dfs.nameservices 定名空间的逻辑名称。若是应用HDFS Federation,可以设备多个定名空间的名称,应用逗号分隔即可。
<property> <name>dfs.nameservices</name> <value>mycluster</value> </property>
dfs.ha.namenodes.[nameservice ID] 定名空间中所有NameNode的独一标示名称。可以设备多个,应用逗号分隔。该名称是可以让DataNode知道每个集群的所有NameNode。当前,每个集群最多只能设备两个NameNode。
<property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property>
dfs.namenode.rpc-address.[nameservice ID].[name node ID] 每个namenode的RPC地址。如下所示
<property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>machine1.example.com:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>machine2.example.com:8020</value> </property>
dfs.namenode.http-address.[nameservice ID].[name node ID] 每个namenode的http地址。如下所示
<property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>machine1.example.com:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>machine2.example.com:50070</value> </property>
若是启用了安然策略,也应当对每个namenode设备htts-address信息,与此类似。
dfs.namenode.shared.edits.dir 这是NameNode读写JNs组的uri。经由过程这个uri,NameNodes可以读写edit log内容。URI的格局"qjournal://host1:port1;host2:port2;host3:port3/journalId"。这里的host1、host2、host3指的是Journal Node的地址,这里必须是奇数个,至少3个;此中journalId是集群的独一标识符,对于多个联邦定名空间,也应用同一个journalId。设备如下
<property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value> </property>
dfs.client.failover.proxy.provider.[nameservice ID] 这里设备HDFS客户端连接到Active NameNode的一个java类。
<property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property>
dfs.ha.fencing.methods 设备active namenode失足时的处理惩罚类。当active namenode失足时,一般须要封闭该过程。处理惩罚体式格式可所以ssh也可所以shell。
若是应用ssh,设备如下
<property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/exampleuser/.ssh/id_rsa</value> </property>
这种办法设备简单,推荐应用。
fs.defaultFS 客户端连接HDFS时,默认的路径前缀。若是前面设备了nameservice ID的值是mycluster,那么这里可以设备为授权信息的一项目组。
可以在core-site.xml中设备如下
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property>
dfs.journalnode.edits.dir 这是JournalNode过程对峙逻辑状况的路径。这是在linux办事器文件的绝对路径。
设备如下
<property> <name>dfs.journalnode.edits.dir</name> <value>/path/to/journal/node/local/data</value> </property>
安排
以上设备完成后,就可以启动JournalNode过程了。在各个JournalNode机械上履行号令“hadoop-daemon.sh journalnode”。
若是是一个新的HDFS集群,还要起首履行格局化号令“hdfs namenode -format”,紧接着启动本NameNode过程。
若是存在一个已经格局化过的NameNode,并且已经启动了。那么应当把该NameNode的数据同步到另一个没有格局化的NameNode。在未格局化过的NameNode上履行号令“hdfs namenode -bootstrapStandby”。
若是是把一个非HA集群转成HA集群,应当运行号令“hdfs –initializeSharedEdits”,这会初始化JournalNode中的数据。
做了这些工作后,就可以启动两个NameNode了。启动成功后,经由过程web页面调查两个NameNode的状况,都是standby。
下面履行号令“hdfs haadmin -failover --forcefence serviceId serviceId2”。就会把NameNode的状况进行安然的切换。此中后面一个会变为active状况。这时辰再经由过程web页面调查就能看到正确成果了。
经管员号令
履行号令“hdfs haadmin”,会显示子号令列表,如下
Usage: DFSHAAdmin [-ns <nameserviceId>] [-transitionToActive <serviceId>] [-transitionToStandby <serviceId>] [-failover [--forcefence] [--forceactive] <serviceId> <serviceId>] [-getServiceState <serviceId>] [-checkHealth <serviceId>] [-help <command>]
若是要查看具体用法,应用“hdfs haadmin -help <command>”。此中,
transitionToActive和transitionToStandby是用于在不合状况之间切换的。这些号令没有任何防护错误,很少应用。
failover 初始化一个故障恢复。该号令会从一个失效的NameNode切换到另一个上方。
getServiceState 获取当前NameNode的状况。
checkHealth 搜检NameNode的状况。正常就返回0,不然返回非0值。
以下是我的具体安装过程描述:
1.断定集群布局
我这里采取 5台虚拟机,内存是512MB,硬盘是20GB,以下是我对这5台机械的角色分派。
ip地址 | 主机名 | NameNode | JournalNode | DataNode |
192.168.80.100 | hadoop100 | 是 | 是 | 否 |
192.168.80.101 | hadoop101 | 是 | 是 | 否 |
192.168.80.102 | hadoop102 | 否 | 是 | 是 |
192.168.80.103 | hadoop103 | 否 | 否 | 是 |
192.168.80.104 | hadoop104 | 否 | 否 | 是 |
2.设置linux、安装jdk
起首在VMWare中安装一台虚拟机,设置ssh免暗码登录、设置静态ip为192.168.80.100、设置主机名为hadoop100、编辑/etc/hosts文件、安装jdk等,这些内容参考作者前面的文章。不再累述。
然后批改hadoop的设备文件,下面重点描述。
2.1 编辑文件¥HADOOP_HOME/etc/hadoop/hadoop-env.sh,批改一行内容如下
export JAVA_HOME=/usr/local/jdk
把这里的JAVA_HOME前面的#去掉,把值改为本身安装的jdk路径;
2.2 编辑文件¥HADOOP_HOME/etc/hadoop/core-site.xml,批改内容如下所示
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop100:9000</value>
</property>
</configuration>
以上设备中,name是hadoop.tmp.dir的值默示hadoop存放数据的目次,即包含NameNode的数据,也包含DataNode的数据。该路径随便率性指定,只要实际存在该文件夹即可。
name是fs.defaultFS的值默示hdfs路径的逻辑名称。因为我们会启动2个NameNode,每个NameNode的地位不一样,那么切换后,用户也要批改代码,很麻烦,是以应用一个逻辑路径,用户就可以不必愁闷NameNode切换带来的路径不一致题目了。
2.3 编辑文件¥HADOOP_HOME/etc/hadoop/hdfs-site.xml,批改内容如下所示
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>hadoop100,hadoop101</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.hadoop100</name>
<value>hadoop100:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.hadoop101</name>
<value>hadoop101:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.hadoop100</name>
<value>hadoop100:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.hadoop101</name>
<value>hadoop101:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:84
85/cluster1</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredF
ailoverProxyProvider</value>
</property>
<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.journalnode.edits.dir</name>
<value>/usr/local/hadoop/tmp/journal</value>
</property>
</configuration>
以上设备信息在前面的描述中已经做了申明。
2.4 编辑文件¥HADOOP_HOME/etc/hadoop/slaves,批改内容如下所示
hadoop102
hadoop103
hadoop104
默示以上三个节点作为DataNode节点。
3.应用虚拟机再复制出4个虚拟机。把ip和主机名批改一下,同时批改/etc/hosts文件。在这里要确保5个节点之间互相都可以应用ssh免暗码登录。
4.履行号令启动集群
以下号令严格重视履行次序,不克不及倒置!
4.1 启动JournalNode集群
在hadoop100、hadoop101、hadoop102上,履行号令 hadoop-daemon.sh start journalnode
4.2 格局化一个NameNode
在hadoop100履行号令 hdfs namenode –format
4.3 启动一个NameNode
在hadoop100履行号令 hadoop-daemon.sh start namenode
4.4 格局化另一个NameNode
在hadoop101履行号令 hdfs namenode -bootstrapStandby
4.5 启动另一个NameNode
在hadoop101履行号令 hadoop-daemon.sh start namenode
这时辰,应用浏览器接见 http://hadoop100:50070 和 http://hadoop101:50070 。若是可以或许看到两个页面,证实NameNode启动成功了。这时,两个NameNode的状况都是standby。
4.6 转换active
在hadoop100履行号令 hdfs haadmin -transitionToActive hadoop100
再应用浏览器接见 http://hadoop100:50070 和 http://hadoop101:50070,会发明hadoop100节点变为active,hadoop101还是standby。
4.7 启动DataNodes
在hadoop100履行号令 hadoop-daemons.sh start datanode 会启动3个DataNode节点。
这时辰HA集群就启动了。
你若是想实验一下NameNode切换,履行号令 hdfs haadmin –failover –forceactive hadoop100 hadoop101
这时辰调查hadoop100和hadoop101的状况,就会发明,已经改变了。
若是向上传数据,还须要批改core-site.xml中的fs.default.name的值,改为hdfs://hadoop101:9000 才行。
若是有的同窗设备失败,可以应用我的一键运行脚本,hadoop目次是/usr/local/hadoop,一键脚本放在该目次即可。应用root用户登录运行。地址是http://pan.baidu.com/s/1gdHsVmV
关于hadoop2的其他设备文章,迎接连气儿存眷