Hadoop小文件的优化方案

Hadoop小文件优化

在这里插入图片描述

一、小文件的影响

小文件过多会造成元数据量大的情况,因此NameNode会消耗大量内存空间用于存储小文件的元数据,过多的元数据,也会导致寻址索引速度变慢;

小文件过多,会在进行MapReduce运算时,产生多个切片,启动多个MapTask用于计算,就有可能导致MapTask启动时长比运算时长也长。

二、小文件的解决方法
1)数据采集时,进行文件的合并

使用 Hadoop Archive(能高效将小文件放入HDFS的文件存档工具) 将多个小文件打包为一个HAR文件,减少NameNode的内存使用。

2)在HDFS上,使用MapReduce对小文件进行合并
3)采用CombinTextInputFormat处理小文件

CombinTextInputFormat可以将小文件从逻辑上规划到一个切片中。
在这里插入图片描述
在生成切片时,过程中包括虚拟过程以及切片过程;

虚拟过程:

在文件输入过程中,依次与 setMaxInputSplitSize 的值进行比较,如果文件不大于设置的setMaxInputSplitSize 最大值,会将本文件划分为一个单独的虚拟文件存储块;

如果文件的大于最大值切小于最大值的2倍,会将文件分成两个虚拟存储块,切分后的两个文件的存储大小一致;

如果文件的大于最大值的2倍,会先按最大值切分一个数据块,然后将剩余的文件对半切分;

例如,setMaxInputSplitSize 的值为128M,文件大小为150M,会将文件切分为两个75M虚拟存储文件;如果按128M和22M的大小进行切分,会导致22M的小虚拟存储文件。

切片过程:

在切片过程中会判断虚拟文件的大小是否大于setMaxInputSplitSize 的值,大于则形成一个单独的切片;小于就会与下一个切片进行合并,共同形成一个切片。

4)开启uber模式,实现jvm重用

通常情况下,每个Task任务需要启动一个JVM虚拟环境来运行,如果Task任务计算的数据很小时,我们可以让多个Task任务运行在同一个JVM中。

具体配置,开启uber模式,在 mapred-site.xml 中添加如下配置:

<!--  开启uber模式 -->
<property>
	<name>mapreduce.job.ubertask.enable</name>
	<value>true</value>
</property>

<!-- uber模式中最大的mapTask数量,可向下修改  --> 
<property>
	<name>mapreduce.job.ubertask.maxmaps</name>
	<value>9</value>
</property>

<!-- uber模式中最大的reduce数量,可向下修改 -->
<property>
	<name>mapreduce.job.ubertask.maxreduces</name>
	<value>1</value>
</property>

<!-- uber模式中最大的输入数据量,默认使用dfs.blocksize 的值,可向下修改 -->
<property>
	<name>mapreduce.job.ubertask.maxbytes</name>
	<value></value>
</property>

<!--可以同时运行多少个job(计算)-->
<property>
    <name>mapreduce.job.jvm.numtasks</name>
    <value>10</value>
</property>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值