1.4.1 Hadoop 3.0的新特性

Hadoop 3.0中引入了一些重要的功能和优化,包括HDFS可擦除编码、多Namenode支持、MR Native Task优化、YARN基于Cgroup的内存和磁盘IO隔离、YARN container resizing等。Hadoop 3.0在功能和性能方面进行了多项重大改进,主要包括以下几项。

1)精简Hadoop内核,包括剔除过期的API和实现,将默认组件实现替换成最高效的实现。例如,将FileOutputCommitter默认实现换为v2版本,废除hftp而转由webhdfs替代,移除Hadoop子实现序列化库org.apache.hadoop.Records。

2)Shell脚本重写。Hadoop 3.0对Hadoop的管理脚本进行了重构,修复了大量bug,增加了参数冲突检测,支持动态命令等。

3)HDFS支持数据的擦除编码,这使得HDFS在不降低可靠性的前提下,节省一半存储空间。

在Hadoop 3.0之前,HDFS存储方式为每一份数据存储3份,存储利用率仅为1/3。Hadoop 3.0引入纠删码(Erasure Code, EC)技术,实现1份数据+0.5份冗余校验数据存储方式。

纠删码技术是一种数据保护技术,最早用于数据传输中的数据恢复,是一种编码容错技术。它通过在原始数据中加入新的校验数据,使得各个部分的数据产生关联性。在一定范围内的数据出错,通过纠删码技术都可以进行恢复。EC技术可以防止数据丢失,又可以解决HDFS存储空间翻倍的问题。

创建文件时,将从最近的根目录继承EC策略,以确定其块如何存储。与3路复制相比,默认的EC策略可以节省50%的存储空间,同时还可以承受更多的存储故障。

建议将EC技术用于冷数据。冷数据数量大,使用EC技术可以减少副本从而降低存储空间;另外冷数据稳定,一旦需要恢复数据,对业务不会有太大影响。

4)支持多NameNode,即支持一个集群中,一个active和多个standby namenode的部署方式。

5)Tasknative优化。为MapReduce增加了C/C++的map output collector实现(包括Spill、Sort和IFile等),通过作业级别参数调整就可切换到该实现上。

6)MapReduce内存参数自动推断。在Hadoop 2.0中,为MapReduce作业设置内存参数非常烦琐,涉及两个参数:mapreduce.{map,reduce}.memory.mb和mapreduce.{map,reduce}.java.opts,一旦设置不合理,内存资源就浪费严重,例如,将前者设置为4096MB,但后者却是“-Xmx2g”,则剩余2GB实际上无法让java heap使用到。