七、Hive数据仓库应用之Hive优化(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)

Hive远程模式部署参考:
一、Hive数据仓库应用之Hive部署(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)

一、Hive存储优化

Hive中底层数据是以文件的形式存储在Hadoop的HDFS中,不同文件存储格式不仅对存储空间占用的大小有所不同,而且对HiveQL语句的执行性能也有所不同,因此根据实际应用场景选择合理的文件存储格式就显得尤为重要。Hive中常见的文件存储格式如下:

文件存储格式 存储方式 自身支持压缩 支持分片 加载数据方式
TextFile 行式存储 LOAD和INSERT
SequenceFile 列式存储 INSERT
ORCFile 行式存储 INSERT

TextFile是Hive默认文件存储格式。
SequenceFile将数据存储为序列化的键值对形式,其中值为原始数据,键为生成的内容。SequenceFile支持两种压缩RECORD和BLOCK,其中RECORD表示只对值进行压缩,BLOCK表示键值都会被压缩。
ORCFile支持两种压缩ZLIB和SNAPPY,其中ZLIB压缩率比较高;SNAPPY压缩和解压的速度比较快。在实际的生产环境中,一般使用ORCFile和ZLIB或者SNAPPY相组合的方式设置Hive表的存储及压缩格式。

例如在创建Hive时指定存储格式为ORCFile并执行压缩格式为Snappy,其指令如下:

CREATE TABLE log_orc_snappy(
track_time STRING,
url STRING,
session_id STRING,
referer STRING,
ip STRING)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS ORC 
TBLPROPERTIES ("orc.compress"="SNAPPY");

上述指令中,最后两个依次表示存储格式为ORCFile,压缩方式为SNAPPY。

二、Hive参数优化

Hive参数优化是指通过调整Hive默认的参数配置,以达到提升Hive性能的效果。Hive参数配置主要分为临时配置和永久配置,其中临时配置是指在Hive客户端通过set命令指定配置参数及配置参数的值,若当前客户端退出,则配置自动消失;永久配置是指在Hive的配置文件hive-site.xml中配置相关参数。

1、配置MapReduce压缩

MapReduce任务在执行过程中,会涉及将中间数据写入磁盘的操作,为了减少磁盘IO和网络IO的开销,通常使用压缩速度较快的压缩格式,如Snappy,从而提升Hive性能。
配置MapReduce的常用参数如下:
mapreduce.map.output.compress:默认值为false,用于启动Map输出压缩,若开启则需要设置参数值为True。
mapreduce.map.output.compress.codec:默认参数为org.apache.hadoop.io.compress.DefaultCodec,用于设置Map输出压缩编码解码器,推荐使用Snappy,设置参数为org.apache.hadoop.io.compress.SnappyCodec。
mapreduce.output.fileoutputformat.compress:默认值为false,用于开启Mapreduce输出压缩,若开启则设置参数值为True。
mapreduce.output.fileoutputformat.compress.codec:默认参数为org.apache.hadoop.io.compress.DefaultCodec,用于设置MapReduce输出压缩编码解码器,推荐使用Snappy。
mapreduce.output.fileoutputformat.compress.type:用于设置MapReduce输出压缩方式,除默认值RECORD外可以配置NONE和BLOCK,其中BLOCK针对一组记录进行批量压缩,压缩效率更高。
hive.exec.compress.intermediate:默认值为false,用于控制Hive在多个MapReduce作业之间生成的中间文件是否被压缩,其中压缩编码解码器与mapreduce.output.fileoutputformat.compress.codec一致,若开启需要设置参数值为True。
hive.exec.compress.output:默认值为false,用于控制是否压缩Hive查询的最终输出,其压缩编码解码器与mapreduce.output.fileoutputformat.compress.codec一致,若开启需要设置参数值为True。

以开启Map输出压缩为例,若使用客户端临时配置,指令如下:

set mapreduce.map.output.compress=true;

若进行永久配置,则需要在配置文件hive-site.xml文件中添加如下配置内容。

扫描二维码关注公众号,回复: 16766600 查看本文章
<property>
	<name>mapreduce.map.output.compress</name>
	<value>true</value>
</property>

其中配置文件hive-site.xml的路径如下,使用vi指令对其进行编辑即可。
在这里插入图片描述

2、配置Map个数

默认情况下Map个数由数据文件个数、数据文件大小和BlockSize(默认值为128MB)决定,当数据文件大于BlockSize时,MapReduce会根据BlockSize进行切分。
Map规格书需要根据实际应用场景进行设置,当数据文件较大时,通过增加Map的个数实现并行处理,从而提高效率。当存在多个小数据文件或者系统资源有限的情况下,减少Map个数可以做到对系统资源的合理运用。
在Hive中可以通过参数mapred.min.split.size和mapred.map.tasks控制Map个数,前者表示控制分片最小单元,默认为1B,当设置该值大于BlockSize时,则可以起到减少Map个数的作用;后者表示指定Map个数,主要用于增加Map个数。
以调整分片最小单元等于300M为例,若使用Hive客户端临时配置Map个数,则可以执行下列命令:

