大数据组件性能调优文档整理(集群、HDFS、Hive)

 

12.1 配置原则

如何发挥集群最佳性能

原则1:CPU核数分配原则
数据节点:建议预留2~4个核给OS和其他进程(数据库,HBase等)外,其他的核分配给YARN。
控制节点:由于运行的进程较多,建议预留6~8个核。
原则2:内存分配
除了分配给OS、其他服务的内存外,剩余的资源应尽量分配给YARN。
原则3:虚拟CPU个数分配
节点上YARN可使用的虚拟CPU个数建议配置为逻辑核数的1.5~2倍之间。如果上层计算应用对CPU的计算能力要求不高,可以配置为2倍的逻辑CPU。
原则4:提高磁盘IO吞吐率
尽可能挂载较多的盘,以提高磁盘IO吞吐率。

影响性能的因素

因素1:文件服务器磁盘I/O
一般磁盘顺序读写的速度为百兆级别,如第二代SATA盘顺序读的理论速度为300Mbps,只从一个盘里读,若想达到1Gbps每秒的导入速度是不可能的。并且若从一个磁盘读,单纯依靠增加map数来提高导入速率也不一定可以。因为随着map数变多,对于一个磁盘里的文件读,相当由顺序读变成了随机读,map数越多,磁盘读取文件的随机性越强,读取性能反而越差。如随机读最差可变成800Kbps。 因此需要想办法增大文件服务器的磁盘IO读效率,可以使用专业的文件服务器,如NAS系统,或者使用更简单的方法,把多个磁盘进行Raid0或者Raid5。
因素2:文件服务器网络带宽
单个文件服务器的网络带宽越大越好,建议在10000Mb/s以上。
因素3:集群节点硬件配置
集群节点硬件配置越高,如CPU核数和内存都很多,可以增大同时运行的map或reduce个数,如果单个节点硬件配置难以提升,可以增加集群节点数。
因素4:SFTP参数配置
不使用压缩、加密算法优先选择aes128-cbc,完整性校验算法优先选择umac-64@openssh.com
因素5:集群参数配置
因素6:Linux文件预读值
设置磁盘文件预读值大小为16384,使用linux命令:
echo 16384 > /sys/block/sda/queue/read_ahead_kb
 
说明:
sda表示当前磁盘的磁盘名。

  

12.2 Manager

12.2.1 提升Manager配置服务参数的效率

操作场景
在安装集群或者扩容节点以后,集群中可能添加了较多数量的节点。此时如果系统管理员在CDH Manager上修改服务参数、保存新配置并重启服务时,Manager的Controller进程可能占用大量内存,增加了CPU工作负荷,用户需要等待一段时间才能完成参数修改。系统管理员可以根据实际业务使用情况,手动增加Controller的JVM启动参数中内存参数,提升配置服务参数的效率。
对系统的影响
该操作需要在主管理节点重新启动Controller,重启期间会造成CDH Manager暂时中断。备管理节点Controller无需重启。
前提条件
已确认主备管理节点IP。
操作步骤
1. 使用PuTTY,以omm用户登录主管理节点。
2. 执行以下命令,切换目录。
cd ${BIGDATA_HOME}/om-server/om/sbin
3. 执行以下命令修改Controller启动参数文件“controller.sh”,并保存退出。
vi controller.sh
修改配置项“JAVA_HEAP_MAX”的参数值。例如,集群中包含了400个以上的节点,建议修改如下,表示Controller最大可使用8GB内存:
JAVA_HEAP_MAX=-Xmx8192m
4. 执行以下命令,重新启动Controller。
sh ${BIGDATA_HOME}/om-server/om/sbin/restart-controller.sh
提示以下信息表示命令执行成功:
End into start-controller.sh
执行sh ${BIGDATA_HOME}/om-server/om/sbin/status-oms.sh,查看Controller的“ResHAStatus”是否为“Normal”,并可以重新登录CDH
Manager表示重启成功。
5. 使用PuTTY,以omm用户登录备管理节点,并重复步骤 2~步骤 3。

12.2.2 根据集群节点数优化Manager配置

操作场景
CDH集群规模不同时,Manager相关参数差异较大。在集群容量调整前或者安装集群时,用户可以手动指定Manager集群节点数,系统将自动调整相关进程参
数。
说明:
在安装集群时,可以通过Manager安装配置文件中的“cluster_nodes_scale”参数指定集群节点数。

  

操作步骤
1. 使用PuTTY,以omm用户登录主管理节点。
2. 执行以下命令,切换目录。
cd ${BIGDATA_HOME}/om-server/om/sbin
3. 执行以下命令查看当前集群Manager相关配置。
sh oms_confifig_info.sh -q
4. 执行以下命令指定当前集群的节点数。
命令格式:sh oms_confifig_info.sh -s 节点数
例如:
sh oms_confifig_info.sh -s 10
根据界面提示,输入“y”:
The following confifigurations will be modifified:
Module Parameter Current Target
Controller controller.Xmx 4096m => 8192m
Controller controller.Xms 1024m => 2048m
...
Do you really want to do this operation? (y/n):
界面提示以下信息表示配置更新成功:
...
Operation has been completed. Now restarting OMS server. [done]
Restarted oms server successfully.
说明:
配置更新过程中,OMS会自动重启。
相近数量的节点规模对应的Manager相关配置是通用的,例如100节点变为101节点,并没有新的配置项需要刷新。

  

12.3 HBase

12.3.1 提升BulkLoad效率

