性能调优首先要发现问题,找到性能瓶颈点,然后根据瓶颈所处层级选择优化的方法。
调优分析思路如下:
Hive调优需要看HiveServer的运行日志及GC日志。
HiveServer日志路径为:HiveServer节点的“/var/log/hive”。
文件名 |
日志内容 |
---|---|
hiveserver2.log |
HiveServer运行日志 |
hiveserver2-gc-2019-12-30_22-27-02.log.0.current |
HiveServer GC日志 |
主要分为以下过程:
当前TPC-DS测试,在map/reduce阶段,使用的数据压缩格式为SNAPPY,当前测试性能最优,推荐使用该压缩格式。
庞大的数据集可能需要耗费大量的时间去处理。在许多场景下,可以通过分区或切片的方法减少每一次扫描总数据量,这种做法可以显著地改善性能。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); |
PARTITONED BY子句中定义的列是表中正式的列(分区列),但是数据文件内并不包含这些列。
Hive还可以把表或分区,组织成桶。将表或分区组织成桶有以下几个目的:
第一个目的是为看取样更高效,因为在处理大规模的数据集时,在开发、测试阶段将所有的数据全部处理一遍可能不太现实,这时取样就必不可少。
第二个目的是为了获得更好的查询处理效率。
桶为表提供了额外的结构,Hive在处理某些查询时利用这个结构,能够有效地提高查询效率。
桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件。
在建立桶之前,需要设置hive.enforce.bucketing属性为true,使得Hive能识别桶。
以下为创建带有桶的表的语句:
1 2 3 4 5 | CREATE TABLE bucketed_user( id INT, name String ) CLUSTERED BY (id) INTO 4 BUCKETS; |
分区中的数据可以被进一步拆分成桶,bucket,不同于分区对列直接进行拆分,桶往往使用列的哈希值进行数据采样。
在分区数量过于庞大以至于可能导致文件系统崩溃时,建议使用桶。
查看每张表的下文件的大小,如果小文件(文件大小小于blocksize)很多,那么建议在map前将小文件进行合并,合并语句如下。
1 | ALTER TABLE $table_name CONCATENATE. |