Hadoop实战-初级部分 之 Hadoop IO(一)

2014-11-24 03:26:57 · 作者: · 浏览: 0
私塾在线《深入浅出学 Hadoop- 初级 部分》 ―― 系列精品教程 视频课程地址》》》 http://sishuok.com/product/481 整体课程概览 第一部分:开始云计算之旅 第二部分:初识Hadoop 第三部分:Hadoop 环境安装部署 第四部分:Hadoop Shell 基本操作介绍 第五部分:Hadoop 分布式文件系统1 第五部分:Hadoop 分布式文件系统2 第五部分:Hadoop 分布式文件系统3 第六部分:MapReduce 开发1 第六部分:MapReduce 开发2 第七部分:Hadoop集群的安装 第一部分:数据完整性 数据完整性及其采用的技术 保证数据在传输过程中不损坏 ,常见的保证数据完整性采用的技术 A.奇偶校验技术 B.ECC校验纠错技术 C.CRC-32循环冗余校验技术 HDFS以透明方式校验所有写入它的数据,并在默认设置下,会在读取数据时验证校验和。针对数据的每个io.bytes.per.checksum(默认512字节)字节,都会创建一个单独的校验和。 数据节点负责在存储数据及其校验和之前验证它们收到的数据。 从客户端和其它数据节点复制过来的数据。客户端写入数据并且将它发送到一个数据节点管线中,在管线的最后一个数据节点验证校验和。 客户端读取数据节点上的数据时,会验证校验和,将其与数据节点上存储的校验和进行对比。每个数据节点维护一个连续的校验和验证日志,因此它知道每个数据块最后验证的时间。每个数据节点还会在后台线程运行一个DataBlockScanner(数据块检测程序),定期验证存储在数据节点上的所有块,为了防止物理存储介质中位衰减锁造成的数据损坏。 HDFS通过复制完整的副本来产生一个新的,无错的副本来“治愈”哪些出错的数据块。工作方式:如果客户端读取数据块时检测到错误,抛出Checksum Exception前报告该坏块以及它试图从名称节点中药读取的数据节点。名称节点将这个块标记为损坏的,不会直接复制给客户端或复制该副本到另一个数据 节点。它会从其他副本复制一个新的副本。 本地文件系统 Hadoop的本地文件系统执行客户端校验。意味着,在写一个名filename的文件时,文件系统的客户端以透明的方式创建一个隐藏.filename.crc。在同一个文件夹下,包含每个文件块的校验和。 数据块大小由io.bytes.per.checksum属性控制,块的大小作为元数据存储在.crc文件中。也可能禁用校验和:底层文件系统原生支持校验和。这里通过 RawLocalFileSystem来替代LocalFileSystem完成。要在一个应用中全局使用,只需要设置fs.file.impl值为 org.apache.hadoop.fs.RawLocalFileSystem来重新map执行文件的URL。或者只想对某些读取禁用校验和校验。例子: Configuration conf = ... FileSystem fs = new RawLocalFileSystem(); fs.initialize(null, conf); ChecksumFileSystem LocalFileSystem使用ChecksumFileSystem(校验和文件系统)为自己工作,这个类可以很容易添加校验和功能到其他文件系统中。因为ChecksumFileSystem也包含于文件系统中。 第二部分:压缩 编码/解码器:用以执行压缩解压算法。 DEFLATE org.apache.hadoop.io.compress.DefaultCodec gzip org.apache.hadoop.io.compress.GzipCodec bzip2 org.apache.hadoop.io.compress.Bzip2Codec LZO com.hadoop.compression.lzo.LzopCodec CompressionCodec 对流进行进行压缩与解压缩 CompressionCodecFactory 方法来推断CompressionCodec Hadoop支持的压缩形式
压缩格式 工具 算法 文件扩展名 多文件 可分割性
DEFLATE DEFLATE .deflate
gzip gzip DEFLATE
.gz
bzip2 bzip2 bzip2 .bz2
LZO lzop LZO .lzo
属性名: io.compression.codecs 默认值: org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.ompress.Bzip2Codec 本地库
压缩格式 Java 实现 本地实现
DEFLATE
Gzip
Bzip2
LZO
压缩与输入分割 前提: 在考虑如何压缩那些将由MapReduce处理的数据时,考虑压缩格式是否支持分割是很重要的。 案例 假设,一个文件时一个gzip格式的压缩文件,压缩后的大小为1GB。HDFS将其分为16块。然而针对每一块在进行分块是不可以的,因为gzip合适的文件不支持分割(分块)机制,所以读取他的MapReduce不分割文件,造成了只有Map读取16块文件的情况。导致运行时间变长。 应该选择哪种压缩形式 总体原则,还要经过测试,才可以决定。 经验:大文件选择支持分割的压缩形式 在 MR 中使用压缩 前提: 如果文件是压缩过的,那么在被MapReduce读取时,它们会被解压,根据文件的扩展名来选择应该使用拿一种压缩解码器。 使用: 压缩MapReduce的作业输出,在作业配置中将 mapred.output.compress属性设置为true,将mapred.output.compression.codec属性设置为自己需要使用的压缩解码/编码器的类名。 通过gunzip c file来查看结果。 代码示例 conf.setBoolean(“mapred.output.compress’,true) Conf.setClass(“mapred.output.compression.codec”,GizpCodec.class, CompressionCodec.class); Map作业输出结果的压缩 使用原因 因为Map作业的中间结果会输出到本地,并在网络上传递。所以压缩能获得更好性能,因为传播的数据减少了。 Map输出压缩属性 mapred.compress.map.output mapred.map.output compression.codec 代码示例 conf.setCompressMapOutput conf.setMapOutputCompressorClass(GzipCodec.classs) 第三部分:序列化 什么是Hadoop的序列化 序列化(serialization) 序列化指的是将结构化对象转为字节流以便于通过网络进行传输或写入持久存储的过程。反序列化指的是将字节流转为一系列结构化对象的过程。 序列化用于:进程间通信与持久存储。 RPC序列化建议的特性 1.紧凑(Compact)即方