操作场景
批量加载功能采用了MapReduce jobs直接生成符合HBase内部数据格式的文件,然后把生成的StoreFiles文件加载到正在运行的集群。使用批量加载相比直接使用
HBase的API会节约更多的CPU和网络资源。
ImportTSV是一个HBase的表数据加载工具。
前提条件
在执行批量加载时需要通过“Dimporttsv.bulk.output”参数指定文件的输出路径。
操作步骤
参数入口:执行批量加载任务时,在BulkLoad命令行中加入如下参数。
表12­1 增强BulkLoad效率的配置项

参数

描述

配置的值

-

Dimporttsv.mapper.class

用户自定义mapper通过把键值对的构造从mapper移动到reducer以帮助提高性能。mapper只需要把每一行的原始文本发送给reducer, reducer解析每一行的每一条记录并创建键值对。

org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper  和org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper

 

说明:

 

 

当该值配置

 

 

为“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”时,只在执行没有HBASE_CELL_VISIBILITY OR HBASE_CELL_TTL选项的批

量加载命令时使用。使

 

 

用“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”时可以得到更好的性能。

 

12.3.2 提升连续put场景性能

操作场景
对大批量、连续put的场景,配置下面的两个参数为“false”时能大量提升性能。
“hbase.regionserver.wal.durable.sync”
“hbase.regionserver.hfifile.durable.sync”
当提升性能时,缺点是对于DataNode(默认是3个)同时故障时,存在小概率数据丢失的现象。对数据可靠性要求高的场景请慎重配置。
操作步骤
 

参数

描述

默认值

hbase.regionserver.wal.durable.sync

每一条wal是否持久化到硬盘。

true

hbase.regionserver.hfile.durable.sync

hfile写是否立即持久化到硬盘。

true

12.3.3 Put和Scan性能综合调优

操作场景
HBase有很多与读写性能相关的配置参数。读写请求负载不同的情况下,配置参数需要进行相应的调整,本章节旨在指导用户通过修改RegionServer配置参数进行读写
性能调优。
操作步骤
JVM GC参数
RegionServer GC_OPTS参数设置建议:
-Xms与-Xmx设置相同的值,需要根据实际情况设置,增大内存可以提高读写性能,可以参考参数“hfifile.block.cache.size”(见表12-4)和参数“hbase.regionserver.global.memstore.size”(见表12-3)的介绍进行设置。
-XX:NewSize与-XX:MaxNewSize设置相同值,建议低负载场景下设置为“512M”,高负载场景下设置为“2048M”。
-XX:CMSInitiatingOccupancyFraction建议设置为“100 * (hfifile.block.cache.size + hbase.regionserver.global.memstore.size + 0.05)”,最大值不
超过90。-XX:MaxDirectMemorySize表示JVM使用的堆外内存,建议低负载情况下设置为“512M”,高负载情况下设置为“2048M”。
Put相关参数
RegionServer处理put请求的数据,会将数据写入memstore和hlog,
当memstore大小达到设置的“hbase.hregion.memstore.flflush.size”参数值大小时,memstore就会刷新到HDFS生成HFile。
当当前region的列簇的HFile数量达到“hbase.hstore.compaction.min”参数值时会触发compaction。
当当前region的列簇HFile数达到“hbase.hstore.blockingStoreFiles”参数值时会阻塞memstore刷新生成HFile的操作,导致put请求阻塞。

参数

描述

默认值

hbase.regionserver.wal.durable.sync

每一条wal是否持久化到硬盘。参考 升连续put场景性能

true

hbase.regionserver.hfile.durable.sync

hfile写是否立即持久化到硬盘。参考 升连续put场景性能

true

hbase.hregion.memstore.flush.size

建议设置为HDFS块大小的整数倍,在内存足够put负载大情况下可以调整增大。单位:字节。

134217728

hbase.regionserver.global.memstore.size

建议设置为“hbase.hregion.memstore.flush.size * 写活跃 region数 / RegionServer GC -Xmx”。默认值为“0.4”,表示使用RegionServer GC -Xmx的40%。

0.4

hbase.hstore.flusher.count

memstore的flush线程数,在put高负载场景下可以适当调大。

2

hbase.regionserver.thread.compaction.small

HFile compaction线程数,在put高负载情况下可以适当调大。

10

hbase.hstore.blockingStoreFiles

当列簇的HFile数达到该阈值,阻塞该region的所有操作,直到compcation完成,在put高负载场景下可以适当调大。

15

 

 

 

参数

描述

默认值

hbase.client.scanner.timeout.period

客户端和RegionServer端参数,表示scan租约的时间,建议设置为60000ms的整数倍,在读高负载情况下可以适当调大。单位:毫秒。

60000

hfile.block.cache.size

数据缓存所占的RegionServer GC -Xmx百分比,在读高负载情况下可以适当调大以增大缓存命中率以提高性能。默认值为“0.25”,表示使用RegionServer GC -Xmx的25%。

0.25

 

 

 

参数

描述

默认值

hbase.regionserver.handler.count

RegionServer上的RPC服务器实例数,建议设置为200 ~ 400 之间。

200

hbase.regionserver.metahandler.count

RegionServer中处理优先请求的程序实例的数量,建议设置为200 ~ 400之间。

100

 

12.3.4 提升实时写数据效率

操作场景
需要把数据实时写入到HBase中或者对于大批量、连续put的场景。
前提条件
调用HBase的put或delete接口,把数据保存到HBase中。
操作步骤
写数据服务端调优
参数入口:
在CDH Manager系统中,选择“服务管理 > HBase > 服务配置”,“参数类别”类型设置为“全部配置”。在搜索框中输入参数名称。
表12­6 影响实时写数据配置项

