巴拉巴

 找回密码
 立即注册

站内搜索

搜索
热搜: 活动 交友 discuz
查看: 48|回复: 0

Hadoop常见业务问题的处理方式

[复制链接]

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2023-1-24 04:49:35 | 显示全部楼层 |阅读模式
HDFS小文件过多问题

大量小文件可能造成的影响:


  • NameNode的内存维护大量元数据,占用NameNode中的内存空间。
  • 每个文件都会启动一个MapTask,1个MapTask默认内存1G,造成资源浪费且效率非常低。
解决方式:

  • 采用har归档方式
HAR为构建在其它文件系统上用于文件存档的文件系统,为了减少namenode内存的使用,可以将hdfs中的多个文件打包成一个存档文件。直接使用hadoop archive命令创建HAR文件(创建HAR的过程是在运行一个mr作业)。
备注:har在对小文件进行存档后,原文件不会被删除,且创建之后不能改变,文件名中也不能有空格存在,否则会报异常。

  • CombineTextInputFormat(逻辑分片)
用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个 MapTask 处理。

  • 开启JVM重用
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

  • 增加Reducer
可以增加Reduce的数量:JobConf.setNumReduceTasks(int)

  • 自定义分区
根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer。

  • 两次mapReduce的设计思路
(1)在map阶段对那些导致了数据倾斜的key 加上随机前缀,这样本来相同的key 也会被分到多个Reducer中进行局部聚合,数量就会大大降低。
(2)第二次mapreduce,去掉key的随机前缀,进行全局聚合。。
备注:这种设计进行两次mapreduce,处理流程增加且增加了耗时,并浪费了资源。

来源:http://www.yidianzixun.com/article/0lp8SJwv
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 返回顶部