Hive是基于Hadoop的一种数据仓库,对查询和管理分布式存储中的超大数据集提供了很大帮助。正如绝大部分开源软件一样,Hive允许用户调整参数改变Hive的默认行为。用户可以使用下面三种方法中的任意一种对Hive进行配置管理:
- 在Hive的CLI(命令行接口)使用set命令在会话层级为后续语句设置参数值,比如:set hive.exec.scratchdir=/tmp/mydir,将后续语句的临时目录(该目录用于存储Hive的临时输出和计划)设置为/tmp/mydir。
- 使用--hiveconf选项为整个会话设置参数,比如:bin/hive --hiveconfhive.exec.scratchdir=/tmp/mydir,这样在启动hive后,在CLI中执行的所有语句的临时目录都为=/tmp/mydir。
- 最后一种(也是本人最喜欢的一种,一劳永逸)是修改hive-site.xml文件,该方式的作用范围较上述两种方式都要大,用于为整个Hive的配置管理设置参数值,意思是每次启动hive时其参数值都是不变的。比如:
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/mydir</value>
<description>Scratchspace for Hive jobs</description>
</property>
Hive提供了hive-default.xml.template,该文件位于HIVE_HOME/conf目录中,包含了各个配置参数的默认值,用户可以通过在conf目录中创建hive-site.xml并新增特定参数的值来覆盖默认值。
概括起来,Hive的配置参数可以分为以下四类:
- Hive管理参数
- Hive元存储(Metastore)管理参数
- 与Hadoop交互的管理参数
- 用于传递运行时信息的参数
下面根据上面的分类分别学习配置参数的含义及默认值,首先是Hive管理参数,如下面的表格所示:
参数名 | 描述 | 默认值 |
hive.ddl.output.format | 用于DDL输出的数据格式,其值可以为text或者json。 | null |
hive.exec.script.wrapper | hive调用的封装器,比如若该值设置为python,脚本将会按照python <脚本命令>的格式调用,若该值为null或者未设置,脚本将会按照<脚本命令>的格式调用。 | null |
hive.exec.plan | Hive执行计划的文件路径 | null |
hive.exec.scratchdir | 存储hive查询时不同map/reduce阶段的计划和这些阶段的中间输出结果的目录。 | /tmp/hive-<user.name> (Hive-0.8.1版本开始) |
hive.exec.local.scratchdir | 当Hive以本地模式运行时存储临时文件的目录(Hive-0.10.0版本开始)。 | /tmp/<user.name> |
hive.exec.submitviachild | 以非本地模式运行时map/reduce作业是否提交给独立的JVM。 | false – 默认情况下作业被提交给与编译器相同的JVM。 |
hive.exec.script.maxerrsize | 通过TRANSFORM、Map或者Reduce调用用户脚本时允许的最大序列化错误数。 | 100000 |
hive.exec.compress.output | 查询中最终Map/Reduce作业的输出是否进行压缩。 | false |
hive.exec.compress.intermediate | 在某次查询中,中间Map/Reduce作业的输出是否被压缩。 | false |
hive.jar.path | hive-cli-<version>.jar的路径,该jar文件当在独立的JVM提交作业到时被使用。 |
|
hive.aux.jars.path | 包含用户自定义函数和serdes 实现的jar文件的路径。 |
|
hive.map.aggr | Map是否进行聚集。 | true |
hive.join.emit.interval | 在执行联接之前Hive可以在最右边的联接操作符中缓存多少行。 | 1000 |
hive.map.aggr.hash.percentmemory | Map端聚集哈希表时所占用的内存比例。 | (float)0.5 |
hive.default.fileformat | CREATE TABLE语句的默认文件格式,可选值为TextFile, SequenceFile, RCFile, and Orc。 | TextFile |
hive.merge.mapfiles | 在只有map的作业执行完毕时是否合并小的文件。 | true |
hive.merge.mapredfiles | Map-reduce作业执行完毕时是否合并小的文件。 | false |
hive.merge.size.per.task | 作业结束时合并文件的大小。 | 256000000 |
hive.merge.smallfiles.avgsize | 当作业输出文件的平均大小小于该值时,Hive将会启动额外的map-reduce作业合并输出文件为较大的文件。对于只执行map的作业仅当hive.merge.mapfiles为true时该值有效,对于map-reduce作业仅当hive.merge.mapredfiles 为true时有效。 | 16000000 |
hive.querylog.enable.plan.progress | 每次检查作业的进度时是否记录计划的进度到日志中。这些日志保存在hive.querylog.location指定的位置(Hive-0.10版本开始)。 | true |
hive.querylog.location | 结构化的Hive查询日志被创建的目录。在该目录中,每个会话有相应的文件。如果该参数被设置为空字符串,结构化日志将不会被创建。 | /tmp/<user.name> |
hive.querylog.plan.progress.interval | 记录计划执行进度的时间间隔,单位是毫秒。如果map或者reduce的进度有整数百分比的变化,则不考虑该值而该进度被记入日志。 | 60000 |
hive.stats.autogather | 在INSERT OVERWRITE命令执行时是否自动收集统计信息的标记。 | true |
hive.stats.dbclass | 存储临时Hive统计信息的方式。可选的值有fs、hbase、counter、custom和jdbc:.*。 | fs |
hive.stats.dbconnectionstring | 存储临时Hive统计信息的数据库的默认连接字符串。 | jdbc:derby:;databaseName=TempStatsStore;create=true |
hive.stats.jdbcdriver | 存储临时Hive统计信息的数据库JDBC驱动程序。 | org.apache.derby.jdbc.EmbeddedDriver |
hive.stats.reliable | 由于统计信息不能完整准确地收集完成查询是否失败。如果该值为true,在统计信息不能完整准确地收集完的情况下,从分区读写可能失败。 | false |
hive.enforce.bucketing | 如果为true,插入数据到表中时,执行分组。 | false |
hive.variable.substitute | Hive语句中的置换参数,此前使用set命令,系统变量或者环境变量设置(Hive-0.7.0开始)。 | true |
hive.variable.substitute.depth | 置换引擎将要替换的最大数量。 | 40 |
hive.vectorized.execution.enabled | 控制是否启用查询执行的向量模式。(Hive-0.13.0版本开始) | false |
Hive元存储(Metastore)管理参数将会在后面学习,下面是与Hadoop交互的管理参数。
参数名 | 描述 | 默认值 |
hadoop.bin.path | Hadoop脚本的位置,该脚本在使用独立的JVM提交查询时被用来提交作业到hadoop。 | $HADOOP_HOME/bin/hadoop |
hadoop.config.dir | Hadoop配置管理目录的位置。 | $HADOOP_HOME/conf |
fs.default.name |
| file:/// |
map.input.file |
| null |
mapred.job.tracker | JobTracker的url路径。如果该值为local,map/reduce以本地模式运行。 | local |
mapred.reduce.tasks | 查询计划中每个map/reduce阶段reducer的数量。 | 1 |
mapred.job.name | map/reduce作业的名称。 | null |
最后是用于传递运行时信息的参数,如下面的表格所示:
参数名 | 描述 | 默认值 |
hive.session.id | Hive会话ID。 |
|
hive.query.string | 传递给map/reduce作业的查询字符串。 |
|
hive.query.planid | map/reduce阶段的计划ID。 |
|
hive.jobname.length | 作业名称的最大长度。 | 50 |
hive.table.name | Hive表名称。该值通过脚本操作符传递给用户脚本。 |
|
hive.partition.name | Hive分区名称。该值通过脚本操作符传递给用户脚本。 | |
hive.alias | 正在处理的别名。该值通过脚本操作符传递给用户脚本。 |
Hive还有大量的参数用于各种用途,可以参考HiveConf.java和hive-default.xml.template,而要想正确理解其含义就需要动手实践,并在必要时阅读源代码。