配置参数

描述

默认值


配置参数

描述

默认值

hbase.regionserver.wal.durable.sync

控制HLog文件在写入到HDFS时的同步程度。如果为true,HDFS在把数据写入到硬盘后才返回;如果为false,HDFS在把数据写入OS的缓存后就返回。

把该值设置为false比true在写入性能上会更优。

true

hbase.regionserver.hfile.durable.sync

控制HFile文件在写入到HDFS时的同步程度。如果为true,HDFS在把数据写入到硬盘后才返回;如果为false,HDFS在把数据写入OS的缓存后就返回。

把该值设置为false比true在写入性能上会更优。

true

GC_OPTS

HBase利用内存完成读写操作。提高HBase内存可以有效提高HBase 性能。GC_OPTS主要需要调整HeapSize的大小和NewSize的大小。调  整HeapSize大小的时候,建议将Xms和Xmx设置成相同的值,这样可以避免JVM动态调整HeapSize大小的时候影响性能。调整NewSize大小的时候,建议把其设置为HeapSize大小的1/9。

HMaster:当HBase集群规模越大、Region数量越多时,可以适当调大HMaster的GC_OPTS参数。RegionServer:RegionServer需要的内存一般比HMaster要

大。在内存充足的情况下,HeapSize可以相对设置大一些。

 

说明:

主HMaster的HeapSize为4G的时候,HBase集群可以支持100000Region 数的规模。根据经验值,单个RegionServer的HeapSize不建议超过20GB。

HMaster:

-Xms2G -Xmx2G - XX:NewSize=256M - XX:MaxNewSize=256M

RegionServer:

-Xms4G -Xmx4G - XX:NewSize=512M - XX:MaxNewSize=512M

hbase.regionserver.handler.count

表示RegionServer在同一时刻能够并发处理多少请求。如果设置过高会导致激烈线程竞争,如果设置过小,请求将会在RegionServer长时间等待,降低处理能力。根据资源情况,适当增加处理线程数。

建议根据CPU的使用情况,可以选择设置为100至300之间的值。

200

hbase.hregion.max.filesize

表示HBase中Region的文件总大小的最大值。当Region中的文件大于该参数时,将会导致Region分裂。 该参数设置过小时,可能会导致Split操作过于频繁。当设置过大时,可能导致Compact需要处理的文件大小增加,影响Compact执行效率。

10737418240(单位:字节)

hbase.hregion.memstore.flush.size

在RegionServer中,当写操作内存中存在超过memstore.flush.size大小的memstore,则MemStoreFlusher就启动flush操作将该memstore 以hfile的形式写入对应的store中。

如果RegionServer的内存充足,而且活跃Region数量也不是很多的时候,可以适当增大该值,可以减少compaction的次数,有助于提升系统性能。

同时,这种flush产生的时候,并不是紧急的flush,flush操作可能会有一定延迟,在延迟期间,写操作还可以进行,Memstore还会继续增大,最大值为“memstore.flush.size”  * “hbase.hregion.memstore.block.multiplier”。当超过最大值时,将会阻塞操作。适当增大“hbase.hregion.memstore.block.multiplier”可以减少阻塞,减少性能波动。

134217728(单位:字节)

hbase.regionserver.global.memstore.size

RegionServer中,负责flush操作的是MemStoreFlusher线程。该线程定期检查写操作内存,当写操作占用内存总量达到阈值, MemStoreFlusher将启动flush操作,按照从大到小的顺序,flush若干相对较大的memstore,直到所占用内存小于阈值。

阈值 = “hbase.regionserver.global.memstore.size”  * “hbase.regionserver.global.memstore.size.lower.limit”  * “HBase_HEAPSIZE”

说明:

该配置与“hfile.block.cache.size”的和不能超过0.8,也就是写和读操作的内存不能超过HeapSize的80%,这样可以保证除读和写外其它操作的正常运行。

0.4

hbase.hstore.blockingStoreFiles

在region flush前首先判断file文件个数,是否大于hbase.hstore.blockingStoreFiles。

如果大于需要先compaction并且让flush延时90s(这个值可以通过hbase.hstore.blockingWaitTime进行配置),在延时过程中,将会继续写从而使得Memstore还会继续增大超过最大值“memstore.flush.size”  * “hbase.hregion.memstore.block.multiplier”,导致写操作阻塞。当完成compaction后,可能就会产生大量写入。这样就导致性能激烈震荡。

增加hbase.hstore.blockingStoreFiles,可以减低BLOCK几率。

15

hbase.regionserver.thread.compaction.throttle

控制一次Minor Compaction时,进行compaction的文件总大小的阈值。Compaction时的文件总大小会影响这一次compaction的执行时间,如果太大,可能会阻塞其它的compaction或flush操作。

1610612736(单位:字节)

 


配置参数

描述

默认值

hbase.hstore.compaction.min

当一个Store中文件超过该值时,会进行compact,适当增大该值,可以减少文件被重复执行compaction。但是如果过大,会导致Store中文件数过多而影响读取的性能。

6

hbase.hstore.compaction.max

控制一次compaction操作时的文件数量的最大值。

与“hbase.hstore.compaction.max.size”的作用基本相同,主要是控制一次compaction操作的时间不要太长。

10

hbase.hstore.compaction.max.size

