Hive远程模式部署参考:
一、Hive数据仓库应用之Hive部署(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)
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客户端通过set命令指定配置参数及配置参数的值,若当前客户端退出,则配置自动消失;永久配置是指在Hive的配置文件hive-site.xml中配置相关参数。
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文件中添加如下配置内容。
<property>
<name>mapreduce.map.output.compressname>
<value>truevalue>
property>
其中配置文件hive-site.xml的路径如下,使用vi指令对其进行编辑即可。
默认情况下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.sizename>
<value>300000000value>
property>
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.reducesname>
<value>3value>
property>
在执行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.formatname>
<value>org.apache.hadoop.hive.ql.io.CombineHiveInputFormatvalue>
property>
Hive在执行复杂HiveQl语句时,会涉及到多个任务,默认情况下每个任务是按照先后顺序执行的,若果每个人物没有前后依赖关系,那么可以通过并发执行的方式使多个任务同时执行,从而缩短HiveQL语句的执行时间。
在Hive中可以将参数hive.exec.parallel的参数值设置为true开启Hive并行执行,若使用Hive客户端临时配置并行执行,则可以执行下列命令:
set hive.exec.parallel=true;
若需要永久配置并行执行,则需要在Hive配置文件hive-site.xml中添加如下配置内容。
<property>
<name>hive.exec.parallelname>
<value>truevalue>
property>
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.autoname>
<value>truevalue>
property>
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.skewindataname>
<value>truevalue>
property>
HiveQL语句优化技巧指的是使用HiveQL语句处理大数据时通过调整HiveQL语句格式,从而提高HiveQL语句的执行效率,涉及到的几种优化技巧如下:
参考文献:黑马程序员.Hive数据仓库应用[M].北京:清华大学出版社,2021.