8.1 I/O操作中的数据检查
1.对本地I/O的检查
客户端在存储和读取文件时进行校验和处理,保证文件完整性。可以在core-default.xml中设置
<property>
<name io.bytes.per.checksum/>
<value 512/>
</property>
一般文件系统都能保证数据完整性,不需要Hadoop这部分功能,可以在上文件中禁用校验和机制。
<property>
<name fs.file.impl/>
<value org.apache.hadoop.fs.LocalFileSystem/>
</property>
如果你只想在程序中对某些读取禁止校验和检验,可以声明RawLocalFileSystem
FileSystem fs =new RawLocalFileSystem();
fs.initialize(null,conf);
当你需要校验和服务时,可以很方便地声明ChecksumFileSystem,继承自FileSystem
FileSystem fs =new RawLocalFileSystem();
FileSystem checksumFs = new ChecksumFileSystem(fs);
2.对HDFS的I/O数据进行检查
HDFS在一下三种情况下会检验校验和:
(1)DataNode接收数据后,存储数据前;
(2)客户端读取DataNode上的数据时;
(3)DataNode后台守护进程的定期检测;
3.数据恢复策略:略
8.2数据的压缩
8.2.1.压缩工具的选择
DEFLATE,Gzip,bzip2,LZO
8.2.2.压缩分割与输入分割
8.2.3.在MapReduce程序中使用压缩
在Job配置时配置好conf
设置map处理后数据的压缩,代码示例如下:
JobConf conf = new JobConf();
conf.setBoolean("mapred.compress.map.output",true);
设置output输出压缩,代码实例如下:
JobConf conf = new JobConf();
conf.setBoolean("mapred.output.compress",true);
conf.setClass("mapred.output.compression.codec",GzipCodec.class,CompressionCodec.class);测试使用压缩与否的效率差别:六台主机组成的小集群,输入文件为未压缩的大约为300M的文件,由随机英文字符串组成,每个字符串6位,由空格隔开,50个一行,共5千万个字符串,对文件进行wordCount。Map的输出格式采用默认的压缩算法,output输出格式采用Gzip压缩方法。压缩后程序运行快4min。
适合于集群应用网络间传输。
8.3数据的I/O序列化操作
序列化:对象转化为字节流。
反序列化:字节流转化为对象。
8.3.1Writable类
Writable是hadoop中基本类型,通过它定义了Hadoop中的基本数据类型及其操作。无论是上传还是下载数据还是运行MapReduce程序,都需要使用Writable类。Writable类只定义了两种方法:
void write(DataOutput out)throws IOException
void readFields(DataInput in)throws IOException
其派生类:BooleanWritable,Byte,Int,Long等
1、Hadoop的比较器
WritableComparable类是Hadoop非常重要的接口类,继承自Hadoop的Writable类和Java的Comparable类。
WritableComparator是WritableComparable的比较器,是RawComparator针对WritableComparator类的一个通用实现,而RawComparator继承自java的Comparator。
MapReduce执行时,Reducer会搜集相同key值的key-value对,并且在reduce之前会有一个排序,这些键值的比较都是对WritableComparator类型进行的比较。
Hadoop在RawComparator中实现了对未反序列化对象的读取,这样做的好处是,可以不必创建对象就比较想比较的内容(多是key值),从而省去了创建对象的开销。
2、Writable类中的数据类型
WritableComparator被应用在各个基本数据类型Writable类中,定义了compare,compareTo函数,可直接调用o1.compareTo(o2)
NullWritable 类:占位符,序列化长度为0,没有流从数据中读出或者写入。
8.4 针对MapReduce的文件类
map输出中间结果由SequenceFile和MapFile类表示,其中MapFile是经过排序并带有索引的SequenceFile类。
8.4.1 SequenceFile类
SequenceFile记录的是key/value对的列表,是序列化之后的二进制文件,因此不能直接查看。
1、未压缩和压缩value的SequenceFile数据格式基本是相同的
利用SequenceFile.Writer和Reader进行读写文件
见SequenceFileTest类中读写
8.4.2 MapFile类
MapFIle与SequenceFile使用类似