此教程中关于Hive的优化,皆是基于Hive2.x的版本,对于Hive1.x旧版本的优化机制不再复述(新版本已改善或变更)。另外新版本中默认为开启状态的优化配置项,在工作中无需修改,也不再复述。
一、HDFS副本数
- 配置项:dfs.replication ( HDFS)
- 介绍:文件副本数,通常设为3,不推荐修改。
二、CPU配置
查看CPU线程数
grep 'processor' /proc/cpuinfo | sort -u | wc -l
配置项:yarn.nodemanager.resource.cpu-vcores
- 表示该节点服务器上yarn可以使用的虚拟CPU个数,默认值是8,推荐将值配置与物理CPU线程数相同,如果节点CPU核心不足8个,要调小这个值,yarn不会智能的去检测物理核心数。
- 配置项:yarn.nodemanager.resource.memory-mb
- 设置该nodemanager节点上可以为容器分配的总内存,默认为8G,如果节点内存资源不足8G,要减少这个值,yarn不会智能的去检测内存资源,一般按照服务器剩余可用内存资源进行配置。生产上根据经验一般要预留15-20%的内存,那么可用内存就是实际 内存 0.8,比如实际内存是64G,那么640.8=51.2G,我们设置成50G就可以了(固定经验值)。
注意,要同时设置yarn.scheduler.maximum-allocation-mb为一样的值, yarn.app.mapreduce.am.command-opts(JVM内存)的值要同步修改为略小的值(-Xmx1024m)。
- yarn.nodemanager.local-dirs ( Yarn )
- NodeManager 存储中间数据文件的本地文件系统中的目录列表。如果单台服务器上有多个磁盘挂载,则配置的值应当是分布在各个磁盘上目录,这样可以充分利用节点的IO读写能力。
- 当MR内存溢出时,可以根据服务器配置进行调整。
- mapreduce.map.memory.mb
- 为作业的每个 Map 任务分配的物理内存量(MiB),默认为0,自动判断大小。
- mapreduce.reduce.memory.mb
- 为作业的每个 Reduce 任务分配的物理内存量(MiB),默认为0,自动判断大小。
- mapreduce.map.java.opts、mapreduce.reduce.java.opts
注意
:- mapreduce.map.java.opts一定要小于mapreduce.map.memory.mb;
- mapreduce.reduce.java.opts一定要小于mapreduce.reduce.memory.mb,格式 -Xmx4096m。
- 此部分所有配置均不能大于Yarn的NodeManager内存配置。
- 问题:Hiveserver2异常退出,导致连接失败的问题。
- 解决方法:修改HiveServer2 的 Java 堆栈大小。
- 问题:Hive默认同时只能编译一段HiveQL,并上锁。
- 原因:将hive.driver.parallel.compilation设置为true,各个会话可以同时编译查询,提高团队工作效
率。否则如果在UDF中执行了一段HiveQL,或者多个用户同时使用的话, 就会锁住。 - 解决方法:修改hive.driver.parallel.compilation.global.limit的值,0或负值为无限制,可根据团队人员和硬件进行修改,以保证同时编译查询。
- hive.load.dynamic.partitions.thread
- 用于加载动态生成的分区的线程数。加载需要将文件重命名为它的最终位置,并更新关于新分区的一些元数据。默认值为15。当有大量动态生成的分区时,增加这个值可以提高性能。根据服务器配置修改。
- hive.exec.input.listing.max.threads
- Hive用来监听输入文件的最大线程数。默认值:15。当需要读取大量分区时,增加这个值可以提高性能。根据服务器配置进行调整。
- 除了创建表时指定保存数据时压缩,在查询分析过程中,Map的输出也可以进行压缩。由于map任务的输出需要写到磁盘并通过网络传输到reducer节点,所以通过使用LZO、LZ4或者Snappy这样的快速压缩方式,是可以获得性能提升的,因为需要传输的数据减少了。
- 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。
- 是否对任务输出结果压缩,默认值false。对传输数据进行压缩,既可以减少文件的存储空间,又可以加快数据在网络不同节点之间的传输速度。
- 配置项:
- mapreduce.output.fileoutputformat.compress
- 是否启用 MapReduce 作业输出压缩。
- mapreduce.output.fileoutputformat.compress.codec
指定要使用的压缩编码解码器,推荐SnappyCodec。 - mapreduce.output.fileoutputformat.compress.type
- 指定MapReduce作业输出的压缩方式,默认值RECORD,可配置值有:NONE、RECORD、
BLOCK。推荐使用BLOCK,即针对一组记录进行批量压缩,压缩效率更高。
控制 Hive 在多个map-reduce作业之间生成的中间文件是否被压缩。压缩编解码器和其他选项由上面Hive通用压缩mapreduce.output.fileoutputformat.compress.*确定。
set hive.exec.compress.intermediate=true;
控制是否压缩查询的最终输出(到 local/hdfs 文件或 Hive table)。压缩编解码器和其他选项由上面Hive通用压缩mapreduce.output.fileoutputformat.compress.*确定。
set hive.exec.compress.output=true;
随着Hadoop版本的升级,已自动优化了JVM重用选项,MRv2开始不再支持JVM重用。(旧版本配置项:mapred.job.reuse.jvm.num.tasks、mapreduce.job.jvm.numtasks)
十五、Hive执行引擎- CDH支持的引擎包括MapReduce和Spark两种,可自由选择,Spark不一定比MR快,Hive2.x和Hadoop3.x经过多次优化,Hive-MR引擎的性能已经大幅提升。
- 配置项:hive.execution.engine