Hadoop-2.4.1学习之使用Quorum Journal Manager的HDFS的高可用性(二)

来源:互联网 发布:vs2010怎么写c语言 编辑:程序博客网 时间:2024/04/29 19:47

      在了解了HA的特性和架构后,接下来学习如何配置管理HA,在学习与配置HA有关的参数之前,先明确部署HA所需要的主机数量。由HA的架构可知,存在两个NameNode主机,一个为现役NameNode主机,一个为待机NameNode主机,二者的硬件配置应该相同,同时还要有运行JournalNodes的主机。由于JournalNode守护进程是相对轻量级的,那么这些守护进程可与其它Hadoop守护进程,如NameNode、JobTracker或者ResourceManager,运行在相同的主机上。由于edits日志的改变必须写入大多数(一半以上)JNs,所以至少存在3个JournalNodes守护进程,这样系统能够容忍单个主机故障。当然也可以运行多于3个JournalNodes,但为了增加系统能够容忍的故障主机的数量,应该运行奇数个JNs(一个主机故障需要至少3个JNs,两个故障则需要至少2*2+1=5个JNs)。当运行N个JNs时,系统最多可以接受(N-1)/2个主机故障并能继续正常运行。

      在HA集群中,待机状态的NameNode也扮演了执行命名空间检查点的角色,因此没有必要在HA集群中再运行SecondaryNameNode、CheckpointNode或BackupNode,实际上在HA集群中运行上述进程将会出错。而这也允许在将非HA集群配置为HA时,可以重用之前SecondaryNameNode使用的主机。

      与HDFS联盟类似,HA的配置管理也是向后兼容的,允许现存的单节点NameNode不做修改而可以继续工作,同时HA集群中的所有节点可以使用相同的配置文件。HA集群重用NameServiceID来标识唯一的HDFS实例,该实例实际由多个HA NameNode组成。另外,HA还新增了NameNodeID的概念,不同的NameNode有不同的ID。为了支持一个配置文件适用所有的NameNodes,相关配置参数以NameServiceID和NameNodeID结尾。

      在hdfs-site.xml中,参数dfs.nameservices和dfs.ha.namenodes.[NameServiceID]分别定义了HA的NameServiceID和NameNodeID,并决定了其它相关参数。具体如下:

  • dfs.nameservices:HA的逻辑名称,该名称可以任意选取,比如HATest。该名称既用于配置管理,还用于绝对HDFS路径中的授权部分( [user-info@]host[:port])。如果也在使用HDFS联盟,则该参数的值将包含其它HA,彼此用逗号分隔。
  • dfs.ha.namenodes.[NameServiceID]:命名服务中每个NameNode的唯一标示符,其中的NameServiceID为dfs.nameservices定义的值。该参数的值为用逗号分隔的NameNode ID,DataNodes将使用该值确定集群中的NameNode。目前每个命名服务最大支持两个NameNode(active和standby),如下面的示例代码在mycluster中定义了nn1和nn2:
    <property>  <name>dfs.ha.namenodes.mycluster</name>  <value>nn1,nn2</value></property>
  • dfs.namenode.rpc-address.[nameserviceID].[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.[nameserviceID].[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>

  • dfs.namenode.shared.edits.dir:被现役NameNode写入和被待机NameNode读取的共享edits目录。该值标识了JournalNodes的地址,虽然必须指定多个JournalNode地址,但应该仅配置其中的一个URI。URI的格式应该是这样的:qjournal://host1:port1;host2:port2;host3:port3/journalId,journalId是唯一标示符,允许一组JournalNodes为多个联盟命名系统提供存储,好的建议是使用命名服务ID做为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客户端联系现役NameNode的Java类,客户端使用该类确定哪个NameNode出于active状态,由此确定哪个NameNode处理客户端的请求。当前的唯一实现类为ConfiguredFailoverProxyProvider。
  • fs.defaultFS:该参数位于core-site.xml文件中,表示默认路径前缀,如果HDFS客户端在进行文件操作时没有指定所使用的文件系统,则使用该值。也可以使用HA的逻辑名称配置该默认路径前缀,如下所示:
    <property>  <name>fs.defaultFS</name>  <value>hdfs://mycluster</value></property>

  • dfs.journalnode.edits.dir:JournalNode存储edits日志和本地状态的目录,该目录是JournalNode主机的绝对路径。可以通过运行多个分离的JournalNodes或者配置本地连接的磁盘阵列目录为该值提供冗余,示例如下:
    <property>  <name>dfs.journalnode.edits.dir</name>  <value>/path/to/journal/node/local/data</value></property>
0 0
原创粉丝点击