---
title: 调优思路
description: "性能调优需先定位问题，明确性能瓶颈所在层级，再针对性选择优化方法。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengbds/ecosystemEnable/Hive/topic_0276661745.html
sourcePath: /source/zh/kunpengbds/ecosystemEnable/Hive/topic_0276661745.html
indexId: 3759ee67871ec250cca2456a8af72805b447c2985550e156c79ab27ad65cc76d64
---
# 调优思路

性能调优需先定位问题，明确性能瓶颈所在层级，再针对性选择优化方法。

具体分析思路如下：

定位瓶颈的维度

- 对于服务端的问题，需要重点定位CPU、内存、硬盘及BIOS配置等硬件指标，通过监测数据分析瓶颈点。
- 对于网络问题，网卡中断绑核可显著提升网络性能。

Hive优化关键点

Hive性能主要受查询计划和Tez任务执行两方面影响。优化时需结合HiveServer的运行日志及GC日志进行分析，HiveServer日志路径为HiveServer节点的“/var/log/hive”。关键日志如表1所示。


**表1 关键日志文件说明**

| 文件名 | 日志内容 |
| --- | --- |
| hiveserver2.log | HiveServer运行日志 |
| hiveserver2\-gc\-2019\-12\-30\_22\-27\-02.log.0.current | HiveServer GC日志 |


Hive优化实施步骤

1. 分析SQL待处理的表及文件。统计待处理的表的文件数、数据量、条数、文件格式和压缩格式，分析是否有更适合的文件存储格式、压缩格式，是否能够使用分区或分桶，是否有大量小文件需要map前合并。如果有优化空间，则执行优化。

  a. 如何判断是否有更合适的文件存储格式。
    当前TPC-DS测试，使用的文件存储格式为ORC，当前测试性能最优，推荐使用该存储格式。

  b. 如何判断是否有更合适的压缩格式。
    当前TPC-DS测试，在map/reduce阶段，使用的数据压缩格式为Snappy，当前测试性能最优，推荐使用该压缩格式。

  c. 如何判断是否能够使用分区或分桶。
    庞大的数据集可能需要耗费大量的时间去处理。在许多场景下，可以通过分区或切片的方法减少每一次扫描总数据量，这种做法可以显著地改善性能。Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值。但是由于HDFS并不支持大量的子目录，这也给分区的使用带来了限制。我们有必要对表中的分区数量进行预估，从而避免因为分区数量过大带来一系列问题。Hive查询通常使用分区的列作为查询条件。这样的做法可以指定MapReduce任务在HDFS中指定的子目录下完成扫描的工作。HDFS的文件目录结构可以像索引一样高效利用。

    如：

    1 2 3 4 5 CREATE TABLE logs( timestamp BIGINT, line STRING ) PARTITIONED BY (date STRING,country STRING);

    PARTITIONED BY子句中定义的列是表中正式的列（分区列），但是数据文件内并不包含这些列。

    Hive还可以把表或分区，组织成桶。将表或分区组织成桶有以下几个目的：

    第一个目的是为了取样更高效，因为在处理大规模的数据集时，在开发、测试阶段将所有的数据全部处理一遍可能不太现实，这时取样就必不可少。

    第二个目的是为了获得更好的查询处理效率。

    桶为表提供了额外的结构，Hive在处理某些查询时利用这个结构，能够有效地提高查询效率。

    桶是通过对指定列进行哈希计算来实现的，通过哈希值将一个列名下的数据切分为一组桶，并使每个桶对应于该列名下的一个存储文件。

    在建立桶之前，需要设置hive.enforce.bucketing属性为true，使得Hive能识别桶。

    以下为创建带有桶的表的语句，实际操作中请将bucketed_user替换为实际的表名：

    1 2 3 4 5 CREATE TABLE bucketed_user( id INT, name String ) CLUSTERED BY (id) INTO 4 BUCKETS;

    分区中的数据可以被进一步拆分成桶，bucket，不同于分区对列直接进行拆分，桶往往使用列的哈希值进行数据采样。

    在分区数量过于庞大以至于可能导致文件系统崩溃时，建议使用桶。

  d. 如何判断是否有大量小文件需要map前合并。
    查看每张表下的文件的大小，如果小文件（文件大小小于blocksize）很多，那么建议在map前将小文件进行合并，合并语句如下，实际操作中请将bucketed_user替换为实际的表名：

    1 ALTER TABLE bucketed_user CONCATENATE;

2. 根据nmon抓取的数据分析性能瓶颈，根据CPU以及内存的使用情况，修改hive.tez.container.size等参数。
