Hadoop企业优化
MapReduce跑得慢的原因
MapReduce优化的方法
MapReduce 优化方法主要从六个方面考虑:数据输入、Map 阶段、Reduce 阶段、IO 传输、数据倾斜问题和常用的调优参数。
数据输入
CombineTextInputFormat 用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个 MapTask 处理。因此CombineTextInputFormat切片可用于小文件处理。
Map阶段
io.sort.mb:环形缓冲区区的大小,默认100M
sort.spill.percent:缓存到达百分之多少的时候,进行溢写操作,默认80%
io.sort.factor:每次merge的文件数,默认为10个
Combiner适用于汇总,不适用于平均。
Reduce阶段
影响map个数的因素是切片的个数;Reduce的直接配置(最好与分区数相同),默认是1个。
mapreduce.job.reduce.slowstart.completedmaps:当MapTask完成的比例达到该值后才会为ReduceTask申请资源,默认是0.05,即有100个MapTask,当有5个以上MapTask完成之后,就会为ReduceTask申请资源使其提前开始工作。
mapred.job.reduce.input.buffer.percent:在reduce过程中,在内存中保存map输出的空间占整个堆空间的比例;默认是0.0。reduce阶段开始时,内存中的map输出大小不能大于该值。默认情况下,在reduce任务开始之前,所有的map输出都合并到磁盘上,以便为reducer提供尽可能多的内存。然而,如果reducer需要的内存较少,则可以增加此值来最小化访问磁盘的次数,以提高reduce性能。
I/O传输
使用Snappy和LZO进行压缩是大数据优化常用的手段。
数据倾斜问题
常用参数的调优
资源相关的参数
以下参数是在用户自己的 MR 应用程序中配置就可以生效(mapred-default.xml)
配置参数 | 参数说明 |
---|---|
mapreduce.map.memory.mb | 一个MapTask可使用的资源上限(单位:MB),默认为1024。如果 MapTask 实际使用的资源量超过该值,则会被强制杀死。根据实际物理机内存进行配置,越大越好 |
mapreduce.reduce.memory.mb | 一个ReduceTask可使用的资源上限(单位:MB),默认为1024。如果 ReduceTask实际使用的资源量超过该值,则会被强制杀死。根据实际物理机内存进行配置,越大越好 |
mapreduce.map.cpu.vcores | 每个MapTask可使用的最多cpu core数目,默认值: 1 |
mapreduce.reduce.cpu.vcores | 每个ReduceTask可使用的最多cpu core数目,默认值: 1 |
mapreduce.reduce.shuffle.parallelcopies | 每个Reduce去Map中取数据的并行数。默认值是5 |
mapreduce.reduce.shuffle.merge.percent | Buffer中的数据达到多少比例开始写入磁盘。默认值0.66 |
mapreduce.reduce.shuffle.input.buffer.perce | Buffer大小占Reduce可用内存的比例。默认值0.7 |
mapreduce.reduce.input.buffer.percent | 指定多少比例的内存用来存放 Buffer 中的数据,默认值是0.0 |
应该在 YARN 启动之前就配置在服务器的配置文件中才能生效(yarn-default.xml)
配置参数 | 参数说明 |
---|---|
yarn.scheduler.minimum-allocation-mb | 给应用程序Container分配的最小内存,默认值:1024 |
yarn.scheduler.maximum-allocation-mb | 给应用程序Container分配的最大内存,默认值:8192 |
yarn.scheduler.minimum-allocation-vcores | 每个Container申请的最小 CPU 核数,默认值:1 |
yarn.scheduler.maximum-allocation-vcores | 每个Container申请的最大 CPU 核数,默认值:32 |
yarn.nodemanager.resource.memory-mb | 给Containers分配的最大物理内存,默认值:8192 |
Shuffle 性能优化的关键参数,应在 YARN 启动之前就配置好(mapred-default.xml)
配置参数 | 参数说明 |
---|---|
mapreduce.task.io.sort.mb | Shuffle 的环形缓冲区大小,默认 100M |
mapreduce.map.sort.spill.percent | 环形缓冲区溢出的阈值,默认 80% |
容错相关参数(MapReduce性能优化)
配置参数 | 参数说明 |
---|---|
mapreduce.map.maxattempts | 每 MapTask最大重试次数,一旦重试参数超过该值,则认为 MapTask运行失败,默认值:4。 |
mapreduce.reduce.maxattempts | 每 ReduceTask最大重试次数,一旦重试参数超过该值,则认为 ReduceTask运行失败,默认值:4。 |
mapreduce.task.timeout | Task 超时时间,经常需要设置的一个参数,该参数表达的意思为: 如果一个 Task 在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该 Task 处于 Block 状态,可能是卡住了,也许永远会卡住,为了防止因为用户程序永远 Block 住不退出,则强制设置了一个该超时时间(单位毫秒),默认是600000。 如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大,该参数过小常出现的错误提示是“ AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by theApplicationMaster.”。 |
HDFS小文件优化方法
小文件弊端
HDFS 上每个文件都要在 NameNode 上建立一个索引,这个索引的大小约为 150byte,这样当小文件比较多的时候,就会产生很多的索引文件,**一方面会大量占用 NameNode 的内存空间,另一方面就是索引文件过大使得索引速度变慢。**NN的运行速度直接决定了整个集群的运行速度。
小文件解决方案
小文件的优化无非以下几种方式:
1、在数据采集的时候,就将小文件或小批数据合成大文件再上传 HDFS,SequenceFile。
2、在业务处理之前,在 HDFS 上使用 MapReduce 程序对小文件进行合并,Har包、SequenceFile。
3、在 MapReduce 处理时,可采用 CombineTextInputFormat 提高效率。
mapreduce.job.jvm.numtasks,一个jvm可连续启动多个同类型任务,默认值1,若为-1表示不受限制