Hive参数配置方法

一、Hive参数配置方式

Hive中提供三种改变环境变量的方法,分别是:(1)修改 ${HIVE_HOME}/conf/hive-site.xml 配置文件;(2)命令行参数;(3)进入Hive客户端后手动设置。下面以修改‘hive.exec.scratchdir’参数为例具体介绍这三种方式。

假设Hive提交任务时需要修改map/reduce任务中间数据输出的HDFS路径(默认中间数据存储目录为 /tmp/hive/${user.name}/,假设我们修改目录为 /hive_tmp_1/${user.name} ),可以在两个位置修改 ‘hive.exec.scratchdir’ 参数来实现,在Cloudera Manager管理的Hadoop集群中,可以通过三种方式修改该配置:

1.1 Hive配置文件

在Hive中,所有的默认配置都在${HIVE_HOME}/conf/hive-site.xml文件中,如果需要对默认的配置进行修改,修改hive-site.xml文件即可,通过该配置可以对一些配置进行个性化设定。hive-site.xml文件的格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property>
    <name>hive.map.aggr</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.execution.engine</name>
    <value>mr</value>
  </property>
  <property>
    <name>hive.exec.scratchdir</name>
    <value>/hive_tmp_1/</value>
  </property>
</configuration>

如果Hadoop集群是用Cloudera Manager管理平台管理,则直接在页面修改对应配置即可。操作如下:进入Hive配置页面,修改Hive客户端配置,下发客户端配置即可生效。(使用CDH主要是要区别服务端配置和客户端配置的区别)

 1.2 Hive命令行参数

 通过Hive命令行修改参数,也有两种方式,一种是修改Hive客户端启动命令,另一种是启动Hive客户端时指定参数

(1)修改Hive客户端启动命令

这种修改方法针对所有会话和所有用户生效。通过 which hive查看hive命令启动目录,然后在Hive启动参数中添加 --hiveconf 参数配置 hive.exec.scratchdir 参数,这种修改方式修改后会立即生效。

具体配置如下:

# cat /usr/bin/hive
#!/bin/bash
  # Reference: http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
  SOURCE="${BASH_SOURCE[0]}"
  BIN_DIR="$( dirname "$SOURCE" )"
  while [ -h "$SOURCE" ]
  do
    SOURCE="$(readlink "$SOURCE")"
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
    BIN_DIR="$( cd -P "$( dirname "$SOURCE"  )" && pwd )"
  done
  BIN_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  LIB_DIR=$BIN_DIR/../lib

# Autodetect JAVA_HOME if not defined
. $LIB_DIR/bigtop-utils/bigtop-detect-javahome

BIGTOP_DEFAULTS_DIR=${BIGTOP_DEFAULTS_DIR-$BIN_DIR/../etc/default}
[ -n "${BIGTOP_DEFAULTS_DIR}" -a -r ${BIGTOP_DEFAULTS_DIR}/hbase ] && . ${BIGTOP_DEFAULTS_DIR}/hbase

export HIVE_HOME=$LIB_DIR/hive
exec $LIB_DIR/hive/bin/hive --hiveconf hive.exec.scratchdir=/hive_tmp_1 "$@"   # 指定Hive启动参数

这种方式针对当前会话和当前用户生效。在启动Hive客户端时通过 --hiveconfig 指定参数。

(2)启动Hive客户端时指定参数

hive --hiveconf hive.exec.scratchdir=/hive_tmp_1

1.3 进入Hive客户端手动设置 

这种方法和方法二的第(2)种方法类似,也是只对本次Hive客户端启动生效,下次启动时需重新配置。

hive> set hive.exec.scratchdir;
hive.exec.scratchdir=/tmp/hive     # 默认目录
hive> set hive.exec.scratchdir=/hive_tmp_1;  # 指定目录

遗憾的是,在实际操作中进入Hive客户端是手动设置 ‘set hive.exec.scratchdir’ 这个参数并不会生效,中间数据依然写到 /tmp/hive/kwang/ 目录下。说明这个参数在进入Hive后手动set,这一点和Hive的参数类型有关系,有些系统参数在启动Hive客户端后是不能手动设置的,只能通过前面两种方式来实现。(官方文档说是可行的,但实际操作却没生效,这一点后续还要再看看这个参数。官方文档:https://cwiki.apache.org/confluence/display/Hive/AdminManual+Configuration )

 二、实际场景操作

操作场景下账号是 kwang。

1、未修改中间数据存储目录时

在kwang账号下执行 hive -e "select count(1)" 命令,在HDFS目录下可以看到如下目录

# hadoop fs -ls /tmp/hive/kwang/
Found 1 items
drwx------   - kwang supergroup          0 2020-02-24 16:29 /tmp/hive/kwang/bdda0673-214d-4838-b403-29656c139671

可以看到在HDFS目录上会创建我们配置的hive.exec.scratchdir目录,并且Hive任务的中间数据都会存储在新目录,如下:2、修改中间数据存储目录后

$ hadoop fs -ls /hive_tmp_1/kwang/
Found 1 items
drwx------   - kwang supergroup          0 2020-02-24 16:35 /hive_tmp_1/kwang/976bafb8-cb49-40cb-910d-3dbacd41a328

注意:如果HDFS有启用ACL管控时,需要手动创建 /hive_tmp_1/目录,并通过hadoop fs -chmod 777 /hive_tmp_1 命令修改目录权限,允许任务用户提交任务时都能在该目录下创建对应目录。

【参考资料】

原文地址:https://www.cnblogs.com/lemonu/p/12368401.html