Ambari集群配置的实践指南

最近更新时间:2019-01-08 18:19:50

Ambari集群配置的实践指南

KMR使用Ambari Web UI來管理主机、服务、告警、设置等。

管理集群配置

通过Ambari可以设定特定组件的配置。如果要调整组件的配置,可以进入「service」标签,或者点击左右的具体组件,点击「config」进行配置。

image.png

修改 NameNode Java 堆栈大小

NameNode Java 堆栈大小取決于许多因素,例如集群的负载、文件数和分块数。1GB的预设大小适用于大部分的集群,但是某些工作负载需要更多或更少的内存。

修改 NameNode Java 堆栈大小:

  1. 点击「service」标签中的「HDFS」,进入「config」标签。

image.png

  1. 找到「NameNode Java heap size」设置。 您也可以使用「filter」来搜索特定配置。选取右侧的画笔。

image.png

  1. 在文本框中输入新的值,点击回车保存修改

image.png

  1. 点击「congfig」顶部的绿的「save」保存修改。

image.png

Hive配置优化实践指南

下面说明一下Hive性能调优的配置选项。

  1. 要修改Hive组件的参数,点击「service」标签中的「Hive」。
  2. 进入「config」标签。

设定Hive集群引擎

Hive提供两个执行引擎:MapReduce 和 Tez。 Tez 比 MapReduce 更快。 KMR集群使用Tez作为预设的执行引擎。更改引擎:

  1. 在 Hive「config」标签中,「filter」中筛选「excution engine」。

image.png

  1. 最佳的预设值是Tez

image.png

优化分组参数

Hadoop会将单个文件拆分(对应)为多个文件,并且并行处理产生的文件。对应程序的数目取决于分割的数目。下面两个组件的参数会影响Tez执行引擎的分割数量:

tez.grouping.min-size:分组分割大小下限,预设值是 16 MB (16777216 位元組)。 tez.grouping.max-size:分组分割大小上限,预设值為 1 GB (1,073,741,824 位元組)。

根据效能的经验法则,降低这两个参数可以改善延迟扩大吞吐。

例如,要设定128MB对应四个程序任务,可以将这两个参数都设置为32MB。

要修改限制参数,进入Tez服务的「config」标签。展开「general」选项,找到 tez.grouping.max-size 和 tez.grouping.min-size 参数。

将这两个参数设置为 33,554,432 位元組 (32 MB)。

image.png

这些变更会影响服务器的所有Tez任务。若要得到最佳效果,请适当调节参数值。

调优reducer

ORC 和 Snappy 均可以达到高性能。不过,Hive预设的reducer数量可能太少,因而导致瓶颈。

举例来说,如果有50GB的数据。数据是ORC格式,经过Snappy压缩处理后为1GB。Hive估计需要的reducer数量为:(对应程序分组的数据大小)/ hive.exec.reducers.bytes.per.reducer

根据预设设定,这个例子需要4个reducer。

hive.exec.reducers.bytes.per.reducer 参数指定每个reducer处理的数据大小。预设值为64MB。降低这个值会增加并行度,可能会改善性能。过度降低也会产生过多的reducer,严重的可能会影响性能。此参数根据你的数据需求、压缩设置和其他环境设置决定。

  1. 要修改参数,请进入「Hive」标签下的「config」标签,「filter」搜索reducer参数。

image.png

  1. 点击「编辑」将值修改为128MB(134,217728),然后点击回车保存。

image.png

假设输入大小为 1024 MB,每个化简器的数据为 128 MB,则有 8 个化简器 (1024/128)。

为“Data per Reducer”参数提供错误的值可能导致生成大量的reducer,从而对查询性能产生负面影响。 若要限制reducer的最大数目,请将 hive.exec.reducers.max 设置为适当的值。 默认值为 1009。

启用并行执行

一个 Hive 查询是在一个或多个阶段中执行的。 如果可以并行运行各个独立阶段,则会提高查询性能。

若要启用并行查询执行,请导航到 Hive 的「config」选项卡并搜索 hive.exec.parallel 属性。 默认值为 false。 将该值更改为 true,然后按 Enter 保存该值。

若要限制并行运行的作业数,请修改 hive.exec.parallel.thread.number 属性。 默认值为 8。

image.png

启用矢量化