set mapred.min.split.size=300000000;

若需要永久配置Map个数,则需要在Hive配置文件hive-site.xml中添加如下配置内容。

<property>
	<name>mapred.max.split.size</name>
	<value>300000000</value>
</property>

3、配置reduce个数

Reduce的个数对整个作业的运行性能有很大影响,若Reduce的个数设置过多,那么Mapreduce运行结果会产生很多的小文件,对Namenode会产生一定影响,同时启动和初始化Reduce也会消耗时间和资源。如果Reduce个数设置的过小,那么单个Reduce处理的数据将会加大,会影响运行效率。
在Hive中可以使用参数mapreduce.job.reduces设置Reduce个数,这里以调整Reduce个数等于3为例,若使用Hive客户端临时配置Reduce个数,则可以执行下列命令:

set mapreduce.job.reduces=3;

若需要永久配置Reduce个数,则需要在Hive配置文件hive-site.xml中添加如下配置内容。

<property>
	<name>mapreduce.job.reduces</name>
	<value>3</value>
</property>

4、配置合并文件

在执行HiveQL语句时,每个数据文件会交给一个Map去处理,如果存在多个小数据文件,就需要将多个小数据文件先进行合并,然后交给一个Map处理,以此避免启动多个Map造成不必要的资源浪费。
在Hive中可以通过参数hive.input.format设置Map执行前合并小文件,使用Hive客户端临时配置合并文件,则可以执行下列命令:

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

若需要永久配置合并文件,则需要在Hive配置文件hive-site.xml中添加如下配置内容。

<property>
	<name>hive.input.format</name>
	<value>org.apache.hadoop.hive.ql.io.CombineHiveInputFormat</value>
</property>

5、配置并行执行

Hive在执行复杂HiveQl语句时,会涉及到多个任务,默认情况下每个任务是按照先后顺序执行的,若果每个人物没有前后依赖关系,那么可以通过并发执行的方式使多个任务同时执行,从而缩短HiveQL语句的执行时间。
在Hive中可以将参数hive.exec.parallel的参数值设置为true开启Hive并行执行,若使用Hive客户端临时配置并行执行,则可以执行下列命令:

set hive.exec.parallel=true;

若需要永久配置并行执行,则需要在Hive配置文件hive-site.xml中添加如下配置内容。

<property>
	<name>hive.exec.parallel</name>
	<value>true</value>
</property>

6、配置本地模式

Hadoop通常部署的是完全分布式模式,Hive在涉及MapReduce任务的操作时会调用集群中的MapReduce去执行,不过有的时候Hive输入的数据量非常小,使用集群中的MapReduce去执行任务反而会浪费资源且增加运行时间,因此可以在Hive中通过参数hive.exec.mode.local.auto让Hive在适当的时候启动本地MapReduce去执行Hive任务,以达到缩减执行时间的目的,将该参数值设置为true即可:

set hive.exec.mode.local.auto=true;

若需要永久配置本地模式,则需要在Hive配置文件hive-site.xml中添加如下配置内容。

<property>
	<name>hive.exec.mode.local.auto</name>
	<value>true</value>
</property>

7、配置分组

GROUP BY语句会将Map阶段Key值相同的数据发送到一个Reduce中处理,当某一个Key中的数据过多时,便会出现数据倾斜的情况。在Hive中我们可以设置参数hive.groupby.skewindata的参数值为true,这样当出现数据倾斜的情况时Hive会自动进行负载均衡。
若使用Hive客户端临时配置分组, 则可以执行下列命令:

set hive.groupby.skewindata=true;

若需要永久配置分组,则需要在Hive配置文件hive-site.xml中添加如下配置内容。

<property>
	<name>hive.groupby.skewindata</name>
	<value>true</value>
</property>

三、HiveQL语句优化技巧

HiveQL语句优化技巧指的是使用HiveQL语句处理大数据时通过调整HiveQL语句格式,从而提高HiveQL语句的执行效率,涉及到的几种优化技巧如下:

  1. 尽量避免使用笛卡儿积JOIN,因为笛卡尔积JOIN只能使用一个Reduce去处理,当处理大量数据时一个Reduce处理会增加处理时间。、
  2. 使用JOIN语句时,添加NULL的过滤条件,避免NULL参与没必要的JOIN操作,从而缩减JOIN语句操作时间。
  3. 少用“SELECT *”的形式查询所有列,尽量使用“SELECT Col1、Col2…”的形式查询某一或某几列,从而避免查询所有数据。
  4. 使用JOIN语句时,若需要通过WHERE子句过滤数据则WHERE子句建议写在子查询中。
  5. 尽量不使用COUNT(DISTINCT)实现去重统计,因为该方式只会使用一个Reduce来处理,当处理大量数据时一个Reduce处理会增加处理时间,建议使用GROUP BY子句加COUNT()聚合函数的方式替代。

参考文献:黑马程序员.Hive数据仓库应用[M].北京:清华大学出版社,2021.

猜你喜欢

转载自blog.csdn.net/weixin_42051846/article/details/132761538
今日推荐