`
langyu
  • 浏览: 884458 次
  • 性别: 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
分享到:
评论

相关推荐

    hbase 启动regionserver日志报错: Wrong FS: hdfs:// .regioninfo, expected: file:///

    NULL 博文链接:https://bnmnba.iteye.com/blog/2322332

    高可用性的HDFS:Hadoop分布式文件系统深度实践

    第1章 HDFS HA及解决方案 1.1 HDFS系统架构 1.2 HA定义 1.3 HDFS HA原因分析及应对措施 1.3.1 可靠性 1.3.2 可维护性 1.4 现有HDFS HA解决方案 1.4.1 Hadoop的元数据备份方案 1.4.2 Hadoop的SecondaryNameNode方案 ...

    webhdfs:Hadoop WebHDFS的Ruby客户端

    webhdfs-Hadoop WebHDFS和HttpFs的客户端库实现,用于Ruby webhdfs gem用于访问Hadoop WebHDFS(EXPERIMENTAL:和HttpFs)。 WebHDFS :: Client是客户端类,而WebHDFS :: FileUtils是类似“ fileutils”的实用程序。...

    Nicholas:HDFS:What is New in Hadoop 2

    该文档来自2013中国大数据技术大会上,Member of the Project Management Committee at Apache Hadoop,Nicholas关于《HDFS: What is New in Hadoop 2》主题的演讲。

    高可用性的HDFS:Hadoop分布式文件系统深度实践

    本书专注于Hadoop 分布式文件系统(HDFS)的主流HA 解决方案,内容包括:HDFS 元数据解析、Hadoop 元数据备份方案、Hadoop Backup Node 方案、AvatarNode 解决方案以及最新的HA 解决方案Cloudrea HA Name Node 等。...

    HDFS scalability:the limits to growth

    一篇讲述apache hdfs扩展性限制的文章

    kafka-to-hdfs:将来自 Kafka 主题的消息通过管道传输到 HDFS

    kafka 到 hdfs 将来自主题的消息通过管道传输到 HDFS。 大纲 这比的简单得多,但它可以完成从 Kafka 到 HDFS 的简单加载。 这对于在一段时间内获取 Kafka 主题的实时样本非常有用,以便稍后在其上运行 MapReduce。 ...

    HDFS总结.xmind

    HDFS知识点总结(思维导图)XMIND文件

    hdfs:HDFS的本机go客户端

    Go的HDFS 这是hdfs的本地golang客户端。 它使用协议缓冲区API直接连接到namenode。 它尝试通过在可能的情况下对stdlib os包进行os.FileInfo来使其成为惯用语言,并从中实现接口,包括os.FileInfo和os.PathError 。...

    ansible-hdfs:用于安装 Cloudera HDFS 的 Ansible 角色

    角色变量hdfs_version - HDFS 版本hdfs_cloudera_distribution - Cloudera 发行版(默认: cdh5.4 ) hdfs_conf_dir - HDFS 的配置目录(默认: /etc/hadoop/conf ) hdfs_namenode - 确定节点是否为 HDFS NameNode ...

    Php-Hadoop-Hdfs:通过 CLI 和 WebHDFS 用于 HDFS 的 PHP 客户端

    $ hdfs = new \ Hdfs \ Cli (); 实例化 WebHDFS 实现: $ hdfs = new \ Hdfs \ Web (); $ hdfs -&gt; configure ( $ host , $ port , $ user ); 更改本地文件系统的包装器。 如果您需要 hdfs 与另一个远程服务而...

    chef-bigtop-hdfs:Apache Bigtop 的基本食谱

    厨师-bigtop-hdfs-cookbook 目前正在开发中 - 还没有功能 Apache Bigtop 的 HDFS 说明书 - 使用 Apache Bigtop 发行版的 0.8.0 版安装 hadoop hdfs ( ) 这本食谱是使用 ChefDK 开发的 你需要什么 安装 VirtualBox ...

    node-hdfs:Node.js HDFS接口

    NPM HDFS模块 这是用于与Web HDFS界面通信的node.js界面。 如何使用 正在安装 在使用此模块之前,我们需要先安装它 $ npm install --save hdfs247 在不安全的群集上使用 var Hdfs = require ( 'hdfs' ) , local...

    WebHdfs:.NET WebHDFS客户端库

    Web高清基于Microsoft.AspNet.WebApi.Client的简单.NET WebHDFS客户端库“简单”是指: 没有安全性(HDFS上的安全性关闭模式) 没有日志记录(处理(可能会在一天后添加)) 真的很愚蠢代码部分取自某些Microsoft ...

    Spark 基础.docx

    1.首先启动hdfs 2.向hdfs上传一个文件到hdfs://node1.itcast.cn:9000/words.txt 3.在spark shell中用scala语言编写spark程序 sc.textFile&#40;"hdfs://node1.itcast.cn:9000/words.txt"&#41;.flatMap(_.split(" ")) ...

    Hadoop原理与技术hdfs命令行基本操作

    (6)移动hdfs文件:hdfs dfs -mv /hdfs路径 /hdfs路径 (7)复制hdfs文件:hdfs dfs -cp /hdfs路径 /hdfs路径 (8)删除hdfs文件:hdfs dfs -rm /文件名 (9)删除hdfs文件夹:hdfs dfs -rm -r /文件夹名

Global site tag (gtag.js) - Google Analytics