Hadoop(十)Hadoop IO之数据完整性
前言
上一篇我分享了Hadoop的压缩和编解码器,在我们开发的过程中其实是经常会用到的,所以一定要去掌握。这一篇给大家介绍的是Hadoop的数据完整性!
Hadoop用户在使用HDFS储存和处理数据不会丢失或者损坏,在磁盘或者网络上的每一个I/O操作不太可能将错误引入自己正在读/写的数据中,但是如果
在处理的数据量非常大到Hadoop的处理极限时,数据被损坏的概率还是挺大的。
一、数据完整性概述
检测数据是否损坏的常用措施是:在数据第一次引入系统时计算校验和并在数据通过一个不可靠的同道进行传输时再一次计算校验和,这样就能发现数据是否
损坏。如果计算所得的新校验和原来的校验不匹配,那么表明数据已经损坏。
注意:该技术并不能修复数据,它只能检测出数据错误。(校验和数据也可能损坏,但是由于校验和文件小,所以损坏的可能性小)
常用的错误检测码是:CRC-32(循环冗余校验),使用CRC-32算法任何大小的数据输入均计算得到一个32位的整数校验码。
二、HDFS的数据完整性
2.1、本地文件上传到HDFS集群时的校验
下面我画了一个图好理解:

比如说我们要本地的passwd文件上传到HDFS集群中,会在本地通过CRC-32算法产生一个对passwd文件的一个校验文件:.passwd.crc。在我们将passwd上传到HDFS集群的时候,
会将本地文件系统中产生的.passwd.crc文件一起写入到HDFS集群当中。在HDFS集群中接收到数据以后也会产生一个校验文件和本地的校验文件进行比较,如果相同则会存储,
并且也会存储本地的.passwd.crc文件到数据节点中。如果不相同则不存储。
2.2、HDFS集群文件读取到本地
这里我就不画图了。
当我们客户端要去读取HDFS集群上的数据时,因为数据都是存储在DataNode当中的,所以会NameNode会告诉客户端去哪个数据块中去寻找数据,找到之后存储数据的DataNode会使用
CRC-32算法产生一个校验文件和最开始写入数据一起上传上来的校验文件进行对比。如果不相同说明数据已经损坏了,此时DataNode就会报告NameNode数据已经损坏了。这时候NameNode
就会告诉客户端这个数据块的数据不能用了,你去别的数据块中去寻找数据,这样客户端就能找到完整恩地数据。(对于损坏的数据,NameNode会重新去拷贝,进行重新的备份。)
三、涉及数据一致性的类:LocalFileSystem和RawFileSystem
3.1、概述
Hadoop的LocalFileSystem执行客户端的校验和验证。当在你写入一个filename的文件时,文件系统客户端会明确地在包含每一个文件校验和的同一个
目录内新建一个名为.filename.crc的隐藏文件。
简单的说:
当你把文件上传到HDFS集群中时,你要对文件在本地进行CRC校验就使用LocalFileSystem。
你不想对文件进行校验时就是用RawFileSystem。
3.2、编写程序验证
我们知道LocalFileSystem和RawFileSystem都是FileSystem的子类
注意:这里是在本地中对文件进行CRC检验。
1)DataIntegrity_Put_0010(上传)
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocalFileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RawLocalFileSystem;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; public class DataIntegrity_Put_0010
extends Configured
implements Tool{ private FileSystem fs;
private OutputStream os; @Override
public int run(String[] args) throws Exception{
Configuration conf=getConf();
//不做数据校验
fs=new RawLocalFileSystem();
//因为是直接new的对象,所以这里使用这个方法去传递配置文件
fs.initialize(URI.create(args[]),conf);
os=fs.create(new Path(args[]));
os.write("".getBytes());
os.close(); //做数据校验
fs=new LocalFileSystem(fs);
os=fs.create(new Path(args[]));
os.write("".getBytes());
os.close();
return ;
} public static void main(String[] args) throws Exception{
System.exit(
ToolRunner.run(
new DataIntegrity_Put_0010(),
args));
}
}
测试:
在安装了集群客户端的Linux服务器中执行:

查看:没有看到b.txt有校验文件呀。因为它是隐藏文件

我们使用ls -l a查看隐藏文件:
对于a.txt因为使用的是RawFileSystem,所以没有产生.a.txt.crc的校验文件

对于b.txt

查看.a.txt.crc文件:它是一个二进制文件

以上就是我们将文件上传到本地的文件系统时产生crc校验文件,其实就是模拟了文件上传到HDFS集群时的状态。.
2)DataIntegrity_Get_0010(读取)
import java.io.InputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocalFileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RawLocalFileSystem;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; public class DataIntegrity_Get_0010
extends Configured implements Tool{ private FileSystem fs;
private InputStream is; @Override
public int run(String[] args) throws Exception{
Configuration conf=getConf(); fs=new RawLocalFileSystem();
fs.initialize(URI.create(args[]),conf);
is=fs.open(new Path(args[]));
byte[] buff=new byte[];
int len=is.read(buff);
System.out.println(new String(buff,,len));
is.close(); fs=new LocalFileSystem(fs);
is=fs.open(new Path(args[]));
byte[] buff1=new byte[];
int len1=is.read(buff1);
System.out.println(new String(buff1,,len1));
is.close(); return ;
} public static void main(String[] args) throws Exception{
System.exit(ToolRunner.run(new DataIntegrity_Get_0010(),args));
}
}
测试:
执行并产生结果:

当我们把没有做校验的a.txt修改一下:

