`
langyu
  • 浏览: 890492 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

HDFS: EditLog的完整性增强

    博客分类:
  • hdfs
阅读更多

  用户对HDFS的每步操作都会先记录到NameNode磁盘中的EditLog文件中。为了避免频繁操作磁盘对用户操作效率的影响,HDFS为EditLog在内存中分配两个buffer:一个用于接收用户操作指令;另外一个在用户想要刷新第一个buffer内数据时开始担当接收用户指令的职责。之后两块buffer不断切换角色,进行着上述操作。



  正是因为有内存中buffer的存在,当管理员shutdown NameNode时,就会丢失用户写入buffer且还没来得及刷新到磁盘中的那些操作记录。我们需要做的就是在NameNode加入shutdown hook,希望当NameNode接收到系统的关闭信号时,能正常刷新buffer中数据到磁盘中。

  如果我们能改动NameNode的代码,那么就可以像这样加入:(HDFS0.21)

// NameNode.java
public static void main(String argv[]) throws Exception {
    try {
      StringUtils.startupShutdownMessage(NameNode.class, argv, LOG);
      final NameNode namenode = createNameNode(argv, null);
      if (namenode != null)
    	  Runtime.getRuntime().addShutdownHook(new Thread() {
    		 public void run() {
    			 namenode.namesystem.close();
    			 LOG.info("Close FSNameSystem successfully");
    		 }
    	  });
        namenode.join();
    } catch (Throwable e) {
      LOG.error(StringUtils.stringifyException(e));
      System.exit(-1);
    }
  }



  如果不能改动代码的话,可以通过HDFS提供的Service plugin来完成。Service plugin是HDFS提供给管理员的access point,我们可以通过这个access point为HDFS提供一些扩展功能。同样地,创建一个关闭EditLog的plugin。

  创建一个EditLogPlugin的类,注意它的包名应该与NameNode在同一包下面,这是因为nameSystem只有在这个包下面才可以访问。

package org.apache.hadoop.hdfs.server.namenode;

import java.io.IOException;
import org.apache.hadoop.util.ServicePlugin;

public class EditLogPlugin implements ServicePlugin {

	public void start(Object arg0) {
		final NameNode nameNode = (NameNode) arg0;
		Runtime.getRuntime().addShutdownHook(new Thread() {
			 public void run() {
    			 nameNode.namesystem.close();
    			 NameNode.LOG.info("Close FSNameSystem successfully");
    		 }
		});
	}

	public void stop() {
	}

	public void close() throws IOException {
	}

}


  打包这个类,然后把它放到Hadoop的lib目录下。在HDFS的配置文件中这样配:

<property>
     <name>dfs.namenode.plugins</name>
     <value>org.apache.hadoop.hdfs.server.namenode.EditLogPlugin</value>
</property>


这样在NameNode启动后shutdown hook就会加入到系统中。

  但需要注意的是,NameNode中的shutdown hook只有在NameNode进程可以正常拦截系统进程的情况下才可以起作用。像SIGKILL(9)这样的系统信号是不能被进程接收、处理的。所以我们对EditLog正常关闭的期望是很局限的,只有尽最大可能地保证管理脚本和管理操作中不要有“kill -9 <pid>”这样的命令。
  • 大小: 14.2 KB
2
0
分享到:
评论

相关推荐

    hadoop日记2.1:hdfs设计思想和基础概念

    - **高容错性**:即使部分节点出现故障,HDFS仍能保持数据的完整性和可用性。 - **高吞吐量**:通过优化数据访问模式提高整体性能。 - **适用于大文件存储**:对于大文件的处理尤为高效。 - **适用于流式文件数据...

    Hadoop技术-HDFS的高可用性.pptx

    HDFS的高可用性是确保服务持续稳定的关键特性,它解决了单点故障的问题,增强了系统的健壮性和可靠性。 1. HDFS高可用的作用: 在传统的Hadoop集群中,NameNode作为核心组件,负责管理整个文件系统的元数据,包括...

    HDFS架构指南

    - **元数据持久化**:为了确保文件系统元数据的安全性和完整性,HDFS使用了两种主要的持久化机制:FsImage和EditLog。FsImage是文件系统命名空间和属性的持久化映像,而EditLog记录了对命名空间所做的所有更改。 - *...

    Hadoop HA(QJM)高可集群性配置

    这种方式能够保证数据的一致性和完整性,但在故障发生时需要人工干预进行切换。 2. **Secondary NameNode 方案:** Secondary NameNode 定期合并 fsimage 和 edit log 文件,生成一个新的 fsimage 文件。这种方式...

    字节跳动大数据面试题汇总(精华版).pdf

    - HDFS通过租约机制确保数据的一致性和完整性。 - RBF(Replica Block Fetcher)机制用于解决数据副本丢失问题。 4. **Kafka基础知识** - Kafka是一个分布式流处理平台,支持实时数据管道和流应用程序。 5. **...

    hadoop 权威指南(中文版)

    - **数据完整性检查**:通过校验和等方式确保数据在传输过程中的完整性。 - **序列化**:将对象转换为可以存储或传输的形式。Hadoop提供了Avro等工具,支持高效的数据序列化。 - **持久化存储**:将数据持久化到磁盘...

Global site tag (gtag.js) - Google Analytics