一、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 命令修改目錄權限,允許任務用戶提交任務時都能在該目錄下創建對應目錄。
【參考資料】