如果一个HFile文件的大小大于该值,那么在Minor Compaction操作中不会选择这个文件进行compaction操作,除非进行Major  Compaction操作。

9223372036854775807(单

位:字节)

 

这个值可以防止较大的HFile参与compaction操作。在禁止Major Compaction后,一个Store中可能存在几个HFile,而不会合并成为一个HFile,这样不会对数据读取造成太大的性能影响。

 

hbase.hregion.majorcompaction

设置Major Compaction的执行周期。默认值为604800000毫秒。由于执行Major Compaction会占用较多的系统资源,如果正在处于系统繁忙时期,会影响系统的性能。

如果业务没有较多的更新、删除、回收过期数据空间时,可以把该值设置为0,以禁止Major Compaction。

如果必须要执行Major Compaction,以回收更多的空间,可以适当增加该值,同时配置参

数“hbase.offpeak.end.hour”和“hbase.offpeak.start.hour”以控制 Major Compaction发生在业务空闲的时期。

604800000(单位:毫秒)

hbase.regionserver.maxlogs hbase.regionserver.hlog.blocksize

 

表示一个RegionServer上未进行Flush的Hlog的文件数量的阈 值,如果大于该值,RegionServer会强制进行flush操作。

表示每个HLog文件的最大大小。如果HLog文件大小大于该值,就会滚动出一个新的HLog文件,旧的将被禁用并归档。

这两个参数共同决定了RegionServer中可以存在的未进行Flush的hlog 数量。当这个数据量小于MemStore的总大小的时候,会出现由于HLog文件过多而触发的强制flush操作。这个时候可以适当调整这两个参数的大小,以避免出现这种强制flush的情况。

32

134217728(单位:字节)

 

写数据客户端调优
写数据时,在场景允许的情况下,最好使用Put List的方式,可以极大的提升写性能。每一次Put的List的长度,需要结合单条Put的大小,以及实际环境的一些参数进行设定。建议在选定之前先做一些基础的测试。
写数据表设计调优
表12­7 影响实时写数据相关参数 

配置参数

描述

默认值

COMPRESSION

配置数据的压缩算法,这里的压缩是HFile中block 级别的压缩。对于可以压缩的数据,配置压缩算法可以有效减少磁盘的IO,从而达到提高性能的目 的。

 

说明:

并非所有数据都可以进行有效压缩。例如一张图片的  数据,因为图片一般已经是压缩后的数据,所以压缩 效果有限。 常用的压缩算法是SNAPPY,因为它有较好的Encoding/Decoding速度和可以接受的压缩率。

NONE

BLOCKSIZE

配置HFile中block块的大小,不同的block块大小, 可以影响HBase读写数据的效率。越大的block

块,配合压缩算法,压缩的效率就越好;但是由于HBase的读取数据是以block块为单位的,所以越大的block块,对于随机读的情况,性能可能会比较差。

如果要提升写入的性能,一般扩大到128KB或者256KB,可以提升写数据的效率,也不会影响太大的随机读性能。

65536(单位:字节)

IN_MEMORY

配置这个表的数据优先缓存在内存中,这样可以有效提升读取的性能。对于一些小表,而且需要频繁进行读取操作的,可以设置此配置项。

false

 

12.3.5 提升实时读数据效率

操作场景
需要读取HBase数据场景。
前提条件
调用HBase的get或scan接口,从HBase中实时读取数据。
操作步骤
读数据服务端调优
参数入口:
在CDH Manager系统中,选择“服务管理 > HBase > 服务配置”,“参数类别”类型设置为“全部配置”。在搜索框中输入参数名称。
表12­8 影响实时写数据配置项 

配置参数

描述

默认值

GC_OPTS

HBase利用内存完成读写操作。提高HBase内存可以有效提高HBase性能。

HMaster:

-Xms2G -Xmx2G - XX:NewSize=256M - XX:MaxNewSize=256M RegionServer:

-Xms4G -Xmx4G - XX:NewSize=512M - XX:MaxNewSize=512M

 

GC_OPTS主要需要调整HeapSize的大小和NewSize的大小。调整HeapSize大小的时候,建议将Xms和Xmx设置成相同的值,这样可以避免JVM动态调整HeapSize大小的时候影响性能。调整NewSize大小的时候,建议把其设置为HeapSize大小的1/9。

 

HMaster:当HBase集群规模越大、Region数量越多时,可以适当调大HMaster的GC_OPTS参数。

 

RegionServer:RegionServer需要的内存一般比HMaster要 大。在内存充足的情况下,HeapSize可以相对设置大一些。

 

说明:

 

主HMaster的HeapSize为4G的时候,HBase集群可以支持100000Region 数的规模。根据经验值,单个RegionServer的HeapSize不建议超过20GB。

hbase.regionserver.handler.count

表示RegionServer在同一时刻能够并发处理多少请求。如果设置过高会导致激烈线程竞争,如果设置过小,请求将会在RegionServer长时间等待,降低处理能力。根据资源情况,适当增加处理线程数。

建议根据CPU的使用情况,可以选择设置为100至300之间的值。

200

hfile.block.cache.size

HBase缓存区大小,主要影响查询性能。根据查询模式以及查询记录分布情况来决定缓存区的大小。如果采用随机查询使得缓存区的命中率较低,可以适当降低缓存区大小。

