一 IO中的数据检查
1、本地文件中的IO 检查
当hadoop创建一个本地文件时,会在同一文件夹下创建一个隐藏的问价.filename.src文件,记录该文件的校验和,原文件每512字节生成一个32位的校验和,可在src/core/core-default.xml中通过修改io.bytes.per.checksum的大小来修改。也可通过修改该xml文件中的fs.file.impl属性来进制默认为LocalFileSystem,改为RawLocalFileSystem即可禁止。(因为该类型的文件系统自身支持校验和,就不需要hadoop的这部分功能了)如果hadoop发现了校验错误,会把问题文件以及校验和移动到一个叫bad_files的目录下。
2、hdfs中的IO检查
hdfs会在三种情况下进行检验校验和
(1)DateNode从客户端或者其他DataNode接受数据后,存储数据前
(2)客户端读取DataNode上的数据时
(3)DataNode后台守护进程在定期监测时
二、hadoop中的压缩
在mapreduce中进行数据压缩,只需加入几行代码
conf.setBoolean("mapred.compress.map.output",true);//compress the output of the result of map
conf.setBoolean("maprd.output.compress",true);//compress the output of the final result
conf.setIfUnset("maprd.output.compression,type",true);//set the type of compress
conf.setClass("mapred.output,compression,codec",GzipCodec.Class,CompressionCodec.class);
三、数据中的IO序列化操作
序列化是将对象转换成字节流的方法,有两个目的
进程间通信(hadoop采用rpc作为进程组件间通信的进制)
数据持久性存储
hadoop没有采用java的序列化机制,而是采用自己实现的Writables机制
1、Writable类
该类定义了Hadoop中的基本数据类型极其操作
该类只有两个方法
write(DataOutput output)//如何将当前对象写入字节流中
readFilelds(DataInput in)//如何从字节流中读取当前对象的fields以构造当前对象
DataInput和DataOutput是java定义的接口
它们有readxxx、writexxx方法,简单的说就是从当前字节流中读取若干个字节赋给一个java基本类型并返回它