Hive 逐行处理数据。 矢量化指导 Hive 以块(一个块包含 1,024 行)的方式处理数据,而不是以一次一行的方式处理数据。 矢量化只适用于 ORC 文件格式。

  1. 若要启用矢量化查询执行,请导航到 Hive 的「config」选项卡并搜索 hive.vectorized.execution.enabled 参数。 Hive 0.13.0 或更高版本的默认值为 true。

  2. 若要为查询的reducer启用矢量化执行,请将 hive.vectorized.execution.reduce.enabled 参数设置为 true。 默认值为 false。

image.png

启用基于成本的优化 (CBO)

默认情况下,Hive 遵循一组规则来找到一个最佳的查询执行计划。 基于成本的优化 (CBO) 可以评估多个查询执行计划并向每个计划分配一个成本,然后确定成本最低的查询执行计划。

若要启用 CBO,请导航到 Hive 的「config」选项卡并搜索 parameter hive.cbo.enable,然后将开关按钮切换到“on”。

image.png

启用 CBO 后,可使用以下附加配置参数提高 Hive 查询性能:

  • hive.compute.query.using.stats 如果设置为 true,则 Hive 会使用其元存储中存储的统计信息来应答类似于 count(*) 的简单查询。

image.png

  • hive.stats.fetch.column.stats启用 CBO 时,会创建列统计信息。 Hive 使用元存储中存储的列统计信息来优化查询。 如果列数较多,则提取每个列的列统计信息需要花费很长时间。 如果设置为 false,则会禁用从元存储中提取列统计信息。

image.png

  • hive.stats.fetch.partition.stats

行数、数据大小和文件大小等基本分区统计信息存储在元存储中。 如果设置为 true,则会从元存储中提取分区统计信息。 如果为 false,则从文件系统中提取文件大小,并从行架构中提取行数。

image.png

启用中间压缩

映射任务将创建reducer任务使用的中间文件。 中间压缩可以缩小中间文件大小。

Hadoop 作业通常会遇到 I/O 瓶颈。 压缩数据能够加快 I/O 和总体网络传输速度。

可用的压缩类型包括:

格式 工具 算法 文件扩展名 是否可拆分?
Gzip Gzip DEFLATE .gz
Bzip2 Bzip2 Bzip2 .bz2
LZO Lzop LZO .bz2 是(如果已编制索引)
Snappy 不适用 Snappy Snappy

一般规则是,尽量使用可拆分的压缩方法,否则会创建极少的mapper。 如果输入数据为文本,则 bzip2 是最佳选项。 对于 ORC 格式,Snappy 是最快的压缩选项。

  1. 若要启用中间压缩,请导航到 Hive 的「config」选项卡,并将 hive.exec.compress.intermediate 参数设置为 true。 默认值为 false。

image.png

备注 若要压缩中间文件,请选择一个 CPU 开销较低的压缩编解码器,即使该编解码器不能提供较高的压缩输出。

  1. 若要设置中间压缩编解码器,请将自定义属性 mapred.map.output.compression.codec 添加到 hive-site.xml 或 mapred-site.xml 文件。

  2. 添加自定义设置:
  • 导航到 Hive 的「config」选项卡并选择「advance」选项卡。
  • 在「advance」选项卡下,找到并展开「cumstom hive-site」窗格。
  • 单击「cumstom hive-site」窗格底部的「Add Property」链接。
  • 在「Add Property」窗口中,输入 mapred.map.output.compression.codec作为键,输入 org.apache.hadoop.io.compress.SnappyCodec 作为值。
  • 单击 「Add」。

这会使用Snappy压缩来压缩中间文件。添加该属性后,它会显示在「cumstom hive-site」窗格中。

备注 此过程会修改 $HADOOP_HOME/conf/hive-site.xml 文件。

压缩最终输出

还可以压缩最终的 Hive 输出。

  1. 若要压缩最终的 Hive 输出,请导航到 Hive 的「config」选项卡,并将 hive.exec.compress.output 参数设置为 true。 默认值为 false。

  2. 若要选择输出压缩编解码器,请根据上一部分的步骤 3 所述,将 mapred.output.compression.codec 自定义属性添加到「cumstom hive-site」窗格。

image.png

启用推理执行

推理执行可以启动特定数量的重复任务以检测运行速度缓慢的任务跟踪程序并将其加入方块列表,同时通过优化各项任务结果来改善总体作业执行。

不应该对输入量较大的长时间运行的 MapReduce 任务启用推理执行。

  • 若要启用推理执行,请导航到 Hive 的「config」选项卡,并将 hive.mapred.reduce.tasks.speculative.execution 参数设置为 true。 默认值为 false。

