目录

  • 一、Hadoop优化
  • 1)HDFS小文件影响
  • 2)数据输入小文件处理:
  • (1)Hadoop Archive(Har归档)
  • (2)Sequence File
  • (3)CombineFileInputFormat
  • (4)开启JVM重用
  • 3)Map阶段
  • 4)Reduce阶段
  • 5)IO传输
  • 6)整体
  • 二、切片机制
  • 三、项目经验
  • 1)LZO压缩
  • 2)LZO创建索引
  • 3)基准测试
  • a、 测试HDFS写性能
  • b、测试HDFS读性能
  • c 、删除测试生成数据
  • 4)HDFS参数调优hdfs-site.xml
  • 5)情景描述:总共7台机器,每天几亿条数据,数据源->Flume->Kafka->HDFS->Hive
  • 6)Hadoop宕机
  • MR造成系统宕机
  • NameNode宕机
  • 7)集群资源分配参数(项目中遇到的问题)



一、Hadoop优化



MapReduce优化方法主要从六个方面考虑:数据输入Map阶段Reduce阶段IO传输数据倾斜问题常用的调优参数

1)HDFS小文件影响

(1)影响NameNode的寿命:因为文件元数据存储在NameNode的内存中
(2)影响计算引擎的任务数量:比如每个小的文件都会生成一个Map任务

2)数据输入小文件处理:

(1)Hadoop Archive(Har归档)

Hadoop Archive是一个高效地能将小文件放入HDFS块中的文件存档工具。
它能够将多个小文件打包成一个HAR文件,这样就减少了NameNode的内存使用。

(2)Sequence File

Sequence File由一系列的二进制key/value组成,如果key为文件名,value为文件内容,则可以将大批小文件合并成一个大文件。

(3)CombineFileInputFormat

采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景。

(4)开启JVM重用

对于大量小文件Job,可以开启JVM重用会减少45%运行时间。

具体设置:mapreduce.job.jvm.numtasks值在10-20之间。

3)Map阶段

(1)增大环形缓冲区大小。由100m扩大到200m。(参数为:mapreduce.task.io.sort.mb)
(2)增大环形缓冲区溢写的比例。由80%扩大到90%。(参数为:mapreduce.map.sort.spill.percent)
(3)减少对溢写文件的merge次数。(10个文件,一次20个merge)
(4)不影响实际业务的前提下,采用Combiner提前合并,减少 I/O。

4)Reduce阶段

(1)合理设置Map和Reduce数:两个都不能设置太少,也不能设置太多。
太少:会导致Task等待,延长处理时间;
太多:会导致 Map、Reduce任务间竞争资源,造成处理超时等错误。
(2)设置Map、Reduce共存:调整slowstart.completedmaps参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间。
(3)规避使用Reduce。
因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。
(4)增加每个Reduce去Map中拿数据的并行数。
(5)集群性能可以的前提下,增大Reduce端存储数据内存的大小。

5)IO传输

(1)采用数据压缩的方式,减少网络IO的的时间。安装SnappyLzop压缩编码器。
(2)使用SequenceFile二进制文件

6)整体

(1) mapreduce.map.memory.mb: 一个MapTask可使用的资源上限(单位:MB),默认为1024。如果MapTask实际使用的资源量超过该值,则会被强制杀死。
调优:可以增加MapTask内存大小为4-5G。

(2)mapreduce.reduce.memory.mb: 一个ReduceTask可使用的资源上限(单位:MB),默认为1024。如果ReduceTask实际使用的资源量超过该值,则会被强制杀死。
调优:可以增加ReduceTask内存大小为4-5G。

(3) mapreduce.map.cpu.vcores: 每个MapTask可使用的最多cpu core数目, 默认值: 1
mapreduce.reduce.cpu.vcores: 每个ReduceTask可使用的最多cpu core数目, 默认值: 1
调优:可以增加MapTask的cpu核数,增加ReduceTask的CPU核数。

(4)增加每个Container的CPU核数和内存大小。
配置文件:yarn-site.xml
yarn.scheduler.minimum-allocation-mb: 每个container最小的内存,单个任务申请的物理内存量至少是: 512(MB)

yarn.scheduler.maximum-allocation-mb: 每个container最大的内存 ,单个任务可申请的最多物理内存量:8192(MB)

