Hadoop HDFS数据完整性

数据完整性

IO操作过程中难免会出现数据丢失或脏数据,数据传输量越大出错的几率就越大。校验错误最常用的办法就是传输前计算一个校验和,传输后计算一个校验和,两个校验和如果不相同就说明数据存在错误,比较常用的错误校验码是CRC32。

HDFS数据完整性

HDFS写入的时候计算出校验和,然后每次读的时候再计算校验和。要注意的一点就是,HDFS每固定长度就会计算一次校验和,这个值由io.bytes.per.checksum指定,默认值是512字节。因为CRC32是32位即4个字节,这样校验和占用的空间就会少于原数剧1%。1%这个数字在hadoop中会经常看到。以后有时间会整理一份和1%不得不说的故事。

DataNode在存储收到的数据前会校验数据的校验和,比如收到客户端的数据或者其他副本传过来的数据。客户端写入数据到HDFS时的数据流,在管道的最后一个DataNode会去检查这个校验和,如果发现错误,就会抛出ChecksumException到客户端。

客户端从DataNode读取数据的时候一样要检查校验和,而且每个DataNode还保存了检查校验和的日志,客户端的每一次校验都会记录到日志中。

除了读写操作会检查校验和以外,DataNode还跑着一个后台进程(DataBlockScanner)来定期校验存在在它上面的的block,因为除了读写过程中会产生数据错误以外,硬件本身也会产生数据错误,比如说位衰减(bit rot)

如果客户端发现有block坏掉,主要通过以下步骤进行修复:

1.客户端在抛出ChecksumException之前会把坏的block和block所在的DataNode报告给NameNode。

2.NameNode把这个block标记为已损坏,这样NameNode就不会把客户端指向这个block,也不会复制这个block到其他DataNode。

3.NameNode会把一个好的block复制到另外一个DataNode。

4.NameNode把坏的block删除掉。

注:如果出于一些原因在操作的时候不想让HDFS检查校验码,在调用FileSystem的open方法前调用setVerityChecksum方法,并设置为false即可,命令行下可以使用-ignoreCrc参数。

实现

LocalFileSystem继承自ChecksumFileSystem,已经实现了checksum的功能,checksum的信息存储在与文件同名的crc文件中,发现错误的文件放在bad_files文件夹中。如果你确认顶层系统已经实现了checksum功能,那么你就没有必要使用LocalFileSystem,改为使用RowLocalFileSystem,可以通过更改fs.file.impl=org.apache.hadoop.fs.RawLocalFileSystem全局指定,也可以通过代码直接实例化。

[java] view plain copy

  1. Configuration conf=...
  2. FileSystem fs=new RawLocalFileSystem();
  3. fs.initialize(null, conf);

如果其他的FileSystem想拥有checksum的功能,只需要用ChecksumFileSystem包装一层即可:

[java] view plain copy

  1. FileSystem rawFs=...
  2. FileSystem checksummedFs=new ChecksumFileSystem(fs){} ;
时间: 2024-08-26 00:31:53

Hadoop HDFS数据完整性的相关文章

Hadoop hdfs&mapreduce核心概念

1.HDFS(分布式文件系统体系) 1.1.NameNode:(名称节点) Hdfs的守护程序 记录文件是如何分割成数据块的,以及这些数据块被存储到了哪些节点上 对内存和I/O进行集中管理 是个单点,发生故障将使集群崩溃 1.2.SecondaryNamenode(辅助名称节点):发生故障进行人工的设置才能实现集群崩溃的问题 监控HDFS状态的辅助后台程序 每个集群都有一个 与NameNode进行通讯,定期保存HDFS元数据快照 与NameNode故障可以作为备用NameNode使用 1.3.D

kafka-connect-hdfs连接hadoop hdfs时候,竟然是单点的,太可怕了。。。果断改成HA

2017-08-16 11:57:28,237 WARN [org.apache.hadoop.hdfs.LeaseRenewer][458] - <Failed to renew lease for [DFSClient_NONMAPREDUCE_-1756242047_26] for 30 seconds. Will retry shortly ...> org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyE

Datanode启动问题 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool &lt;registering&gt;

2017-04-15 21:21:15,423 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: supergroup = supergroup 2017-04-15 21:21:15,467 INFO org.apache.hadoop.ipc.CallQueueManager: Using callQueue: class java.util.concurrent.LinkedBlockingQueue queueCapacity:

Hadoop HDFS编程 API入门系列之HDFS_HA(五)

不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs3; import java.io.FileInputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.URI; import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSyst

【转】Hadoop HDFS分布式环境搭建

原文地址  http://blog.sina.com.cn/s/blog_7060fb5a0101cson.html Hadoop HDFS分布式环境搭建 最近选择给大家介绍Hadoop HDFS系统,因此研究了一下如何在Linux 下配置一个HDFS Clust.小记一下,以备将来进一步研究和记忆. HDFS简介 全称 Hadoop Distributed File System, Hadoop分布式文件系统. 根据Google的GFS论文,由Doug Cutting使用JAVA开发的开源项目

Hadoop HDFS (3) JAVA访问HDFS

现在我们来深入了解一下Hadoop的FileSystem类.这个类是用来跟Hadoop的文件系统进行交互的.虽然我们这里主要是针对HDFS,但是我们还是应该让我们的代码只使用抽象类FileSystem,这样我们的代码就可以跟任何一个Hadoop的文件系统交互了.在写测试代码时,我们可以用本地文件系统测试,部署时使用HDFS,只需配置一下,不需要修改代码了. 在Hadoop 1.x以后的版本中引入了一个新的文件系统接口叫FileContext,一个FileContext实例可以处理多种文件系统,而

kafka-connect-hdfs重启,进去RECOVERY状态,从hadoop hdfs拿租约,很正常,但是也太久了吧

虽说这个算是正常现象,等的时间也太久了吧.分钟级了.这个RECOVERY里面的WAL有点多余.有这么久的时间,早从新读取kafka写入hdfs了.纯属个人见解. @SuppressWarnings("fallthrough") public boolean recover() { try { switch (state) { case RECOVERY_STARTED: log.info("Started recovery for topic partition {}&quo

Hadoop HDFS源码分析 关于数据块的类

Hadoop HDFS源码分析 关于数据块的类 1.BlocksMap 官方代码中的注释为: /** * This class maintains the map from a block to its metadata. * block's metadata currently includes blockCollection it belongs to and * the datanodes that store the block. */ BlocksMap数据块映射,管理名字节点上的数据

基于key/value+Hadoop HDFS 设计的存储系统的shell命令接口

对于hadoop HDFS 中的所有命令进行解析(其中操作流程是自己的想法有不同意见欢迎大家指正) 接口名称 功能 操作流程 get 将文件复制到本地文件系统 .如果指定了多个源文件,本地目的端必须是一个目录. (1)按照上述机制,在Config server上的存储引擎中逐层读取K-V,直到获得文件名(或大文件元数据信息): (2)根据文件名(或大文件元数据信息)到相应的Data server中获取相应的文件(大文件需要拼接): (3)将获取的文件写入本地文件系统. put 从本地文件系统中复