一 Hadoop的I/O
1 数据完整性
检测损坏数据的常用方法是在第一次进入系统时计算数据的校验和,如果新生成的校验和不完全匹配原始的校验和,那么数据就被认为是被损坏了。
每个512字节都有一个单独的校验和。
数据节点负责在存储数据及其校验和前验证它们收到的数据。客户端写入数据并且将它发送到一个数据节点的管线中,在管线上的最有一个数据节点验证校验和。如果此节点检测到错误,客户端便会收到一个checksum excption。
除了对客户端读取数据进行验证,每个数据节点还会在后台线程运行一个DataBlockScanner(数据块检测程序),定期验证存储在数据节点上的所有块,防止物理损坏。
由于HDFS存储着块的副本,它可以通过复制完整的副本来产生一个新的,无措的副本来替换那个出错的副本,出错的副本会被删除。保证副本数回归到预期的数量。
Hadoop的本地文件系统执行客户端校验,这意味着,在写一个名为filename的文件时,文件系统的客户端以透明方式创建了一个隐藏的文件.fielname.crc,在同一个文件夹下包含每个文件块的校验和。
禁用校验和:因为底层文件系统原声支持校验和,通过使用RawLocalFileSystem来替代LocalFileSystem完成的。
如果输入的文件是压缩过的,那么在被MapReduce读取时,它们会被自动解压。根据文件扩展名来决定应该使用哪一个压缩解码器。
如果为输出使用了一些列文件,可以设置mapred.output.compression.type属性来控制压缩类型。默认为RECORD,它研所单独的记录,将它改为BLOCK,则可以压缩一组记录,由于它有更好的压缩比,所以推荐使用。
因为Map作业的输出会被写入磁盘,并通过网络传输到reducer节点,所以如果使用LZO之类的快速压缩,能得到更好的性能。因为传输的数据量大大减少了。
2 序列化(结构化对象——>字节流)
序列化(serialization)指的是将结构化对象转为字节流以便于通过网络进行传输或写入持久存储的过程。
两个应用:进程间通信和持久存储。
Hadoop中,节点之间的进程间通信是用远程过程调用(RPC)来实现的,RPC协议使用序列化将消息编码为二进制流,此后,二进制流被反序列化为原始消息。特点:紧凑,快速,可扩展性,互操作性。
Hadoop使用自己的序列化格式Writeables(重点,但是跳过了),两个方法:DataOutput流(用于将其状态写入二进制格式),另一个用于从二进制格式的DataInput流读取其态。
WritableComparator是RawComparator对WritableComparable类的一个通用实现。它提供两个主要功能。首先,它提供了一个默认的对原始compare()函数的调用,对从数据流对要比较的对象进行反序列化,然后调用对象的compare()方法。其次,它充当的是RawComparator实例的一个工厂方法。
3 基于文件的数据结构
对于某些应用,需要一个特殊的数据结构来存储数据。针对运行基于MapReduce的进程,将每个二进制数据块放入自己的文件,这样做不易扩展,所以Hadoop为此开发了一系列高级容器。
SequenceFile类:为二进制键值对提供一个持久化的数据结构。可以用于日志文件,每一个日志记录都是一行新的文本。如果想记录二进制类型,纯文本并不是一个合适的格式,可以把日志的文件格式换成SequenceFile类。用作小型文件的容器时,会更高效地存储和处理。
写入一个SenquenceFile类(格式化流程P110)
读取SequenceFile类(格式化流程P114)
用命令行接口显示序列文件
Hadoop文件系统有一个-text选项显示文件格式的序列文件。它看起来像是文件的魔法数字,使其能够尝试检测文件类型并相应地将其转换为文本。
排序和合并序列文件:最强的方式是使用MapReduce(并行),首选方法。
序列文件的格式:序列文件由一个头部和一个或多个记录组成。
MapFile:经过排序的带索引的SequenceFile,可以根据键进行查找。
写一个MapFile:创建一个MapFile.Writerde实例,然后调用append()方法,按顺序添加条目。键必须是WritableComparable的一个实例,值必须是Writable类型。相对于SequenceFile,MapFIle可以为其条目使用任何序列化框架。
将SequenceFile转换为MapFile:1,将序列文件归入一个名为number.map的新建目录,后者将变为MapFile;2,MapReduce的输出被重命名为data文件;3,创建index文件。
二 MapReduce应用开发(跳过)
三 MapReduce的工作原理(跳过)
四 MapReduce的类型与格式(跳过)
五 MapReduce特性(计数器,排序和数据集的连接)
计数器:用于收集有关作业的统计数据,无论是对于质量控制,还是应用曾敏啊的统计数。如果相知相爱map或reduce任务中添加一条记录信息,那么通常更好的方法看是否可以用一个计数器来记录特定情况的发生。
Hadoop对于每个作业都维护着一些内置计数器,它们为作业记录了不同方面的内容,如有字节和记录处理数量的,可由此确认是否消耗了符合预期数量的输入并且产生了符合预期数量的输出。
计数器被与它们相关的任务所维护,并定期发送到tasktracker,然后发送到jobtracker,这样就能在全局范围内汇总这些计数器。这些内置的作业计数器实际上是jobtraker维护的,因此它们不必通过网络发送,这点不同于其他计数器,包括用户自定义计数器。
排序:对数据进行排序是MapReduce的核心。
全局排序:一种可能的做法是通过对键进行抽样来得到比较均匀的分区。抽样背后的理念是,通过观察键的一个小子集来估计键的分布,该自己之后可用来构建分区。Hadoop自带一组采样器。
二次排序:一般而言,MapReduce的程序都写为不依赖于值到达reduce函数的顺序。
这里有一个得到有效值排序的方法:1,将键设为综合原始键和值的复合键;键comparator应该以复合键排序,即原本的键和原本的值;partitioner和复合键comparator的分组应只考虑对本来键的分区和分组。
联接:(跳过)