yarn.scheduler.minimum-allocation-vcores: 每个container给定的最小的CPU核数,1

yarn.scheduler.maximum-allocation-vcores: 每个container给定的最大的CPU核数,32

yarn.nodemanager.resource.memory-mb: 每个nodemanager分配的最大内存是多少,8192

(5)mapreduce.map.maxattempts: 每个MapTask最大重试次数,一旦重试参数超过该值,则认为MapTask运行失败,默认值:4。
mapreduce.reduce.maxattempts: 每个ReduceTask最大重试次数,一旦重试参数超过该值,则认为MapTask运行失败,默认值:4。
调优:调整每个Map Task和Reduce Task最大重试次数。

(6)在hdfs-site.xml文件中配置多目录,最好提前配置好,否则更改目录需要重新启动集群,注意新挂载磁盘的访问权限问题。

<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///${hadoop.tmp.dir}/dfs/data1,
           file:///light2/dfs/data2,
           file:///light3/dfs/data3,
           file:///light4/dfs/data4
     </value>
</property>

增加磁盘后,为保证每个目录数据均衡,需开启数据均衡命令:

bin/start-balancer.sh –threshold 10

参数10:代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。

二、切片机制

1)简单地按照文件的内容长度进行切片
2)切片大小,默认等于Block大小。
3)切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
提示:切片大小公式:max(0,min(Long_max,blockSize))

三、项目经验

1)LZO压缩

Hadoop默认不支持LZO压缩,如果需要支持LZO压缩,需要添加jar包,并在hadoop的cores-site.xml文件中添加相关压缩配置。LZO支持切片机制。

<configuration>
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec
</value>
</property>

<property>
    <name>io.compression.codec.lzo.class</name>
    <value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
</configuration>

2)LZO创建索引

创建LZO文件的索引,LZO压缩文件的可切片特性依赖于其索引,故我们需要手动为LZO压缩文件创建索引。若无索引,则LZO文件的切片只有一个。

3)基准测试

在企业开发基准测试非常重要。
项目经理ruo问:输入端有1T的数据,问多长时间能把数据上传到集群,假如说1个小时。100T?

a、 测试HDFS写性能

测试内容:向HDFS集群写10个128M的文件

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB

b、测试HDFS读性能

测试内容:读取HDFS集群10个128M的文件

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB

c 、删除测试生成数据

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -clean

4)HDFS参数调优hdfs-site.xml

dfs.namenode.handler.count=20 * log2(Cluster Size),比如集群规模为8台时,此参数设置为60.
解释:NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。对于大集群或者有大量客户端的集群来说,通常需要增大参数。
dfs.namenode.handler.count的默认值10。设置该值的一般原则是将其设置为集群大小的自然对数乘以20,即20logN,N为集群大小。

5)情景描述:总共7台机器,每天几亿条数据,数据源->Flume->Kafka->HDFS->Hive

面临问题:数据统计主要用HiveSQL,没有数据倾斜,小文件已经做了合并处理,开启的JVM重用,而且IO没有阻塞,内存用了不到50%。但是还是跑的非常慢,而且数据量洪峰过来时,整个集群都会宕掉。基于这种情况有没有优化方案。
解决办法:内存利用率不够。这个一般是Yarn的2个配置造成的,单个任务可以申请的最大内存大小,和Hadoop单个节点可用内存大小。调节这两个参数能提高系统内存的利用率。
(a)yarn.nodemanager.resource.memory-mb:表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。
(b)yarn.scheduler.maximum-allocation-mb:单个任务可申请的最多物理内存量,默认是8192(MB)。

6)Hadoop宕机

MR造成系统宕机

出现这种情况要控制Yarn同时运行的任务数,和每个任务申请的最大内存
调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)

NameNode宕机

出现这种情况很可能是写入文件过量造成的。
可调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。高峰期的时候用Kafka进行缓存,高峰期过去数据同步会自动跟上。

7)集群资源分配参数(项目中遇到的问题)

集群有30台机器,跑MR任务的时候发现5个map任务全都分配到了同一台机器上,这个可能是由于什么原因导致的吗?
解决方案:yarn.scheduler.fair.assignmultiple 这个参数 默认是开的,需要关掉。