一個hive任務,如何才算是優化的任務,hadoop job config里哪些配置能影響hive的效率。看看hive的詳細配置我們可以略知一二。
hive的配置:
hive.ddl.output.format:hive的ddl語句的輸出格式,默認是text,純文本,還有json格式,這個是0.90以后才出的新配置;
hive.exec.script.wrapper:hive調用腳本時的包裝器,默認是null,如果設置為python的話,那么在做腳本調用操作時語句會變為python <script command>,null的話就是直接執行<script command>;
hive.exec.plan:hive執行計劃的文件路徑,默認是null,會在運行時自動設置,形如hdfs://xxxx/xxx/xx;
hive.exec.scratchdir:hive用來存儲不同階段的map/reduce的執行計劃的目錄,同時也存儲中間輸出結果,默認是/tmp/<user.name>/hive,我們實際一般會按組區分,然后組內自建一個tmp目錄存儲;
hive.exec.submitviachild:在非local模式下,決定hive是否要在獨立的jvm中執行map/reduce;默認是false,也就是說默認map/reduce的作業是在hive的jvm上去提交的;
hive.exec.script.maxerrsize:當用戶調用transform或者map或者reduce執行腳本時,最大的序列化錯誤數,默認100000,一般也不用修改;
hive.exec.compress.output:一個查詢的最后一個map/reduce任務輸出是否被壓縮的標志,默認為false,但是一般會開啟為true,好處的話,根據這篇文章,節省空間不說,在不考慮cpu壓力的時候會提高io;
hive.exec.compress.intermediate:類似上個,在一個查詢的中間的map/reduce任務輸出是否要被壓縮,默認false,但一般也會手動開啟,這篇文章對比了這兩個配置,其中回復講到,The former affects compression between MapReduce stages in a Hive query. The latter affects compression between map and reduce phases during the shuffle. 如此而已;
hive.jar.path:當使用獨立的jvm提交作業時,hive_cli.jar所在的位置,無默認值;
hive.aux.jars.path:當用戶自定義了UDF或者SerDe,這些插件的jar都要放到這個目錄下,無默認值;
hive.partition.pruning:在編譯器發現一個query語句中使用分區表然而未提供任何分區謂詞做查詢時,拋出一個錯誤從而保護分區表,默認是nonstrict;(待讀源碼后細化,網上資料極少)
hive.map.aggr:map端聚合是否開啟,默認開啟;這篇文章給出了map端聚合的很詳細的描述;
hive.join.emit.interval:在發出join結果之前對join最右操作緩存多少行的設定,默認1000;hive jira里有個對該值設置太小的bugfix;
hive.map.aggr.hash.percentmemory:map端聚合時hash表所占用的內存比例,默認0.5,這個在map端聚合開啟后使用,參看hive.map.aggr里提到的文章;
hive.default.fileformat:CREATE TABLE語句的默認文件格式,默認TextFile,其他可選的有SequenceFile、RCFile還有Orc;對于文件格式的說明對比,這里有篇對比可以參考,infoq上有篇文章講了hadoop的文件格式;
hive.merge.mapfiles:在只有map的作業結束時合并小文件,默認開啟true;
hive.merge.mapredfiles:在一個map/reduce作業結束后合并小文件,默認不開啟false;
hive.merge.size.per.task:作業結束時合并文件的大小,默認256MB;
hive.merge.smallfiles.avgsize:在作業輸出文件小于該值時,起一個額外的map/reduce作業將小文件合并為大文件,小文件的基本閾值,設置大點可以減少小文件個數,需要mapfiles和mapredfiles為true,默認值是16MB;