hadoop-NNHA

namenode 的高可用配置

相关文档

NNHA 涉及的配置文件

相关配置项

core-site.xml 文件配置

<configuration>
    <!-- 指定hadoop临时目录 -->
        <property>
             <name>hadoop.tmp.dir</name>
             <value>file:/data/hadoop/tmp</value>
        </property>
    <!-- 指定hdfs的nameservice,是NameNode的URI。hdfs://主机名:端口/  -->
        <property>
             <name>fs.defaultFS</name>
             <value>hdfs://hadoop-service</value>
        </property>
    <!-- 指定zookeeper地址 -->
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>192.168.137.120:2181,192.168.137.130:2181,192.168.137.140:2181</value>
        </property>
    <!-- 指定zookeeper会话超时时间 -->
        <property>
            <name>ha.zookeeper.session-timeout.ms</name>
            <value>2000</value>
        </property>
</configuration>

hdfs-site.xml 文件配置

<configuration>
<!--指定hdfs的nameservice,需要和core-site.xml中的保持一致 -->
        <property>
                <name>dfs.nameservices</name>
                <value>hadoop-service</value>
        </property>
<!-- hadoop-service下面有两个NameNode,分别是hadoop-aaa,hadoop-bbb -->
        <property>
                <name>dfs.ha.namenodes.hadoop-service</name>
                <value>hadoop-aaa,hadoop-bbb</value>
        </property>
<!-- hadoop-aaa的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.hadoop-service.hadoop-aaa</name>
                <value>hadoop-aaa:9000</value>
        </property>

<!-- hadoop-bbb的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.hadoop-service.hadoop-bbb</name>
                <value>hadoop-bbb:9000</value>
        </property>

<!-- hadoop-aaa的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.hadoop-service.hadoop-aaa</name>
                <value>hadoop-aaa:50070</value>
        </property>

<!-- hadoop-bbb的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.hadoop-service.hadoop-bbb</name>
                <value>hadoop-bbb:50070</value>
        </property>
<!--指定可以通过web访问hdfs目录-->
        <property> 
                <name>dfs.webhdfs.enabled</name>
                <value>true</value>
        </property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://hadoop-aaa:8485;hadoop-bbb:8485;hadoop-ccc:8485/hadoop-service</value>
        </property>
<!-- 指定journalnode文件目录-->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/data/hadoop/journal</value>
    </property>
<!--保证数据恢复 -->
    <property>  
              <name>dfs.journalnode.http-address</name>
              <value>0.0.0.0:8480</value>
    </property>  
    <property>  
                 <name>dfs.journalnode.rpc-address</name>
                 <value>0.0.0.0:8485</value>
     </property>


<!-- 配置失败自动切换实现方式注意这个代理 必须和namenode 别名一致 -->

        <property>
                <name>dfs.client.failover.proxy.provider.hadoop-service</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>

<!-- 配置隔离机制 -->
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>sshfence</value>
        </property>

<!-- 使用隔离机制时需要ssh免密码登陆 -->

        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/root/.ssh/id_rsa</value>
        </property>

<!--指定支持高可用自动切换机制-->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>

<!--指定namenode名称空间的存储地址-->

        <property>   
                <name>dfs.namenode.name.dir</name>   
                <value>file:/data/hadoop/hdfs/name</value>  
        </property>

<!--指定datanode数据存储地址-->

    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/data/hadoop/hdfs/data</value>
    </property>

<!--指定datanode数据存储地址-->

    <property>
        <name>dfs.datanode.address</name>
        <value>0.0.0.0:50010</value>
    </property>

<!--指定数据冗余份数-->

        <property>
             <name>dfs.replication</name>
             <value>2</value>
        </property>

<!--指定可以通过web访问hdfs目录-->

        <property>  
                <name>dfs.webhdfs.enabled</name>  
                <value>true</value> 
        </property>

        <!-- 指定zookeeper地址 -->

        <property>
                <name>ha.zookeeper.quorum</name>
                <value>192.168.137.120:2181,192.168.137.130:2181,192.168.137.140:2181</value>
        </property>

</configuration>

core-site.xml hdfs-site.xml配置说明

  • NNHA目前只能配置2台,配置3台直接无法启动
  • 所有的节点机器全部能沿用该配置
  • 使用该配置后 实际上会读取core-site.xml的zookeeper 获取hdfs://hadoop-service 真实地址 然后去访问(也就是真实的NameNode 即 hadoop-aaa:9000 与 hadoop-bbb:9000)
  • JournalNode是NameNode的元数据存放时可以继续添加的。
  • DataNode也会根据hdfs-site.xml 自动加入到NameNode的管理中
  • 如何启动的相当重要

如何启动

  • 首先确定NAMENODE HA节点机器并配置core-site.xml hdfs-site.xml

  • 在NAMENODE HA节点机器的其中一台执行以下命令(在zookeeper中初始化所需状态))

    hdfs zkfc -formatZK
    
  • 在NAMENODE HA的2个节点启动zkfc守护程序

    hadoop-daemon.sh start zkfc
    
  • 在添加了dfs.namenode.shared.edits.dir的机器启动主备NN之间同步元数据信息的共享存储系统journalNode

    hadoop-daemon.sh start journalnode
    
  • 在NAMENODE HA节点机器的其中一台格式化namenode 并启动

    hdfs namenode -format
    
    hadoop-daemon.sh start namenode
    
  • 在NAMENODE HA节点机器的另一台同步namenode数据 并启动namenode

    hdfs namenode -bootstrapStandby
    
    hadoop-daemon.sh start namenode
    
  • 所有节点启动DataNode

    hadoop-daemon.sh start datanode
    

涉及到启动的服务(可用jps查看)

NAMENODE HA主节点启动的服务

  • DFSZKFailoverController
  • NameNode

NAMENODE HA元数据共享存储使用的服务

  • JournalNode

DataNode数据节点启用的服务

  • DataNode

查看类命令

使用帮助:hdfs haadmin --help

例如查看节点主备节点

hdfs haadmin -getServiceState hadoop-aaa

hdfs haadmin -getServiceState hadoop-bbb

部分原理

NameNode、DataNode和Client

  • NameNode可以看作是分布式文件系统中的管理者,主要负责管理文件系统的命名空间、集群配置信息和存储块的复制等。NameNode会将文件系统的Meta-data存储在内存中,这些信息主要包括了文件信息、每一个文件对应的文件块的信息和每一个文件块在DataNode的信息等。
  • DataNode是文件存储的基本单元,它将Block存储在本地文件系统中,保存了Block的Meta-data,同时周期性地将所有存在的Block信息发送给NameNode。
  • Client就是需要获取分布式文件系统文件的应用程序。

文件写入

  • Client向NameNode发起文件写入的请求。
  • NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。
  • Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。

文件读取

  • Client向NameNode发起文件读取的请求。
  • NameNode返回文件存储的DataNode的信息。
  • Client读取文件信息。

通信方式

在hadoop系统中,master/slaves/client的对应关系是:

  • master---namenode;
  • slaves---datanode;
  • client---dfsclient;

那究竟是通过什么样的方式进行通信的呢,在这里从大体介绍一下:

  • client和namenode之间是通过rpc通信;
  • datanode和namenode之间是通过rpc通信;
  • client和datanode之间是通过简单的socket通信。