hive的优化方式一(项目中通过CM对Hive参数进行优化)

1.HDFS副本数

dfs.replication(HDFS)
文件副本数通常情况下为3,不推荐修改,如果测试环境只有两台虚拟机,那么此处要修改为2

2.Yarn基础配置

2.1 nodemanager配置
2.1.1CPU配置
yarn.nodemanager.resource.cpu-vcores
表示该节点服务器上yarn可以使用的虚拟CPU个数,默认值是8,推荐将值配置与物理CPU线程数相同,如果节点CPU核心不足8个,要调小这个值,yarn不会智能的去检测物理核心数。
如何查看当前物理CPU线程数:
grep ‘processor’ /proc/cpuinfo | sort -u | wc -l

2.1.2内存配置
yarn.nodemanager.resource.memory-mb
一般nodemanager节点上的容器内存按照剩余内存的百分之八十来分配,因为要预留出百分之二十左右的内存
例如:一共有64G 剩余50G 那么就分配50*0.8=40G
可以通过CM来查看剩余多少内存

2.1.3 本地目录
yarn.nodemanager.local-dirs(Yarn)
NodeManager 存储中间数据文件的本地文件系统中的目录列表。
如果单台服务器上有多个磁盘挂载,则配置的值应当是分布在各个磁盘上目录,这样可以充分利用节点的IO读写能力。
2.2MapReduce内存配置
当MR内存溢出时,可以根据服务器配置进行调整。
1.mapreduce.map.memory.mb
为作业的每个 Map 任务分配的物理内存量(MiB),默认为0,自动判断大小。
2.mapreduce.reduce.memory.mb
为作业的每个 Reduce 任务分配的物理内存量(MiB),默认为0,自动判断大小。
3.mapreduce.map.java.opts、mapreduce.reduce.java.opts
Map和Reduce的JVM配置选项。

注意:
mapreduce.map.java.opts一定要小于mapreduce.map.memory.mb;
mapreduce.reduce.java.opts一定要小于mapreduce.reduce.memory.mb,格式-Xmx4096m。
注意:
此部分所有配置均不能大于Yarn的NodeManager内存配置。

3.Hive基础配置

3.1 HiveServer2 的 Java 堆栈
Hiveserver2异常退出,导致连接失败的问题。
搜索JAVA堆栈大小即可修改配置
3.2 动态生成分区的线程数
hive.load.dynamic.partitions.thread
用于加载动态生成的分区的线程数。加载需要将文件重命名为它的最终位置,并更新关于新分区的一些元数据。默认值为 15 。
当有大量动态生成的分区时,增加这个值可以提高性能。根据服务器配置修改。
默认值为15 一般在可以正常运行的情况下不会修改此配置
3.3 监听输入文件线程数
hive.exec.input.listing.max.threads
Hive用来监听输入文件的最大线程数。默认值:15。
当需要读取大量分区时,增加这个值可以提高性能。根据服务器配置进行调整。
默认值为15 一般情况下不会修改此配置

4.压缩配置

4.1 map输出压缩
MapReduce配置项:
mapreduce.map.output.compress
设置是否启动map输出压缩,默认为false。在需要减少网络传输的时候,可以设置为true。
mapreduce.map.output.compress.codec
设置map输出压缩编码解码器,默认为org.apache.hadoop.io.compress.DefaultCodec,推荐使用SnappyCodec:org.apache.hadoop.io.compress.SnappyCodec。
4.2 Reduce结果压缩
配置项:
1.mapreduce.output.fileoutputformat.compress
是否启用 MapReduce 作业输出压缩。
2.mapreduce.output.fileoutputformat.compress.codec
指定要使用的压缩编码解码器,推荐SnappyCodec。
(…Io.compress.SnappyCodec)
3.mapreduce.output.fileoutputformat.compress.type
一般选择block,因为这样会进行批量压缩,压缩效率更高
4.3 Hive执行过程通用压缩设置
mapreduce.output.fileoutputformat.compress.codec(Yarn)
map输出所用的压缩编码解码器,默认为org.apache.hadoop.io.compress.DefaultCodec;
推荐使用SnappyCodec:org.apache.hadoop.io.compress.SnappyCodec。
mapreduce.output.fileoutputformat.compress.type
一般选择block,因为这样会进行批量压缩,压缩效率更高
4.4 Hive多个Map-Reduce中间数据压缩
控制 Hive 在多个map-reduce作业之间生成的中间文件是否被压缩。压缩编解码器和其他选项由上面Hive通用压缩mapreduce.output.fileoutputformat.compress.*确定。

