一、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 命令修改目录权限,允许任务用户提交任务时都能在该目录下创建对应目录。
【参考资料】