前言

  上一篇我分享了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之数据完整性的更多相关文章

  1. Hadoop十年解读与发展预测

    编者按:Hadoop于2006年1月28日诞生,至今已有10年,它改变了企业对数据的存储.处理和分析的过程,加速了大数据的发展,形成了自己的极其火爆的技术生态圈,并受到非常广泛的应用.在2016年Ha ...

  2. 【原创】大叔问题定位分享(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 ...

  3. Hadoop基础-通过IO流操作HDFS

    Hadoop基础-通过IO流操作HDFS 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上传文件 /* @author :yinzhengjie Blog:http://www ...

  4. 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: ...

  5. 常见的Hadoop十大应用误解

    常见的Hadoop十大应用误解 1.        (误解) Hadoop什么都可以做 (正解) 当一个新技术出来时,我们都会去思考它在各个不同产业的应用,而对于平台的新技术来说,我们思考之后常会出现 ...

  6. Hadoop十年

    于 2006 年 1 月 28 日诞生的它改变了企业对数据的存储.处理和分析的过程,加速了大数据的发展,形成了自己的极其火爆的技术生态圈,并受到非常广泛的应用.在此为大家梳理 Hadoop 这十年的变 ...

  7. 五十九.大数据、Hadoop 、 Hadoop安装与配置 、 HDFS

    1.安装Hadoop 单机模式安装Hadoop 安装JAVA环境 设置环境变量,启动运行   1.1 环境准备   1)配置主机名为nn01,ip为192.168.1.21,配置yum源(系统源) 备 ...

  8. hadoop(十)hdfs上传删除文件(完全分布式七)|12

    集群测试 上传小文件到集群,随便选择一个小文件上传到hdfs的根目录 [shaozhiqi@hadoop102 hadoop-3.1.2]$ bin/hdfs dfs -put wcinput/wc. ...

  9. [Hadoop 周边] Hadoop和大数据:60款顶级大数据开源工具(2015-10-27)【转】

    说到处理大数据的工具,普通的开源解决方案(尤其是Apache Hadoop)堪称中流砥柱.弗雷斯特调研公司的分析师Mike Gualtieri最近预测,在接下来几年,“100%的大公司”会采用Hado ...

  10. Hadoop记录-hadoop集群常见问题汇总

    [问题1]HBase Shell:ERROR: org.apache.hadoop.hbase.IPc.ServerNotRunningYetException: Server is not runn ...

随机推荐

  1. 《Spark大数据处理:技术、应用与性能优化》【PDF】

    内容简介 <Spark大数据处理:技术.应用与性能优化>根据最新技术版本,系统.全面.详细讲解Spark的各项功能使用.原理机制.技术细节.应用方法.性能优化,以及BDAS生态系统的相关技 ...

  2. 微信小程序教学第四章第二节(含视频):小程序中级实战教程:详情-视图渲染

    § 详情 - 数据渲染 本文配套视频地址: https://v.qq.com/x/page/x055550lrvd.html 开始前请把 ch4-2 分支中的 code/ 目录导入微信开发工具 这一节 ...

  3. 4. sudo,PATH环境变量,修改字符集,ntpserver,加大文件描述符,隐藏内核版本,锁定关键系统文件

    1   命令:  visudo              98gg      98行             yy           复制当前行             p              ...

  4. 事务处理操作(COMMIT,ROLLBACK)。复制表。更新操作UPDATE实际工作中一般都会有WHERE子句,否则更新全表会影响系统性能引发死机。

    更新操作时两个会话(session)同时操作同一条记录时如果没有事务处理操作(COMMIT,ROLLBACK)则会导致死锁. 复制表:此方法Oracle特有

  5. Kotlin——最详细的数据类、密封类详解

    在前面几个章节章节中,详细的讲解了Koltin中的接口类(Interface).枚举类(Enmu),还不甚了解的可以查看我的上一篇文章Kotlin--接口类.枚举类详解.当然,在Koltin中,除了接 ...

  6. react native仿微信性别选择-自定义弹出框

    简述 要实现微信性别选择需要使用两部分的技术: 第一.是自定义弹出框: 第二.单选框控件使用: 效果 实现 一.配置弹出框 弹出框用的是:react-native-popup-dialog(Git地址 ...

  7. 数据库SQL优化

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  8. Search 命令详解

    *查: ls : 查看文件等信息 /cat: 查看文件只显示最后一页. /cat > filename:创建新文件  /cat file1 file2 > file:合并文件  / -A ...

  9. python:发送消息给微信企业号

    # -*- coding:utf-8 -*- import requests import json ''' 基础环境:微信企业号 version:python 2.7 ''' class Send_ ...

  10. 进程间通信 ipcs

    在linux系统上借助ipcs命令可以方便地查看进程间通信状态 操作系统:centos7.3 x86_64 应用软件: oracle12c