0.25

 
说明: 如果同时存在读和写的操作,这两种操作的性能会互相影响。如果写入导致的flush和Compaction操作频繁发生,会占用大量的磁盘IO操作,
从而影响 读取的性能。如果写入导致阻塞较多的Compaction操作,就会出现Region中存在多个HFile的情况,从而影响读取的性能。
所以如果读取的性能不理 想的时候,也要考虑写入的配置是否合理。
读数据客户端调优
Scan数据时需要设置caching(一次从服务端读取的记录条数,默认是1),若使用默认值读性能会降到极低。
当不需要读一条数据所有的列时,需要指定读取的列,以减少网络IO。
只读取RowKey时,可以为Scan添加一个只读取RowKey的fifilter(FirstKeyOnlyFilter或KeyOnlyFilter)。
读数据表设计调优
表12­9 影响实时读数据相关参数

配置参数

描述

默认值

COMPRESSION

配置数据的压缩算法,这里的压缩是HFile中block 级别的压缩。对于可以压缩的数据,配置压缩算法可以有效减少磁盘的IO,从而达到提高性能的目 的。

 

说明:

并非所有数据都可以进行有效压缩。例如一张图片的  数据,因为图片一般已经是压缩后的数据,所以压缩 效果有限。 常用的压缩算法是SNAPPY,因为它有较好的Encoding/Decoding速度和可以接受的压缩率。

NONE

BLOCKSIZE

配置HFile中block块的大小,不同的block块大小, 可以影响HBase读写数据的效率。越大的block

块,配合压缩算法,压缩的效率就越好;但是由于HBase的读取数据是以block块为单位的,所以越大的block块,对于随机读的情况,性能可能会比较差。

如果要提升写入的性能,一般扩大到128KB或者256KB,可以提升写数据的效率,也不会影响太大的随机读性能。

65536(单位:字节)

DATA_BLOCK_ENCODING

配置HFile中block块的编码方法。当一行数据中存在多列时,一般可以配置为“FAST_DIFF”,可以有效的节省数据存储的空间,从而提供性能。

NONE

12.3.6 JVM参数优化操作场景

当集群数据量达到一定规模后,JVM的默认配置将无法满足集群的业务需求,轻则集群变慢,重则集群服务不可用。所以需要根据实际的业务情况进行合理的JVM参数
配置,提高集群性能。
操作步骤
参数入口:
HBase角色相关的JVM参数需要配置在“${HBASE_HOME}/conf”目录下的“hbase-env.sh”文件中。
每个角色都有各自的JVM参数配置变量,如表12-10。
表12­10 HBase相关JVM参数配置变量

变量名

变量影响的角色

HBASE_OPTS

该变量中设置的参数,将影响HBase的所有角色。

SERVER_GC_OPTS

该变量中设置的参数,将影响HBase Server端的所有角色,例如:Master、RegionServer 等。

CLIENT_GC_OPTS

该变量中设置的参数,将影响HBase的Client进程。

HBASE_MASTER_OPTS

该变量中设置的参数,将影响HBase的Master。

HBASE_REGIONSERVER_OPTS

该变量中设置的参数,将影响HBase的RegionServer。

HBASE_THRIFT_OPTS

该变量中设置的参数,将影响HBase的Thrift。

12.4 HDFS

12.4.1 提升写性能

操作场景
在HDFS中,通过调整属性的值,使得HDFS集群更适应自身的业务情况,从而提升HDFS的写性能。
操作步骤
参数入口:
在CDH Manager系统中,选择“服务管理 > HDFS > 服务配置”,“参数类别”类型设置为“全部配置”。在搜索框中输入参数名称。
表12­11 HDFS写性能优化配置

参数

描述

默认值

dfs.datanode.drop.cache.behind.reads

设置为true表示丢弃缓存的数据(需要在DataNode中配置)。

当同一份数据,重复读取的次数较少时,建议设置为true,使得缓存能够被其他操作使用。重复读取的次数较多时,设置为false能够提升重复读取的速度。

true

dfs.client-write-packet-size

当HDFS Client往DataNode写数据时,将数据生成一个包。然后将这个包在网络上传出。此参数指定传输数据包的大小,可以通过各Job来指定。单位:字节。

在万兆网部署下,可适当增大该参数值,来提升传输的吞吐量。

262144

12.4.2 JVM参数优化

操作场景
当集群数据量达到一定规模后,JVM的默认配置将无法满足集群的业务需求,轻则集群变慢,重则集群服务不可用。所以需要根据实际的业务情况进行合理的JVM参数
配置,提高集群性能。
操作步骤
参数入口:
HDFS角色相关的JVM参数需要配置在“${HADOOP_HOME}/etc/hadoop”目录下的“hadoop-env.sh”文件中。
JVM各参数的含义请参见其官网:http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
每个角色都有各自的JVM参数配置变量,如表12-12。
表12­12 HDFS相关JVM参数配置变量

变量名

变量影响的角色

HADOOP_OPTS

该变量中设置的参数,将影响HDFS的所有角色。

HADOOP_NAMENODE_OPTS

该变量中设置的参数,将影响HDFS的NameNode。

HADOOP_DATANODE_OPTS

该变量中设置的参数,将影响HDFS的DataNode。

HADOOP_JOURNALNODE_OPTS

该变量中设置的参数,将影响HDFS的JournalNode。

变量名

变量影响的角色

HADOOP_ZKFC_OPTS

该变量中设置的参数,将影响HDFS的ZKFC。

HADOOP_SECONDARYNAMENODE_OPTS

该变量中设置的参数,将影响HDFS的SecondaryNameNode。

HADOOP_CLIENT_OPTS

该变量中设置的参数,将影响HDFS的Client进程。

HADOOP_BALANCER_OPTS

