KMR使用Ambari Web UI來管理主机、服务、告警、设置等。
通过Ambari可以设定特定组件的配置。如果要调整组件的配置,可以进入 service 标签,或者点击左右的具体组件,点击 config 进行配置。
NameNode Java 堆栈大小取決于许多因素,例如集群的负载、文件数和分块数。1GB的预设大小适用于大部分的集群,但是某些工作负载需要更多或更少的内存。
修改 NameNode Java 堆栈大小:
下面说明一下Hive性能调优的配置选项。
Hive提供两个执行引擎:MapReduce 和 Tez。 Tez 比 MapReduce 更快。 KMR集群使用Tez作为预设的执行引擎。更改引擎:
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)。
这些变更会影响服务器的所有Tez任务。若要得到最佳效果,请适当调节参数值。
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,严重的可能会影响性能。此参数根据你的数据需求、压缩设置和其他环境设置决定。
假设输入大小为 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。
Hive 逐行处理数据。 矢量化指导 Hive 以块(一个块包含 1,024 行)的方式处理数据,而不是以一次一行的方式处理数据。 矢量化只适用于 ORC 文件格式。
若要启用矢量化查询执行,请导航到 Hive 的 config 选项卡并搜索
hive.vectorized.execution.enabled
参数。 Hive 0.13.0 或更高版本的默认值为 true。
若要为查询的reducer启用矢量化执行,请将 hive.vectorized.execution.reduce.enabled
参数设置为 true。 默认值为 false。
默认情况下,Hive 遵循一组规则来找到一个最佳的查询执行计划。 基于成本的优化 (CBO) 可以评估多个查询执行计划并向每个计划分配一个成本,然后确定成本最低的查询执行计划。
若要启用 CBO,请导航到 Hive 的 config 选项卡并搜索 parameter hive.cbo.enable
,然后将开关按钮切换到 “on” 。
启用 CBO 后,可使用以下附加配置参数提高 Hive 查询性能:
hive.compute.query.using.stats
count(*)
的简单查询。hive.stats.fetch.column.stats
启用 CBO 时,会创建列统计信息。 Hive 使用元存储中存储的列统计信息来优化查询。 如果列数较多,则提取每个列的列统计信息需要花费很长时间。 如果设置为 false,则会禁用从元存储中提取列统计信息。hive.stats.fetch.partition.stats
行数、数据大小和文件大小等基本分区统计信息存储在元存储中。 如果设置为 true,则会从元存储中提取分区统计信息。 如果为 false,则从文件系统中提取文件大小,并从行架构中提取行数。
映射任务将创建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 是最快的压缩选项。
hive.exec.compress.intermediate
参数设置为 true。 默认值为 false。备注
若要压缩中间文件,请选择一个 CPU 开销较低的压缩编解码器,即使该编解码器不能提供较高的压缩输出。
若要设置中间压缩编解码器,请将自定义属性 mapred.map.output.compression.codec
添加到 hive-site.xml 或 mapred-site.xml 文件。
添加自定义设置:
mapred.map.output.compression.codec
作为键,输入 org.apache.hadoop.io.compress.SnappyCodec
作为值。这会使用Snappy压缩来压缩中间文件。添加该属性后,它会显示在 cumstom hive-site 窗格中。
备注
此过程会修改$HADOOP_HOME/conf/hive-site.xml
文件。
还可以压缩最终的 Hive 输出。
若要压缩最终的 Hive 输出,请导航到 Hive 的 config 选项卡,并将 hive.exec.compress.output
参数设置为 true。 默认值为 false。
若要选择输出压缩编解码器,请根据上一部分的步骤 3 所述,将 mapred.output.compression.codec
自定义属性添加到 cumstom hive-site 窗格。
推理执行可以启动特定数量的重复任务以检测运行速度缓慢的任务跟踪程序并将其加入方块列表,同时通过优化各项任务结果来改善总体作业执行。
不应该对输入量较大的长时间运行的 MapReduce 任务启用推理执行。
hive.mapred.reduce.tasks.speculative.execution
参数设置为 true。 默认值为 false。Hive 允许在表中插入记录时创建动态分区,且无需预定义每个分区。 这是一项强大功能,尽管,它可能导致创建大量的分区并为每个分区创建大量的文件。
要让 Hive 执行动态分区,应将 hive.exec.dynamic.partition
参数值设置为 true(默认值)。
将动态分区模式更改为 strict。 在 strict(严格)模式下,必须至少有一个分区是静态的。 这可以阻止未在 WHERE 子句中包含分区筛选器的查询,即,strict 可阻止扫描所有分区的查询。 进入 Hive 的 config 选项卡,并将 hive.exec.dynamic.partition.mode
设置为 strict。 默认值为 nonstrict。
若要限制要创建的动态分区数,请修改 hive.exec.max.dynamic.partitions
参数。 默认值为 5000。
若要限制每个节点的动态分区总数,请修改 hive.exec.max.dynamic.partitions.pernode
。 默认值为 2000。
本地模式可让 Hive 在一台计算机上(有时是在单个进程中)执行某个作业的所有任务。 如果输入数据较小,并且查询启动任务的开销会消耗总体查询执行资源的绝大部分,则此模式可以提高查询性能。
若要启用本地模式,请根据启用中间压缩部分的步骤 3 所述,将 hive.exec.mode.local.auto
参数添加到「custom hive-site」面板。
如果此属性设置为 true,则包含通用 group-by 键的 MultiGROUP BY 查询将生成单个 MapReduce 作业。
若要启用此行为,请根据启用中间压缩部分的步骤 3 所述,将 hive.multigroupby.singlereducer
参数添加到 custom hive-site 面板。
以下部分介绍了可以设置的其他 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 的 config 选项卡修改 HBase 配置。以下部分介绍了一些影响 HBase 性能的重要配置设置。
HBase 堆大小指定region server和主服务器要使用的最大堆数量(以 MB 为单位)。 默认值为 1,000 MB。 优化群集工作负荷时应优化此项设置。
以下配置对于提高读取密集型工作负荷的性能非常重要。
块缓存是读取缓存。 其大小由 hfile.block.cache.size
参数控制。 默认值为 0.4,即总区域服务器内存的 40%。 块缓存大小越大,随机读取的速度越快。
所有编辑内容都存储在称作 Memstore 的内存缓冲区中。 此机制增大了可在单个操作中写入磁盘的总数据量,并可加速以后对最近编辑内容的访问。 Memstore 大小由以下两个参数定义:
hbase.regionserver.global.memstore.UpperLimit
:定义 Memstore 总共可以使用的区域服务器最大内存百分比。若要优化随机读取,可以减小 Memstore 的上限和下限。
hbase.client.scanner.caching
设置定义在扫描程序中调用 ```next`` 方法时,要从磁盘读取的行数。 默认值为 100。 该数字越大,从客户端向区域服务器发出的远程调用数就越少,因而扫描速度也就越快。 但是,这也会增大客户端上的内存压力。
重要
设置此值时,请不要使扫描程序中的下一次方法调用间隔时间大于扫描程序的超时时间。 扫描程序超时期限由hbase.regionserver.lease.period
属性定义。
以下配置对于提高写入密集型工作负荷的性能非常重要。
HBase 使用称作 HFile 的内部文件格式存储数据。 属性 hbase.hregion.max.filesize
定义区域的单个 HFile 的大小。 如果区域(region)中的 HFiles 总数大于此设置,则会将该区域拆分为两个区域。
区域文件大小越大,拆分数目越小。 可以增大文件大小,以确定可以最大程度地提高写入性能的值。
hbase.hregion.memstore.flush.size
定义 Memstore 刷新到磁盘的增量大小。 默认大小为 128 MB。hbase.hregion.memstore.block.multiplier
定义。 默认值为 4。 允许的最大值为 8。hbase.hregion.memstore.flush.size
* hbase.hregion.memstore.block.multiplier
) 字节,则 HBase 会阻止更新。使用刷新大小和块乘数的默认值时,如果 Memstore 大小为 128 * 4 = 512 MB,则会阻止更新。 若要减少更新阻止计数,请增大 hbase.hregion.memstore.block.multiplier
的值。
Memstore 大小由 hbase.regionserver.global.memstore.UpperLimit
和 hbase.regionserver.global.memstore.LowerLimit
参数定义。 将这些值设置为相等可以减少写入期间的暂停次数(同时提高刷新频率),并可以提高写入性能。
Memstore 本地分配缓冲区使用率由 hbase.hregion.memstore.mslab.enabled
属性确定。 如果已启用 (true),则可以防止在执行写入密集型操作期间出现堆碎片。 默认值为 true。
Ambari提供了服务异常中止后的自动重启功能,位置为Admin>service Auto Start,将需要自动重启的组件的状态设置为enable,保存设置。
在服务出现异常中止的时候,Ambari会尝试自动重启该服务。
HDFS集群在新增加点后,会出现已有节点与新节点存储空间不平衡的状态,已有节点占用空间较多,而新节点占用空间桀较少。
在这个时候可以通过hdfs的rebalance功能对hdfs文件进行再平衡。
rebalance的选项在HDFS>service actions>rebalnce HDFS
Balancer threshold这个参数代表的含义是与HDFS磁盘使用率的偏差的阈值。
如上的设置,如果一个data node的使用率大于44%,多出的部分的数据就会rebalance到小于23%的节点上。
此外,rebalance过程会占用内部带宽,因此,这个参数会决定rebalance的所需的时间,不过也不建议将这个参数设置过大,以免影响线上的任务。
默认值为每秒60M。
ES集群中可以设置watermark的阈值来决定存shard rebalance的阈值
high:表示超过这个阈值就会触发shard balance
low:表示超过这个阈值就不会再向这个节点分配shard
文档内容是否对您有帮助?
评价建议不能为空
非常感谢您的反馈,我们会继续努力做到更好!