Hadoop I/O操作(笔记)

来源:互联网 发布:淘宝客服用什么软件 编辑:程序博客网 时间:2024/06/11 17:52

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使用类似




0 0