该变量中设置的参数,将影响HDFS的Balancer进程。

HADOOP_MOVER_OPTS

该变量中设置的参数,将影响HDFS的Mover进程。

 

配置方式举例:
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,N

12.4.3 使用客户端元数据缓存提高读取性能

操作场景
通过使用客户端缓存元数据块的位置来提高HDFS读取性能。
说明:
此功能仅用于读取不经常修改的文件。因为在服务器端由某些其他客户端完成的数据修改,对于高速缓存的客户端将是不可见的,
这可能导致从缓存中拿到的元数据是过期的。 
操作步骤
设置参数的路径:
在CDH Manager页面中,选择“服务管理 > HDFS > 服务配置”,将“参数类别”设置为“全部配置”,并在搜索框中输入参数名称。
表12­13 参数配置

参数

描述

默认值

dfs.client.metadata.cache.enabled

启用/禁用块位置元数据的客户端缓存。将此参数设置为“true”,搭配“dfs.client.metadata.cache.pattern”参数以启用缓存。

false

dfs.client.metadata.cache.pattern

需要缓存的文件路径的正则表达式模式。只有这些文件的块位置元数据被缓存,直到这些元数据过期。此配置仅在参数“dfs.client.metadata.cache.enabled”设置为“true”时有效。

示例:“/test.*”表示读取其路径是以“/test”开头的所有文件。

 

说明:

为确保一致性,配置特定模式以仅缓存其他客户端不经常修改的文件。

正则表达式模式将仅验证URI的path部分,而不验证在Fully Qualified路径情况下的schema和authority。

<empty>

dfs.client.metadata.cache.expiry.sec

缓存元数据的持续时间。缓存条目在该持续时间过期后失效。即使在缓存过程中经常使用的元数 据也会发生失效。

配置值可采用时间后缀s/m/h表示,分别表示秒,分钟和小时。

 

说明:

若将该参数配置为“0s”,将禁用缓存功能。

60s

dfs.client.metadata.cache.max.entries

缓存一次最多可保存的非过期数据条目。

65536

 

说明:
要在过期前完全清除客户端缓存,可调用DFSClient#clearLocatedBlockCache()。
用法如下所示。
FileSystem fs = FileSystem.get(conf);
DistributedFileSystem dfs = (DistributedFileSystem) fs;
DFSClient dfsClient = dfs.getClient();
dfsClient.clearLocatedBlockCache();

  

12.4.4 使用当前活动缓存提升客户端与NameNode的连接性能

操作场景
HDFS部署在具有多个NameNode实例的HA(High Availability)模式中,HDFS客户端需要依次连接到每个NameNode,以确定当前活动的NameNode是什么,并将其用于客户端操作。
一旦识别出来,当前活动的NameNode的详细信息就可以被缓存并共享给在客户端机器中运行的所有客户端。这样,每个新客户端可以首先尝试从缓存加载活动的
Name Node的详细信息,并将RPC调用保存到备用的NameNode。在异常情况下有很多优势,例如当备用的NameNode连接长时间不响应时。
当发生故障,将另一个NameNode切换为活动状态时,缓存的详细信息将被更新为当前活动的NameNode的信息。
操作步骤
设置参数的路径如下:在CDH Manager页面中,选择“服务管理 > HDFS > 服务配置”,将“参数类别”设置为“全部配置”,并在搜索框中输入参数名称。
表12­14 配置参数

参数

描述

默认值

dfs.client.failover.proxy.provider.[nameservice ID]

配置客户端Failover proxy provider类,该类使用传递的协议创建NameNode proxy。该参数可以被配置

为“org.apache.hadoop.hdfs.server.namenode.ha.BlackListingFailoverProxyProvider”或者“org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider”。

org.apache.hadoop.hd

dfs.client.failover.activeinfo.share.flag

启用缓存并将当前活动的NameNode的详细信息共享给其他客户端。若要启用缓存,需将其设置为“true”。

false

dfs.client.failover.activeinfo.share.path

指定将在机器中的所有客户端创建的共享文件的本地目录。如果要为不同用户共享缓存, 该文件夹应具有必需的权限(如在给定目录中创建,读写缓存文件)。

/tmp

dfs.client.failover.activeinfo.share.io.timeout.sec

控制超时的可选配置。用于在读取或写入缓存文件时获取锁定。如果在该时间内无法获取 缓存文件上的锁定,则放弃尝试读取或更新缓存。单位为秒。

5

说明:
由HDFS客户端创建的缓存文件必须由其他客户端重新使用。因此,这些文件永远不会从本地系统中删除。若禁用该功能,可能需要进行手动清理。  

12.5 Hive

12.5.1 建立表分区

