国内最全最具体的hadoop2.2.0集群的HA高靠得住的最简单设备

来源:互联网 发布:如何做好一个淘宝客服 编辑:程序博客网 时间:2024/05/19 00:42

简介



hadoop中的NameNode比如是人的心脏,很是首要,绝对不成以停止工作。在hadoop1时代,只有一个NameNode。若是该NameNode数据丧失或者不克不及工作,那么全部集群就不克不及恢复了。这是hadoop1中的单点题目,也是hadoop1不成靠的发挥解析,如图1所示。hadoop2就解决了这个题目。


image


图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所示。


image


图2



架构



在一个典范的HA集群中,每个NameNode是一台自力的办事器。在任一时刻,只有一个NameNode处于active状况,另一个处于standby状况。此中,active状况的NameNode负责所有的客户端操纵,standby状况的NameNode处于附属地位,保护着数据状况,随时筹办切换。



两个NameNode为了数据同步,会经由过程一组称作JournalNodes的自力过程进行彼此通信。当active状况的NameNode的定名空间有任何批改时,会告诉大项目组的JournalNodes过程。standby状况的NameNode有才能读取JNs中的变革信息,并且一向监控edit log的变更,把变更应用于本身的定名空间。standby可以确保在集群失足时,定名空间状况已经完全同步了,如图3所示。


image


图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>”。此中,


transitionToActivetransitionToStandby是用于在不合状况之间切换的。这些号令没有任何防护错误,很少应用。


failover 初始化一个故障恢复。该号令会从一个失效的NameNode切换到另一个上方。


getServiceState 获取当前NameNode的状况。


checkHealth 搜检NameNode的状况。正常就返回0,不然返回非0值。


以下是我的具体安装过程描述:


1.断定集群布局


我这里采取 5台虚拟机,内存是512MB,硬盘是20GB,以下是我对这5台机械的角色分派。















































ip地址主机名NameNodeJournalNodeDataNode192.168.80.100hadoop100是是否192.168.80.101hadoop101是是否192.168.80.102hadoop102否是是192.168.80.103hadoop103否否是192.168.80.104hadoop104否否是


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的其他设备文章,迎接连气儿存眷

0 0
原创粉丝点击