1)校验和
每个文件均按照块方式存储,每个块的元数据存储在namenode的内存中,因此Hadoop存储小文件会非常低效,小文件会消耗namenode中大部分内存
checksum:HDFS会对写入的数据计算校验和,并在读取数据时验证校验和。datanode在验证收到的数据后存储数据和校验和。客户端从datanode读取数据时也会验证校验和。
2) 压缩
在考虑如何压缩将由MapReduce 处理的数据时,需要理解这些压缩格式是否支持切分。由于gzip的压缩是存储在一系列连续的压缩块中,所以不能将gzip压缩的文件切分在不同的机器上执行map。所以mapreduce不会去切分gzip压缩的文件,而是在一台机器上运行。而有些压缩方式,如LZO是支持切分的。
MapReduce读写的是未经压缩的数据(K1,V1,K3,V3),但是可以对map阶段的中间输入进行压缩(K2,V2);由于map任务的输出需要写到磁盘并通过网络传输到reducer节点,通过压缩后的传输,会提高性能。
3) 序列化
序列化是指将结构化对象转化为字节流,以便在网络上传输或写到磁盘进行永久储存;反序列化是将字节流转回结构化对象的逆过程;
序列化在分布式数据处理的两大领域经常出现: 进程间通信和永久存储
在hadoop中,系统中多个节点上进程间的通信是通过RPC实现的,RPC协议将消息序列化成二进制流后发送到远程节点,远程节点将二进制流反序列化为原始消息。
a. writable 接口
定义了两个方法,一个是将其状态写到DataOutput二进制流,另一个从DataInput二进制流读取其状态
hadoop中主要已经可以直接使用的writable类
NullWritable是一种特殊类型,它的序列化长度为0, 并不会从数据流中读取数据,也不写入数据。它充当占位符,当MapReduce中,如果不需要键或值,就可以将键或值声明为NullWritable,结果存储常量空值。
通过RawComparator 实现直接比较字节,来确定变量大小,而不需要进行反序列化再比较的过程