|
HDFS小文件过多问题
大量小文件可能造成的影响:
- NameNode的内存维护大量元数据,占用NameNode中的内存空间。
- 每个文件都会启动一个MapTask,1个MapTask默认内存1G,造成资源浪费且效率非常低。
解决方式:
HAR为构建在其它文件系统上用于文件存档的文件系统,为了减少namenode内存的使用,可以将hdfs中的多个文件打包成一个存档文件。直接使用hadoop archive命令创建HAR文件(创建HAR的过程是在运行一个mr作业)。
备注:har在对小文件进行存档后,原文件不会被删除,且创建之后不能改变,文件名中也不能有空格存在,否则会报异常。
- CombineTextInputFormat(逻辑分片)
用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个 MapTask 处理。
JVM重用是Hadoop调优参数的内容,通常用来应对小文件的场景或task特别多的场景(通常任务的执行时间很短)。
Hadoop的默认通常是使用派生JVM来执行map和Reduce任务的。但是JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。
而JVM重用可以使得JVM实例在同一个job中重新使用N次,N的值可以在Hadoop的mapred-site.xml文件中进行配置mapreduce.job.jvm.numtasks。该值通常在10-20之间,具体数值需要根据具体业务场景测试得出。
mapreduce.job.jvm.numtasks
10
How many tasks to run per jvm,if set to -1 ,there is no limit
注意:
开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到所有任务完成后才能释放。此时如果某个Reduce task消耗实践比较久,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。
数据倾斜问题
- 提前在map端进行combine,减少传输的数据量
在Mapper加上combiner相当于提前进行reduce,即把一个Mapper中的相同key进行了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量。
导致数据倾斜的key,大量分布在不同的mapper
可以增加Reduce的数量:JobConf.setNumReduceTasks(int)
根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer。
(1)在map阶段对那些导致了数据倾斜的key 加上随机前缀,这样本来相同的key 也会被分到多个Reducer中进行局部聚合,数量就会大大降低。
(2)第二次mapreduce,去掉key的随机前缀,进行全局聚合。。
备注:这种设计进行两次mapreduce,处理流程增加且增加了耗时,并浪费了资源。
来源:http://www.yidianzixun.com/article/0lp8SJwv
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|