再次运行程序是没有问题的,显示的是修改后的a.txt的数据。
当我们把做了校验的b.txt修改一下:

再次运行程序:

结果:

喜欢就点个“推荐”!
Hadoop(十)Hadoop IO之数据完整性的更多相关文章
- Hadoop十年解读与发展预测
编者按:Hadoop于2006年1月28日诞生,至今已有10年,它改变了企业对数据的存储.处理和分析的过程,加速了大数据的发展,形成了自己的极其火爆的技术生态圈,并受到非常广泛的应用.在2016年Ha ...
- 【原创】大叔问题定位分享(16)spark写数据到hive外部表报错ClassCastException: org.apache.hadoop.hive.hbase.HiveHBaseTableOutputFormat cannot be cast to org.apache.hadoop.hive.ql.io.HiveOutputFormat
spark 2.1.1 spark在写数据到hive外部表(底层数据在hbase中)时会报错 Caused by: java.lang.ClassCastException: org.apache.h ...
- Hadoop基础-通过IO流操作HDFS
Hadoop基础-通过IO流操作HDFS 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上传文件 /* @author :yinzhengjie Blog:http://www ...
- hive orc压缩数据异常java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.ql.io.orc.OrcSerde$OrcSerdeRow
hive表在创建时候指定存储格式 STORED AS ORC tblproperties ('orc.compress'='SNAPPY'); 当insert数据到表时抛出异常 Caused by: ...
- 常见的Hadoop十大应用误解
常见的Hadoop十大应用误解 1. (误解) Hadoop什么都可以做 (正解) 当一个新技术出来时,我们都会去思考它在各个不同产业的应用,而对于平台的新技术来说,我们思考之后常会出现 ...
- Hadoop十年
于 2006 年 1 月 28 日诞生的它改变了企业对数据的存储.处理和分析的过程,加速了大数据的发展,形成了自己的极其火爆的技术生态圈,并受到非常广泛的应用.在此为大家梳理 Hadoop 这十年的变 ...
- 五十九.大数据、Hadoop 、 Hadoop安装与配置 、 HDFS
1.安装Hadoop 单机模式安装Hadoop 安装JAVA环境 设置环境变量,启动运行 1.1 环境准备 1)配置主机名为nn01,ip为192.168.1.21,配置yum源(系统源) 备 ...
- hadoop(十)hdfs上传删除文件(完全分布式七)|12
集群测试 上传小文件到集群,随便选择一个小文件上传到hdfs的根目录 [shaozhiqi@hadoop102 hadoop-3.1.2]$ bin/hdfs dfs -put wcinput/wc. ...
- [Hadoop 周边] Hadoop和大数据:60款顶级大数据开源工具(2015-10-27)【转】
说到处理大数据的工具,普通的开源解决方案(尤其是Apache Hadoop)堪称中流砥柱.弗雷斯特调研公司的分析师Mike Gualtieri最近预测,在接下来几年,“100%的大公司”会采用Hado ...
- Hadoop记录-hadoop集群常见问题汇总
[问题1]HBase Shell:ERROR: org.apache.hadoop.hbase.IPc.ServerNotRunningYetException: Server is not runn ...
随机推荐
- 英式英语VS美式英语
- Wincc flexable的IO域组态
1.题目 2.新建三个变量 3.组态画面,添加IO域1 1)常规设置 2)属性设置 4.组态IO域2 1)常规项 2)属性设置 5.组态第三个IO域 1)常规设置 2)属性设置 6.此外可以设置动画 ...
- ArcGIS 网络分析[8.1] 资料1 使用AO打开或创建网络数据集之【打开】
为了创建或打开一个网络数据集,你必须使用NetworkDatasetFDExtension对象(文件地理数据库中的数据集)或NetworkDatasetWorkspaceExtension对象(对于S ...
- 配置linux下apache跨域问题
1.apache设置允许远程访问 打开FTP,登录服务器,找到etc文件夹下的httpd.conf文件,然后下载到本地 打开本地httpd.conf文件夹,找到对应的端口ip地址,修改如下 <V ...
- MySQL如何找到表与表之间的关系?
如何找到两张表之间的关系? 先站在左表的角度上去找,如果可以找到左表的多个字段可以对应右表的一个字段,那么左表的一个字段foregin key右表的一个字段.一般情况下为id... 2.如果右表的多个 ...
- 微信小程序之页面路由
路由方式 简介 对于路由的触发方式以及页面生命周期函数如下: 路由方式 触发时机 路由前页面 路由后页面 初始化 小程序打开的第一个页面 onLoad, onSHow 打开新页面 调用 API w ...
- Netty之多用户的聊天室(三)
Netty之多用户的聊天室(三) 一.简单说明 笔者有意将Netty做成一个系列的文章,因为笔者并不是一个善于写文章的人,而且笔者学习很多技术一贯的习惯就是敲代码,很多东西敲着敲着就就熟了,然后再进行 ...
- CheckForIllegalCrossThreadCalls = false
多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,这时如果想要访问窗口的控件,发现无法对其控制. 这时可将窗口构造函数中的CheckForIllegalCrossThreadCalls设置为f ...
- AVFoundation 框架初探究(二)
接着第一篇总结 系列第一篇地址:AVFoundation 框架初探究(一) 在第一篇的文章中,我们总结了主要有下面几个点的知识: 1.对AVFoundation框架整体的一个认识 2.AVSpeech ...
- php 使用beanstalk 消息队列
Beanstalkd 消息队列 一.基本信息Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有 ...