操作场景
Hive在做Select查询时,一般会扫描整个表内容,会消耗较多时间去扫描不关注的数据。此时,可根据业务需求及其查询维度,建立合理的表分区,从而提高查询效
率。
操作步骤
1. 使用PuTTY工具,以root用户登录已安装Hive客户端的节点。
2. 执行以下命令,进入客户端安装目录,例如“/opt/client”。
cd /opt/client
3. 执行source bigdata_env命令,配置客户端环境变量。
4. 在客户端中执行如下命令,执行登录操作。
kinit 用户名
5. 执行以下命令登录客户端工具。
beeline
6. 指定静态分区或者动态分区。
静态分区:
静态分区是手动输入分区名称,在创建表时使用关键字PARTITIONED BY指定分区列名及数据类型。应用开发时,使用ALTER TABLE ADD
PARTITION语句增加分区,以及使用LOAD DATA INTO PARTITON语句将数据加载到分区时,只能静态分区。
动态分区:通过查询命令,将结果插入到某个表的分区时,可以使用动态分区。
动态分区通过在客户端工具执行如下命令来开启:
set hive.exec.dynamic.partition=true
动态分区默认模式是strict,也就是必须至少指定一列为静态分区,在静态分区下建立动态子分区,可以通过如下设置来开启完全的动态分区:
set hive.exec.dynamic.partition.mode=nonstrict
说明:
1. 动态分区可能导致一个DML语句创建大量的分区,对应的创建大量新文件夹,对系统性能可能带来影响。
2. 在文件数量大的情况下,执行一个SQL语句启动时间较长,可以在执行SQL语句之前执行“set mapreduce.input.fifileinputformat.list-status.num
threads = 100;”语句来缩短启动时间。“mapreduce.input.fifileinputformat.list-status.num-threads”参数需要先添加到Hive的白名单才可设置。 

12.5.2 Join优化

操作场景
使用Join语句时,如果数据量大,可能造成命令执行速度和查询速度慢,此时可进行Join优化。
Join优化可分为以下方式:
Map Join
Sort Merge Bucket Map Join
Join顺序优化
Map Join
Hive的Map Join适用于能够在内存中存放下的小表(指表大小小于25MB),通过“hive.mapjoin.smalltable.fifilesize”定义小表的大小,默认为25MB。Map Join的方法有两种:
使用/*+ MAPJOIN(join_table) */。
执行语句前设置如下参数,当前版本中该值默认为true。
set hive.auto.convert.join=true
使用Map Join时没有Reduce任务,而是在Map任务前起了一个MapReduce Local Task,这个Task通过TableScan读取小表内容到本机,在本机以HashTable的形式
保存并写入硬盘上传到DFS,并在distributed cache中保存,在Map Task中从本地磁盘或者distributed cache中读取小表内容直接与大表join得到结果并输出。
使用Map Join时需要注意小表不能过大,如果小表将内存基本用尽,会使整个系统性能下降甚至出现内存溢出的异常。
Sort Merge Bucket Map Join
使用Sort Merge Bucket Map Join必须满足以下2个条件:
1. join的两张表都很大,内存中无法存放。
2. 两张表都按照join key进行分桶(clustered by (column))和排序(sorted by(column)),且两张表的分桶数正好是倍数关系。
通过如下设置,启用Sort Merge Bucket Map Join:
set hive.optimize.bucketmapjoin=true
set hive.optimize.bucketmapjoin.sortedmerge=true
这种Map Join也没有Reduce任务,是在Map任务前启动MapReduce Local Task,将小表内容按桶读取到本地,在本机保存多个桶的HashTable备份并写入HDFS,并保存在Distributed Cache中,在Map Task中从本地磁盘或者Distributed Cache中按桶一个一个读取小表内容,然后与大表做匹配直接得到结果并输出。
Join顺序优化
当有3张及以上的表进行Join时,选择不同的Join顺序,执行时间存在较大差异。使用恰当的Join顺序可以有效缩短任务执行时间。
Join顺序原则:
Join出来结果较小的组合,例如表数据量小或两张表Join后产生结果较少,优先执行。
Join出来结果大的组合,例如表数据量大或两张表Join后产生结果较多,在后面执行。
例如,customer表的数据量最多,orders表和lineitem表优先Join可获得较少的中间结果。
原有的Join语句如下:
select
l_orderkey,
sum(l_extendedprice * (1 - l_discount)) as revenue,
o_orderdate,
o_shippriority
from
customer,
orders,
lineitem
where
c_mktsegment = 'BUILDING'
and c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate < '1995-03-22'
and l_shipdate > '1995-03-22'
limit 10;
Join顺序优化后如下:
select
l_orderkey,
sum(l_extendedprice * (1 - l_discount)) as revenue,
o_orderdate,
o_shippriority
from
orders,
lineitem,
customer
where
c_mktsegment = 'BUILDING'
and c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate < '1995-03-22'
and l_shipdate > '1995-03-22'
limit 10;

  

注意事项
Join数据倾斜问题
执行任务的时候,任务进度长时间维持在99%,这种现象叫数据倾斜。
数据倾斜是经常存在的,因为有少量的Reduce任务分配到的数据量和其他Reduce差异过大,导致大部分Reduce都已完成任务,但少量Reduce任务还没完成的情况。
解决数据倾斜的问题,可通过设置set hive.optimize.skewjoin=true并调整hive.skewjoin.key的大小。hive.skewjoin.key是指Reduce端接收到多少个key即认为数据是
倾斜的,并自动分发到多个Reduce。

12.5.3 Group By优化

操作场景

优化Group by语句,可提升命令执行速度和查询速度。
Group by的时候, Map端会先进行分组, 分组完后分发到Reduce端, Reduce端再进行分组。可采用Map端聚合的方式来进行Group by优化,开启Map端初步聚
合,减少Map的输出数据量。
操作步骤
在Hive客户端进行如下设置:
set hive.map.aggr=true
注意事项
Group By数据倾斜
Group By也同样存在数据倾斜的问题,设置hive.groupby.skewindata为true,生成的查询计划会有两个MapReduce Job,第一个Job的Map输出结果会随机的分布到Reduce中,每个Reduce做聚合操作,并输出结果,这样的处理会使相同的Group By Key可能被分发到不同的Reduce中,从而达到负载均衡,第二个Job再根据预处理的结果按照Group By Key分发到Reduce中完成最终的聚合操作。
Count Distinct聚合问题
当使用聚合函数count distinct完成去重计数时,处理值为空的情况会使Reduce产生很严重的数据倾斜,可以将空值单独处理,如果是计算count distinct,可以通过where字句将该值排除掉,并在最后的count distinct结果中加1。如果还有其他计算,可以先将值为空的记录单独处理,再和其他计算结果合并。

