hadoop 学习笔记——HADOOP I/O[压缩,序列化]

//HDFS数据完整性
线管中最后一个datanode 负责检验校验和
客户端从datanode读取数据时也会校验
每个datanode也会在后台线程定期运行一个DataBlockScanner用来校验

//压缩
hadoop FileDecompressor file.gz
FileDecompressor能通过文件的拓展名调用不同的压缩codec【gz,bz2,lzo,deflate】
将名为file.gz的文件压缩为file的文件 (我测试之后压缩之后的文件比原来的更大,奇怪…)
使用原生类库压缩和解压缩速度比较快
压缩格式 JAVA实现 原生实现
DEFLATE 是 是
gzip 是 是
bzip 是 否
LZO 否 是 压缩速度最快,压缩效果最低
CodecPool
如果使用的是原生代码库并且需要在应用中执行大量压缩和解压缩,可以考虑使用CodecPool
//切片
如果将flie.gz(文件大小1G) 作为MapReduce输入,HDFS默认块是64M,那么MapReduce会将创建16个数据库,其中每个数据块作为一个map任务的输入,增加16倍效率
压缩格式 是否支持切分
DEFLATE 否
Gzio 否
bzip2 是
LZO 否
应该使用哪种压缩格式(按应该看关注运行速度,还是存储开销)
对于巨大的,闻言储存编辑的文件,如日志文件可以考虑:
1 直接存储未经压缩的文件
2 使用支持切分的压缩格式,如bzip2
3 在应该中按大小切分日志文件,并确保压缩后的文件更加接近64M
4 使用顺序文件(Sequence File),它支持压缩和切分【暂时不懂】
5 使用Avro数据文件,该文件支持压缩和切分,就行顺序文件一样,单增加了许多编程语言支持。
//在MapReduce在使用压缩
如果输入的文件是已经压缩过的文件
MapReduce会在读取文件时自动解压缩文件
如果想要MapReduce作业输出时进行压缩操作,应该再java里面做如下设置
mapred.output.compress 为 true
mapred.output.compression.codec 设置对应的压缩codec的类名
例子在 P84
mapred.output.compression.type设置对应的压缩格式
默认是RECORD(针对每条记录压缩)
BLOCK(SequenceFile格式) 针对多条记录压缩【究竟是几条?】
//对map任务输出进行压缩
为了减低map输出到redcue直接的流量,可以开启map输出压缩功能
conf.setCompressMapOutput(true);
conf.setMapOutputCompressorClass(GzipCodec.class)
例子在 P86
//序列化
序列化的意思是将某种数据【数组,字符串,视频,声音文件等等吧】序列化成二进制流后发生到远程节点,远程节点将接收到的二进制流反序列化为原始消息
这种原理有一个叫”远程过程调用”(remote procedure call.RPC)的进程实现的
//Writable接口
Hadoop是用来序列化的接口,它只能用JAVA使用,不方便拓展
RawComperator 接口允许其实现直接比较数据流中得记录
String 类型和 Text 类型 有点不同【但是看不懂……】
BytesWritable 数组的序列化
NullWrite 字符串的序列化空字符串
ObjectWritable 对多种类型一次进行序列化

发表评论