set hive.exec.compress.intermediate=true;
4.5 Hive最终结果压缩
控制是否压缩查询的最终输出(到 local/hdfs 文件或 Hive table)。压缩编解码器和其他选项由 上面Hive通用压缩mapreduce.output.fileoutputformat.compress.*确定。

set hive.exec.compress.output=true;

5.其他

5.1 JVM重用(不再支持)
因为我们使用的是hive2.0.0的版本,Hadoop3.0的版本,新版本在对于JVM重用方面进行了优化 所以在这里不用配置了
如果使用旧版本的话:
mapred.job.reuse.jvm.num.tasks
mapreduce.job.jvm.numtasks
配置这两个就可以了
5.2 Hive执行引擎(了解)
CDH支持的引擎一共有两个 一个是MR,另一个是Spark
但是Spark不一定比MR快,因为经历了Hive2.0的版本和Hadoop3.0的版本后,MR的性能已经得到了大幅度的提升
如果要配置:
配置项:hive.execution.engine

6.Hive并行操作

6.1 Hive编译查询限制
Hive默认同时只能编译一段HiveQL,并上锁。
将hive.driver.parallel.compilation设置为true,各个会话可以同时编译查询,提高团队工作效率。否则如果在UDF中执行了一段HiveQL,或者多个用户同时使用的话, 就会锁住。
修改hive.driver.parallel.compilation.global.limit的值,0或负值为无限制,可根据团队人员和硬件进行修改,以保证同时编译查询。

6.2Hive不同阶段任务并行执行
Hive会将一个查询转化为一个或多个阶段,包括:MapReduce阶段、抽样阶段、合并阶段、limit阶段等。默认情况下,一次只执行一个阶段。不过,如果某些阶段不是互相依赖,是可以并行执行的。
set hive.exec.parallel=true,可以开启并发执行,默认为false。
set hive.exec.parallel.thread.number=16; //同一个sql允许的最大并行度,默认为8。
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=16;

7.Hive小文件合并

此部分设置,要根据硬件内存来进行调整,个人电脑配置较低,不建议修改。
hive.merge.mapfiles
是否开启合并Map端小文件,在Map-only的任务结束时合并小文件,true是打开。
hive.merge.mapredfiles
是否开启合并Reduce端小文件,在map-reduce作业结束时合并小文件。true是打开。
hive.merge.size.per.task
合并后MR输出文件的大小,默认为256M。
hive.merge.smallfiles.avgsize
当输出文件的平均大小小于此设置值时,启动一个独立的map-reduce任务进行文件merge,默认值为16M。

8.矢量化查询

hive的默认查询执行引擎一次处理一行,而矢量化查询执行是一种hive特性,目的是按照每批1024行读取数据,并且一次性对整个记录整合(而不是对单条记录)应用操作,注意:要使用矢量化查询执行,就必须以ORC格式存储数据。

set hive.vectorized.execution.enabled=true;

9.读取零拷贝

ORC可以使用新的HDFS缓存API和ZeroCopy读取器来避免在扫描文件时将额外的数据复制到内存中。
set hive.exec.orc.zerocopy=true;

上一篇:08-05 细分构建机器学习应用程序的流程-数据预处理


下一篇:服务器托管中U的含义