小文件问题
- 在大数据开发环境中,虽然实际处理的文件大部分都是大文件,但是依然无法避免产生小文件
- 一般而言,如果文件大小≤Block*0.8,那么此时就认为这是一个小文件。实际过程中,一般认为
不超过100M的文件就是小文件 - 小文件在分布式环境下的问题
- 存储:在HDFS中,每一个小文件对应一条元数据,如果存储大量的小文件,那么会产生大量
的元数据,此时会导致占用较多的内存,同时导致元数据的读写效率降低
2. 计算:在MapReduce中,每一个小文件对应一个切片,每一个切片对应一个MapTask。如果
需要对大量的小文件进行处理,那么就意味着需要产生大量的MapTask,导致集群的资源被
同时大量的占用和释放
- 存储:在HDFS中,每一个小文件对应一条元数据,如果存储大量的小文件,那么会产生大量
- 目前对小文件的处理方案无非两种:合并(merge)和打包
- MapReduce提供了一种原生的打包方案: Hadoop Archive ,将多个小文件打成一个 .har 包
# 将/txt/打成txt.har包,放到/result下
hadoop archive -archiveName txt.har -p /txt /result
数据倾斜
- 在集群中,因为处理的数据量不均等导致任务执行时间不一致而产生的等待,称之为数据倾斜
- 数据倾斜可能发生在Map端,也可能会发生在Reduce端
1. Map端产生数据倾斜的直接原因:需要同时处理多个文件,且文件大小不均等,文件不可切
2. Reduce产生数据倾斜的直接原因:对数据进行分类 - 数据倾斜无法避免,因为数据本身就有倾斜特性
- 理论上来说,数据倾斜产生之后可以解决,但是实际过程中,不太好解决;对于Reduce端的数据倾斜,实际过程中,可能会采用二阶段聚合方式来处理
推测执行机制 - 推测执行机制本质是MapReduce针对慢任务的一种优化。当出现慢任务的时候,MapReduce会
将这个任务拷贝一份到其他节点上,两个节点同时执行相同的任务,谁先执行完谁的结果就作为最
终结果,另一个没有执行完的就会被kill掉 - 慢任务的出现场景
1. 任务分配不均匀:每一个节点被分配到的任务数量不同
2. 节点性能不一致:每一台服务器的配置不同
3. 数据倾斜:任务之间处理的数据量不均等 - 实际工作中,因为数据倾斜而导致的慢任务出现的概率更高,此时推测执行机制除了会占用更多的集群资源以外,并不能提高执行效率。因此,实际过程中,一般会考虑关闭推测执行机制
<!-- MapTask的推测执行机制 -->
<property>
<name>mapreduce.map.speculative</name>
<value>true</value>
</property>
<!-- ReduceTask的推测执行机制 -->
<property>
<name>mapreduce.reduce.speculative</name>
<value>true</value>
</property>