12.5.4 数据存储优化

操作场景
“ORC”是一种高效的列存储格式,在压缩比和读取效率上优于其他文件格式。
建议使用“ORC”作为Hive表默认的存储格式。
前提条件
已登录Hive客户端,具体操作请参见《管理员指南》的“使用Hive客户端”。
操作步骤
推荐:使用“SNAPPY”压缩,适用于压缩比和读取效率要求均衡场景。
Create table xx stored as orc tblproperties ("orc.compress"="SNAPPY")
可用:使用“ZLIB”压缩,适用于压缩比要求较高场景。
Create table xx stored as orc tblproperties ("orc.compress"="ZLIB")
说明:
xx为具体使用的Hive表名。 

12.5.5 SQL优化

操作场景
在Hive上执行SQL语句查询时,如果语句中存在“(a&b) or (a&c)”逻辑时,建议将逻辑改为“a & (b or c)”。
样例
假设条件a为“p_partkey = l_partkey”,优化前样例如下所示:
select
sum(l_extendedprice* (1 - l_discount)) as revenue
from
lineitem,
part
where
(
p_partkey = l_partkey
and p_brand = 'Brand#32'
and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
and l_quantity >= 7 and l_quantity <= 7 + 10
and p_size between 1 and 5
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
( p_partkey = l_partkey
and p_brand = 'Brand#35'
and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
and l_quantity >= 15 and l_quantity <= 15 + 10
and p_size between 1 and 10
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
( p_partkey = l_partkeyand p_brand = 'Brand#24'
and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
and l_quantity >= 26 and l_quantity <= 26 + 10
and p_size between 1 and 15
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)

  

优化后样例如下所示:
select
sum(l_extendedprice* (1 - l_discount)) as revenue
from
lineitem,
part
where
(
p_partkey = l_partkey
and p_brand = 'Brand#32'
and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
and l_quantity >= 7 and l_quantity <= 7 + 10
and p_size between 1 and 5
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
( p_partkey = l_partkey
and p_brand = 'Brand#35'
and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
and l_quantity >= 15 and l_quantity <= 15 + 10
and p_size between 1 and 10
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
( p_partkey = l_partkeyand p_brand = 'Brand#24'
and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
and l_quantity >= 26 and l_quantity <= 26 + 10
and p_size between 1 and 15
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)

  

12.5.6 使用Hive CBO优化查询

操作场景
在Hive中执行多表Join时,Hive支持开启CBO(Cost Based Optimization),系统会自动根据表的统计信息,例如数据量、文件数等,选出最优计划提高多表Join的
效率。Hive需要先收集表的统计信息后才能使CBO正确的优化。
说明:
CBO优化器会基于统计信息和查询条件,尽可能地使join顺序达到最优。但是也可能存在特殊情况导致join顺序调整不准确。例如数据存在倾斜,以及查询条件值在表中不存在等场景,可能调整出非优化的join顺序。
开启列统计信息自动收集时,需要在reduce侧做聚合统计。对于没有reduce阶段的insert任务,将会多出reduce阶段,用于收集统计信息。 
前提条件
已登录Hive客户端,具体操作请参见《管理员指南》的“使用Hive客户端”。
操作步骤
1. 在Manager界面Hive组件的服务配置中搜索“hive.cbo.enable”参数,选中“true”永久开启功能或者通过以下命令临时开启功能:
set hive.cbo.enable=true;
2. 手动收集Hive表已有数据的统计信息。
执行以下命令,可以手动收集统计信息。仅支持统计一张表,如果需要统计不同的表需重复执行。
ANALYZE TABLE [db_name.]tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)]
COMPUTE STATISTICS
[FOR COLUMNS]
[NOSCAN];
说明:
指定FOR COLUMNS时,收集列级别的统计信息。
指定NOSCAN时,将只统计文件大小和个数,不扫描具体文件。 
例如:
analyze table table_name compute statistics;
analyze table table_name compute statistics for columns;3. 配置Hive自动收集统计信息。开启配置后,执行insert overwrite/into命令插入数据时才自动统计新数据的信息。
在Hive客户端执行以下命令临时开启收集:
set hive.stats.autogather = true; 开启表/分区级别的统计信息自动收集。
set hive.stats.column.autogather = true; 开启列级别的统计信息自动收集。
说明:
列级别统计信息的收集不支持复杂的数据类型,例如Map,Struct等。
表级别统计信息的自动收集不支持Hive on HBase表。
在Manager界面Hive的服务配置中,搜索参数“hive.stats.autogather”和“hive.stats.column.autogather”,选中“true”永久开启收集功能。
4. 执行以下命令可以查看统计信息。
DESCRIBE FORMATTED table_name[.column_name] PARTITION partition_spec;
例如:
desc formatted table_name;
desc formatted table_name.id;
desc formatted table_name.id partition(time='2016-05-27');
说明:
分区表仅支持分区级别的统计信息收集,因此分区表需要指定分区来查询统计信息。
 
posted @ 2020-09-20 13:39  花未全开*月未圆  阅读(1377)  评论(0编辑  收藏  举报