轉載 https://blog.csdn.net/Dax1n/article/details/80822755
1 、hivevar與hiveconf的區別:
命名空間 使用權限 詳細描述
hivevar rw 用戶自定義變量
hiveconf rw hive相關配置屬性
system rw java定義的配置屬性
env r Shell環境屬性
通常我們可以使用hive -e查看有關hivevar與hiveconf的描述:

其中--define與hivevar定義變量是一致的。
2、hivevar與hiveconf的作用域
之前項目中涉及兩個hive作業同時執行並需要傳入相同key的參數,因此顧慮不清楚是否是線程安全。結論先行:hivevar與hiveconf作用域都是會話級別的,言外之意就是如果兩個並發同時跑的作業同時傳入一個相同key但是value不相同的值的參數,不會發生線程安全問題。
接下來說明一下驗證方案:
開啟兩個終端會話,在兩個終端下執行如何兩個命令:
A終端會話先啟動,並執行如下命令:
hive --hiveconf first_name=daxin666 --hivevar first_name=daxin777
B終端會話在A會話之后啟動,並執行如下命令:
hive --hiveconf first_name=daxin666888 --hivevar first_name=daxin777888
之后查看A終端的變量值,你會發現並沒有被B覆蓋。所以是線程安全的,雖然沒有翻閱源碼,但是通過分析hive的執行過程依然可以明白為什么是線程安全的,因為hive是一個客戶端工具,hive不需要分布式部署,因此也沒有全局會話,hive只是作為一個翻譯工具存在,將hive sql轉化為mapreduce任務的客戶端,每一次啟動一個hive都是單獨啟動一個進程,因而各個進程之間是相互獨立的,不存在共享變量,所以不會存在線程安全問題。
3、對於hivevar與hiveconf的使用
hiveconf變量取值必須要使用hiveconf作為前綴參數,具體格式如下:
${hiveconf:key}
但是對於hivevar取值可以不使用前綴hivevar,具體格式如下:
使用前綴:
${hivevar:key}
不使用前綴:
${key}
使用示例如下圖:

