當前位置:首頁 » 網頁前端 » hive腳本設置參數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

hive腳本設置參數

發布時間: 2022-08-11 19:09:34

⑴ hive動態分區參數配置 利用sql怎麼設置

靜態分區SP(static partition)
動態分區DP(dynamic partition)
靜態分區與動態分區的主要區別在於靜態分區是手動指定,而動態分區是通過數據來進行判斷。詳細來說,靜態分區的列實在編譯時期,通過用戶傳遞來決定的;動態分區只有在SQL執行時才能決定。

二)實戰演示如何在Hive中使用動態分區
1、創建一張分區表,包含兩個分區dt和ht表示日期和小時
[sql] view plain
CREATE TABLE partition_table001
(
name STRING,
ip STRING
)
PARTITIONED BY (dt STRING, ht STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
2、啟用hive動態分區,只需要在hive會話中設置兩個參數:

⑵ hive執行作業時rece任務個數設置為多少合適

recer個數的設定極大影響執行效率 1. hive.exec.recers.bytes.per.recer(默認為1000^3) 2. hive.exec.recers.max(默認為999) 計算recer數的公式很簡單: N=min(參數2,總輸入數據量/參數1) 通常情況下,有必要手動指定recer個數。考慮到map階段的輸出數據量通常會比輸入有大幅減少,因此即使不設定recer個數,重設參數2還是必要的。依據Hadoop的經驗,可以將參數2設定為0.95*(集群中TaskTracker個數)。 正確的rece任務的 個數應該是 0.95或者1.75 ×(節點數 ×mapred.tasktracker.tasks.maximum參數值)

⑶ 如何進行Hive debug

本文主要總結我在使用HQL執行Query類操作時用到的DEBUG方法,主要有這么幾板斧:
打開hive DEBUG日誌
explain
查看plan.xml
使用IDE遠程Debug
下面一一簡單說明下方法,例子先不舉了,一時手頭沒特合適的CASE。
打開hive DEBUG日誌
這個比較基本,也很容易操作。出問題時先打開,興許有些有用的信息。另外我們自己的UDF或SerDe里也可以輸出些DEBUG日誌,方便定位問題:
hive -hiveconf hive.root.logger=DEBUG,console

explain
即在HQL前加上EXPLAIN,比如
EXPLAIN SELECT * FROM ...

不過這個在查錯誤的時候用處不大,我還沒用它定位到什麼BUG。不過在查一些性能問題,或者查看下hive到MR任務的執行過程時會用得著
查看plan.xml
先得說下hive的執行過程。大體上是這樣的:
hive 客戶端(一般是hive cli,入口類為CliDriver)把HQL翻譯成MR執行計劃(Operator樹)並序列化到 plan.xml
plan.xml 上傳到hdfs上
hive 客戶端新起一進程,提交MapRece程序,其入口類為ExecDriver,ExecDriver的Mapper會在setup階段讀取plan.xml,反序列化成Operator樹結構,然後執行。
所以plan.xml精確的描述了MR程序具體的執行過程,而且xml文件層次清楚,比explain輸出更豐富的信息,也很易讀。MR執行計劃很少出問題,但我們可以藉助plan.xml排除一些懷疑會出問題的點,比如確認是翻譯階段的問題,還是MR執行階段的問題。
曾經有一次定位UDF使用的BUG,最開始懷疑是hive生成MR執行計劃出錯了,但通過查看plan.xml,我們確認翻譯階段沒問題。進而開始使用終極手段來看問題:IDE遠程DEBUG,單步跟蹤,這個我們稍後說。
查看plan.xml的方法,有點trick。HIVE cli在生成 plan.xml時,會列印日誌:
Generating plan file <some_temp_dir>/plan.xml

但hive 任務執行完畢時,會把它刪掉。所以你得手快,或者想辦法讓hql跑的時間長點,比如sleep一下之類。如果有什麼參數可以讓hive不刪plan文件,留言給我, 先行謝過。
使用IDE遠程DEBUG
之所以說是終極手段,有兩個意思:
如果上面的幾個手段都定位不到問題,這個八成能幫你找到問題,反正我屢試不爽
用起來著實得費些力氣:
首先,最好能用hive本地模式復現BUG
否則還得找到具體執行此任務的Hadoop節點IP,更麻煩了。 啟用本地模式的方法是:
# hadoop0.20
SET mapred.job.tracker=local;

# hadoop 1及以上版本
set maprece.framework.name=local;

有一個參數容易混淆:
SET hive.exec.mode.local.auto=false;

這實際上是hive的一個優化,即在hive認為合適的時候,自動啟用local模式以更快的計算(數據量比較小的時候有用)。所以設置此參數,不一定會以local模式運行。
為JVM 添加遠程調試參數
參數比較簡單,很多文章里都有介紹(不過我覺得IBM這篇最好):
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8765

suspend=y 是為了讓我們有機會把IDE attach到被調試進程上,否則又是個拼手快的活兒了。
麻煩之處在於,從啟動hive到運行MR程序過程中,需要啟動兩個JVM(也有隻啟動一個的情況,稍後再說):
hive cli需要一個JVM,入口類CliDriver
提MR程序需要一個JVM,入口類ExecDriver
一般我們希望調試MR階段的代碼,所以我們需要保證在啟動第一個JVM時,不監聽調試埠,只在第二個JVM上加上述參數。或者至少兩階段使用不同的埠,否則第二個JVM埠沖突就無法啟動了。
hive啟動CliDriver和ExecDriver都通過 『hadoop jar』來啟動。所以添加JVM參數可以通過HADOOP_CLIENT_OPTS環境變數添加, 但是, 直接export HADOOP_CLIENT_OPTS 是不行的,因為hive在 調用hadoop jar之前,要調用hadoop version 來確定版本,HADOOP_CLIENT_OPTS對hadoop version同樣生效,所以只能改hadoop啟動腳本了,通常是/usr/lib/hadoop/bin/hadoop,要在這段代碼附件設置:
...
elif [ "$COMMAND" = "jar" ] ; then
# 這里添加 HADOOP_CLIENT_OPTS
HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8765"
CLASS=org.apache.hadoop.util.RunJar
elif [ "$COMMAND" = "checknative" ] ; then
...

還不夠,需要區分JVM1 和JVM2的參數,hive提供了三個變數設置(看代碼糾出來的,官方文檔還沒介紹):
HIVE_DEBUG_RECURSIVE: 告訴hive要把 HADOOP_CLIENT_OPTS 變數傳給子JVM
HIVE_MAIN_CLIENT_DEBUG_OPTS和HIVE_CHILD_CLIENT_DEBUG_OPTS:hive在將HADOOP_CLIENT_OPTS傳給子JVM時,會把 HADOOP_CLIENT_OPTS中HIVE_MAIN_CLIENT_DEBUG_OPTS的值的部分,替換成HIVE_CHILD_CLIENT_DEBUG_OPTS的值(好繞啊)
所以最終的代碼應該是:
...
elif [ "$COMMAND" = "jar" ] ; then
if ! echo "$HADOOP_CLIENT_OPTS"|fgrep 'dt_socket' ; then
HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8765"
fi
HIVE_DEBUG_RECURSIVE=y
HIVE_MAIN_CLIENT_DEBUG_OPTS="suspend=n,address=8765"
HIVE_CHILD_CLIENT_DEBUG_OPTS="suspend=y,address=8766"
export HADOOP_CLIENT_OPTS HIVE_CHILD_CLIENT_DEBUG_OPTS HIVE_DEBUG_RECURSIVE HIVE_MAIN_CLIENT_DEBUG_OPTS
CLASS=org.apache.hadoop.util.RunJar
elif [ "$COMMAND" = "checknative" ] ; then
...

還有一種情況下hive做了優化,不需要提交MR任務,也就不用起第二個JVM:
SELECT * FROM ...

這時候attach到 8765埠就行,忽略HIVE_CHILD_CLIENT_DEBUG_OPTS

⑷ 如何提升hive腳本的map數

一、 控制hive任務中的map數:

1. 通常情況下,作業會通過input的目錄產生一個或者多個map任務。
主要的決定因素有: input的文件總個數,input的文件大小,集群設置的文件塊大小(目前為128M, 可在hive中通過set dfs.block.size;命令查看到,該參數不能自定義修改);

2. 舉例:
a) 假設input目錄下有1個文件a,大小為780M,那麼hadoop會將該文件a分隔成7個塊(6個128m的塊和1個12m的塊),從而產生7個map數
b) 假設input目錄下有3個文件a,b,c,大小分別為10m,20m,130m,那麼hadoop會分隔成4個塊(10m,20m,128m,2m),從而產生4個map數
即,如果文件大於塊大小(128m),那麼會拆分,如果小於塊大小,則把該文件當成一個塊。

⑸ hive里怎麼設置讓參數在hive運行時就啟用,或者說在哪配置默認設置

最簡單的辦法,放到hive-site.xml裡面

⑹ 鐳7在hiveos參數沒置

在設置一下參數就可以了。
在${HIVE_HOME}/conf/hive-site。xml文件中添加參數設置,需要注意:永久生效,所有的hive會話都會載入對應的配置。
在啟動hivecli時,通過--hiveconfkey=value的方式進行設置,例如:hive--hiveconfhive。cli。print。header=true,這需要注意只在當前會話有效,退出會話之後參數失效。