image.png

优化动态分区

Hive 允许在表中插入记录时创建动态分区,且无需预定义每个分区。 这是一项强大功能,尽管,它可能导致创建大量的分区并为每个分区创建大量的文件。

  1. 要让 Hive 执行动态分区,应将 hive.exec.dynamic.partition 参数值设置为 true(默认值)。

  2. 将动态分区模式更改为 strict。 在 strict(严格)模式下,必须至少有一个分区是静态的。 这可以阻止未在 WHERE 子句中包含分区筛选器的查询,即,strict 可阻止扫描所有分区的查询。 进入 Hive 的「config」选项卡,并将 hive.exec.dynamic.partition.mode 设置为 strict。 默认值为 nonstrict。
  3. 若要限制要创建的动态分区数,请修改 hive.exec.max.dynamic.partitions 参数。 默认值为 5000。

  4. 若要限制每个节点的动态分区总数,请修改 hive.exec.max.dynamic.partitions.pernode。 默认值为 2000。

启用本地模式

本地模式可让 Hive 在一台计算机上(有时是在单个进程中)执行某个作业的所有任务。 如果输入数据较小,并且查询启动任务的开销会消耗总体查询执行资源的绝大部分,则此模式可以提高查询性能。

若要启用本地模式,请根据启用中间压缩部分的步骤 3 所述,将 hive.exec.mode.local.auto 参数添加到「custom hive-site」面板。

image.png

设置单个 MapReduce MultiGROUP BY

如果此属性设置为 true,则包含通用 group-by 键的 MultiGROUP BY 查询将生成单个 MapReduce 作业。

若要启用此行为,请根据启用中间压缩部分的步骤 3 所述,将 hive.multigroupby.singlereducer 参数添加到「custom hive-site」面板。

image.png

其他 Hive 优化

以下部分介绍了可以设置的其他 Hive 相关优化。

联接优化

Hive 中的默认联接类型是“随机联接”。 在 Hive 中,特殊的mapping会读取输入,并向中间文件发出联接键/值对。 Hadoop 在随机阶段中排序与合并这些对。 此随机阶段的系统开销较大。 根据数据选择右联接可以显著提高性能。

联接类型 时间 方式 Hive 设置 注释
随机联接 默认选项
始终运行
从某个表的一部分内容中读取
根据联接键存储和排序
向每个化简器发送一个存储桶
在化简端执行联接
不需要过多的 Hive 设置 每次运行
映射联接 一个表可以装入内存 将小型表读入内存哈希表
通过大型文件的一部分流式处理
联接哈希表中的每条记录
只按映射器执行联接
hive.auto.confvert.join=true 速度很快,但受限
排序合并存储桶 如果两个表:
排序方式相同
存储方式相同
按排序/存储的列执行联接 每个进程:
从每个表中读取存储桶
处理值最小的行
hive.auto.convert.sortmerge.join=true 非常高效

执行引擎优化

有关优化 Hive 执行引擎的其他建议:

设置 建议 KMR默认值
hive.mapjoin.hybridgrace.hashtable True = 更安全,但速度更慢;false = 速度更快 false
tez.am.resource.memory.mb 大多数引擎的上限为 4 GB 自动优化
tez.session.am.dag.submit.timeout.secs 300+ 300
tez.am.container.idle.release-timeout-min.millis 20000+ 10000
tez.am.container.idle.release-timeout-max.millis 40000+ 20000

HBASE配置优化实践指南

可以通过 HBase 的「config」选项卡修改 HBase 配置。以下部分介绍了一些影响 HBase 性能的重要配置设置。

设置 HBASE_HEAPSIZE

HBase 堆大小指定region server和主服务器要使用的最大堆数量(以 MB 为单位)。 默认值为 1,000 MB。 优化群集工作负荷时应优化此项设置。

  1. 若要修改,请导航到 HBase「config」选项卡中的「advanced Hbase-env」标签,然后找到 HBASE_HEAPSIZE 设置。
  2. 将默认值更改为 5,000 MB。

image.png

优化读取密集型工作负荷

以下配置对于提高读取密集型工作负荷的性能非常重要。

块缓存大小

块缓存是读取缓存。 其大小由 hfile.block.cache.size 参数控制。 默认值为 0.4,即总区域服务器内存的 40%。 块缓存大小越大,随机读取的速度越快。

  1. 若要修改此参数,请导航到 HBase「config」选项卡,然后找到「% of Regionserver Allocated to Read Buffers」。

image.png

  1. 若要更改此值,请选择「edit」图标。

Memstore 大小

所有编辑内容都存储在称作 Memstore 的内存缓冲区中。 此机制增大了可在单个操作中写入磁盘的总数据量,并可加速以后对最近编辑内容的访问。 Memstore 大小由以下两个参数定义:

  • hbase.regionserver.global.memstore.UpperLimit:定义 Memstore 总共可以使用的区域服务器最大内存百分比。
  • `hbase.regionserver.global.memstore.LowerLimit:定义 Memstore 总共可以使用的区域服务器最小内存百分比。

若要优化随机读取,可以减小 Memstore 的上限和下限。

从磁盘扫描时提取的行数

hbase.client.scanner.caching 设置定义在扫描程序中调用 `next 方法时,要从磁盘读取的行数。 默认值为 100。 该数字越大,从客户端向区域服务器发出的远程调用数就越少,因而扫描速度也就越快。 但是,这也会增大客户端上的内存压力。

image.png

重要 设置此值时,请不要使扫描程序中的下一次方法调用间隔时间大于扫描程序的超时时间。 扫描程序超时期限由 hbase.regionserver.lease.period 属性定义。

优化写入密集型工作负荷

以下配置对于提高写入密集型工作负荷的性能非常重要。

最大区域文件大小

HBase 使用称作 HFile 的内部文件格式存储数据。 属性 hbase.hregion.max.filesize 定义区域的单个 HFile 的大小。 如果区域(region)中的 HFiles 总数大于此设置,则会将该区域拆分为两个区域。

image.png

区域文件大小越大,拆分数目越小。 可以增大文件大小,以确定可以最大程度地提高写入性能的值。

避免阻止更新

  • 属性 hbase.hregion.memstore.flush.size 定义 Memstore 刷新到磁盘的增量大小。 默认大小为 128 MB。
  • Hbase 区域块乘数由 hbase.hregion.memstore.block.multiplier 定义。 默认值为 4。 允许的最大值为 8。
  • 如果 Memstore 为 (hbase.hregion.memstore.flush.size * hbase.hregion.memstore.block.multiplier) 字节,则 HBase 会阻止更新。

使用刷新大小和块乘数的默认值时,如果 Memstore 大小为 128 * 4 = 512 MB,则会阻止更新。 若要减少更新阻止计数,请增大 hbase.hregion.memstore.block.multiplier 的值。

image.png

定义 Memstore 大小

Memstore 大小由 hbase.regionserver.global.memstore.UpperLimithbase.regionserver.global.memstore.LowerLimit 参数定义。 将这些值设置为相等可以减少写入期间的暂停次数(同时提高刷新频率),并可以提高写入性能。

设置 Memstore 本地分配缓冲区

Memstore 本地分配缓冲区使用率由 hbase.hregion.memstore.mslab.enabled 属性确定。 如果已启用 (true),则可以防止在执行写入密集型操作期间出现堆碎片。 默认值为 true。

开启服务的自动启动

Ambari提供了服务异常中止后的自动重启功能,位置为Admin>service Auto Start,将需要自动重启的组件的状态设置为enable,保存设置。

在服务出现异常中止的时候,Ambari会尝试自动重启该服务。

image.png

设置HDFS再平衡(rebalance)

HDFS集群在新增加点后,会出现已有节点与新节点存储空间不平衡的状态,已有节点占用空间较多,而新节点占用空间桀较少。 image.png

在这个时候可以通过hdfs的rebalance功能对hdfs文件进行再平衡。

rebalance的选项在HDFS > service actions > rebalnce HDFS

WeChata1c339c79271ac9b5d4f04fdb5dfabd2.png

Balancer threshold这个参数代表的含义是与HDFS磁盘使用率的偏差的阈值。

image.png

image.png

如上的设置,如果一个data node的使用率大于44%,多出的部分的数据就会rebalance到小于23%的节点上。

此外,rebalance过程会占用内部带宽,因此,这个参数会决定rebalance的所需的时间,不过也不建议将这个参数设置过大,以免影响线上的任务。

image.png

默认值为每秒60M。

设置ES balance的阈值

ES集群中可以设置watermark的阈值来决定存shard rebalance的阈值

image.png

high:表示超过这个阈值就会触发shard balance

low:表示超过这个阈值就不会再向这个节点分配shard

金山云,开启您的云计算之旅

注册有礼