1. 程式人生 > >hive引數調優彙總

hive引數調優彙總

參考:http://blog.csdn.net/beckham008/article/details/23741151?utm_source=tuicool&utm_medium=referral

1.設定合理solt數

mapred.tasktracker.map.tasks.maximum  每個tasktracker可同時執行的最大map task數,預設值2。 mapred.tasktracker.reduce.tasks.maximum 每個tasktracker可同時執行的最大reduce task數,預設值1。 2.配置磁碟塊 mapred.local.dir map task中間結果寫本地磁碟路徑,預設值${hadoop.tmp.dir}/mapred/local。 可配置多塊磁碟緩解寫壓力。當存在多個可以磁碟時,Hadoop將採用輪詢方式將不同的map task中間結果寫到磁碟上。 3.配置RPC Handler數 mapred.job.tracker.handler.count
jobtracker可併發處理來自tasktracker的RPC請求數,預設值10。 4.配置HTTP執行緒數 tasktracker.http.threads HTTP伺服器的工作執行緒數,用於獲取map task的輸出結果,預設值40。 5.啟用批排程 6.選擇合適的壓縮演算法 Job輸出結果是否壓縮 mapred.output.compress  是否壓縮,預設值false。 mapred.output.compression.type 壓縮型別,有NONE, RECORD和BLOCK,預設值RECORD。 mapred.output.compression.codec
壓縮演算法,預設值org.apache.hadoop.io.compress.DefaultCodec。 map task輸出是否壓縮 mapred.compress.map.output 是否壓縮,預設值false mapred.map.output.compression.codec 壓縮演算法,預設值org.apache.hadoop.io.compress.DefaultCodec。 7.設定失敗容忍度 mapred.max.map.failures.percent 例如:set mapred.max.map.failures.percent=30; 
作業最多允許失敗的map task比例,預設值0。 mapred.max.reduce.failures.percent
作業最多允許失敗的reduce task比例,預設值0。 mapred.map.max.attempts 一個map task的最多重試次數,預設值4。 mapred.reduce.max.attempts 一個reduce task的最多重試次數,預設值4。 8.設定跳過壞記錄 mapred.skip.attempts.to.start.skipping 當任務失敗次數達到該值時,啟用跳過壞記錄功能,預設值2。 mapred.skip.out.dir 檢測出的壞記錄存放目錄,預設值為輸出目錄的_logs/skip,設定為none表示不輸出。 mapred.skip.map.max.skip.records map task最多允許的跳過記錄數,預設值0。 mapred.skip.reduce.max.skip.groups reduce task最多允許的跳過記錄數,預設值0。 9.配置jvm重用 mapred.job.reuse.jvm.num.tasks  一個jvm可連續啟動多個同類型任務,預設值1,若為-1表示不受限制。 10.配置jvm引數 mapred.child.java.opts 任務啟動的jvm引數,預設值-Xmx200m,建議值-XX:-UseGCOverheadLimit -Xms512m -Xmx2048m -verbose:gc -Xloggc:/tmp/@[email protected] 11. map task調優 io.sort.mb 預設值100M io.sort.record.percent 預設值0.05 io.sort.spill.percent 預設值0.80 12.reduce task調優 io.sort.factor 預設值10 mapred.reduce.parallel.copies 預設值5 =================================================================================   1.設定任務名稱,方便查詢監控    SET mapred.job.name=P_DWA_D_IA_S_USER_PROD;    2.決定是否可以在 Map 端進行聚合操作    set hive.map.aggr=true;    3.有資料傾斜的時候進行負載均衡    set hive.groupby.skewindata=true;    HiveQL 去重操作    和SQL一樣,HiveQL中同樣支援DISTINCT操作,如下示例:    (1) SELECT count(DISTINCT uid) FROM log    (2) SELECT ip, count(DISTINCT uid) FROM log GROUP BY ip    (3) SELECT ip, count(DISTINCT uid, uname) FROMlog GROUP BY ip    (4) SELECT ip, count(DISTINCTuid), count(DISTINCT uname) FROMlog GROUP BY ip    當我們使用Hive QL中的去重關鍵字DISTINCT時,需要注意的一點是:    在多個列上進行的去重操作與hive環境變數hive.groupby.skewindata存在關係。    當hive.groupby.skewindata=true時,hive不支援多列上的去重操作,並報錯:    Error in semantic analysis: DISTINCT on different columns notsupported with skew in data.     注意:上面示例中的(3)不屬於多列上的DISTINCT操作。    Group By 語句 
  • Map 端部分聚合:
  • 並不是所有的聚合操作都需要在 Reduce 端完成,很多聚合操作都可以先在 Map 端進行部分聚合,最後在 Reduce端得出最終結果。
  • 基於 Hash
  • 引數包括:
  • hive.map.aggr = true 是否在 Map 端進行聚合,預設為True
  • hive.groupby.mapaggr.checkinterval =100000 在 Map 端進行聚合操作的條目數目
  • 有資料傾斜的時候進行負載均衡
  • hive.groupby.skewindata = false
  • 當選項設定為 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果集合會隨機分佈到Reduce 中,每個 Reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 Group By Key有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的資料結果按照 Group ByKey 分佈到 Reduce 中(這個過程可以保證相同的 Group By Key 被分佈到同一個 Reduce中),最後完成最終的聚合操作。
  4.每個MapReduce作業的任務可以申請的記憶體資源數量    SET mapreduce.map.memory.mb=2048;    每個MapReduce作業的map任務可以申請的記憶體資源數量    SET mapreduce.reduce.memory.mb=8192;    每個MapReduce作業的reduce任務可以申請的記憶體資源數量   5.對於簡單的不需要聚合的類似SELECT <col> from <table> LIMIT n語句,不需要起MapReduce job,直接通過Fetch task獲取資料 set hive.fetch.task.conversion=more; 合併小檔案 6. hive.merge.mapredfiles(預設為false) 正常的map-reduce job後,是否啟動merge job來合併reduce端輸出的結果,建議開啟 set mapred.max.split.size=524288000; set mapred.min.split.size.per.node=471859200; set mapred.min.split.size.per.rack=471859200; set hive.hadoop.supports.splittable.combineinputformat=true;      set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  注:第四個引數存在其他引數才能生效 7.設定引數不走map-reduce set hive.fetch.task.conversion=more; 8.hive動態分割槽引數設定 ive.exec.dynamic.partition=true 預設值:false 描述:是否允許動態分割槽 hive.exec.dynamic.partition.mode=nonstrict 預設值:strict 描述:strict是避免全分割槽欄位是動態的,必須有至少一個分割槽欄位是指定有值的 設定如下引數配置動態分割槽的使用環境: hive.exec.max.dynamic.partitions.pernode=100 預設值:100 描述:each mapper or reducer可以建立的最大動態分割槽數 hive.exec.max.dynamic.partitions=1000 預設值:1000 描述:一個DML操作可以建立的最大動態分割槽數 hive.exec.max.created.files=100000 預設值:100000 描述:一個DML操作可以建立的檔案數   ============================================================================================================= hive.exec.reducers.bytes.per.reducer •預設值: 1000000000 (1G) •說明:每個reduce的接受的資料量     如果送到reduce的資料為10G,那麼將生成10個reduce任務 hive.exec.reducers.max •預設值:999 •說明: reduce的最大個數  hive.cli.print.header •目前值:fasle •說明:可以控制在處理中是否顯示錶列名(就是查詢結果) mapred.reduce.tasks •預設值:-1 •說明:每個任務reduce的預設值  -1 代表自動根據作業的情況來設定reduce的值  hive.cli.print.current.db •預設值:false •說明:開啟這個屬性可以再CLI提示符前打印出當前所在的資料庫名 hive.cli.prompt •預設值:hive •說明:應該就是設定“hive”為啟動cli 的命令 hive.cli.pretty.output.num.cols •預設值:-1 •說明:根據百度翻譯,意思應該是根據表的列數,和你終端的寬度,自動設定你資料展現的格式。 hive.exec.scratchdir •叢集值:/tmp/hive-${user.name} •說明:HDFS路徑,用於儲存不同 map/reduce 階段的執行計劃和這些階段的中間輸出結果。 hive.exec.local.scratchdir •叢集值:/tmp/${user.name} •說明:Hive 預設的資料檔案儲存路徑,通常為 HDFS 可寫的路徑。 hive.test.mode •預設值:false •說明:是否以測試模式執行 Hive hive.test.mode.prefix •預設值:test_ •說明: Hive 測試模式的字首。 hive.test.mode.samplefreq •預設值:32 •說明:Hive 測試模式取樣的頻率,即每秒鐘取樣的次數。 hive.test.mode.nosamplelist •說明:Hive 測試模式取樣的排除列表,以逗號分隔。 hive.metastore.uris •說明:Hive 元資料的 URI,多個 thrift://地址,以英文逗號分隔。  javax.jdo.option.ConnectionURL •叢集值:jdbc:derby:;databaseName=metastore_db;create=true •說明: 元資料庫的連線 URL。  javax.jdo.option.DetachAllOnCommit •說明:事務提交後detach所有提交的物件,預設是true; javax.jdo.option.NonTransactionalRead •說明:是否允許非事務的讀,預設是true; javax.jdo.option.ConnectionUserName:username,預設APP; javax.jdo.option.ConnectionPassword:password,預設mine; javax.jdo.option.Multithreaded:是否支援併發訪問metastore,預設是true; datanucleus.connectionPoolingType:使用連線池來訪問JDBC metastore,預設是DBCP; datanucleus.validateTables:檢查是否存在表的schema,預設是false; datanucleus.validateColumns:檢查是否存在列的schema,預設false; datanucleus.validateConstraints:檢查是否存在constraint的schema,預設false; datanucleus.stroeManagerType:元資料儲存型別,預設rdbms; datanucleus.autoCreateSchema:在不存在時是否自動建立必要的schema,預設是true; datanucleus.aotuStartMechanismMode:如果元資料表不正確,丟擲異常,預設是checked; datanucleus.transactionIsolation:預設的事務隔離級別,預設是read-committed; datanucleus.cache.level2:使用二級快取,預設是false; datanucleus.cache.level2.type:二級快取的型別,有兩種,SOFT:軟引用,WEAK:弱引用,預設是SOFT; datanucleus.identifierFactory:id工廠生產表和列名的名字,預設是datanucleus; datanucleus.plugin.pluginRegistryBundleCheck:當plugin被發現並且重複時的行為,預設是LOG; hive.metastroe.warehouse.dir •說明:資料倉庫的位置,預設是/user/hive/warehouse; hive.metastore.execute.setugi:非安全模式,設定為true會令metastore以客戶端的使用者和組許可權執行DFS操作,預設是false,這個屬性需要服務端和客戶端同時設定; hive.metastore.event.listeners:metastore的事件監聽器列表,逗號隔開,預設是空; hive.metastore.partition.inherit.table.properties:當新建分割槽時自動繼承的key列表,預設是空; hive.metastore.end.function.listeners:metastore函式執行結束時的監聽器列表,預設是空; hive.metadata.move.exported.metadata.to.trash 說明:猜測,預設值是空。應該是垃圾站,如果垃圾站被清,元資料都會被清掉。 hive.metastore.partition.name.whitelist.pattern 說明:猜測,預設值是空。應該是如果設定了規則,分割槽名稱將會按照你的正則規則去匹配。不匹配會被拒絕建立。 hive.metastore.disallow.incompatible.col.type.change 說明: 額,叢集值是空。描述中大概意思是,如果開啟(預設false)則更改表字段的型別到一個不相容的新型別是不允許的。RCFile預設SerDe(columnarserde)序列化的值在這樣一種方式下資料型別可以轉換成字串的任何型別。地圖也是序列化為一個字串,它可以作為一個字串讀取。然而,任何二進位制序列化,都是不行的。當ALTER TABLE嘗試訪問舊分割槽是會被阻止的。更多細節見hive-4409。 原始的型別,如int,string,bigint,等相互相容,不阻止。 好吧。。。只能翻譯成這樣了。。。 hive.metastore.end.function.listeners:metastore函式執行結束時的監聽器列表,預設是空; hive.metastore.event.expiry.duration:事件表中事件的過期時間,預設是0; hive.metastore.event.clean.freq:metastore中清理過期事件的定時器的執行週期,預設是0; hive.metastore.connect.retries:建立metastore連線時的重試次數,預設是5; hive.metastore.failure.retries:建立metastore連線時的失敗重試次數,預設是3; hive.metastore.client.connect.retry.delay:客戶端在連續的重試連線等待的時間,預設1; hive.metastore.client.socket.timeout:客戶端socket超時時間,預設20秒; hive.metastore.rawstore.impl:原始metastore的儲存實現類,預設是org.apache.hadoop.hive.metastore.ObjectStore; hive.metastore.batch.retrieve.max:在一個batch獲取中,能從metastore裡取出的最大記錄數,預設是300,叢集設定值是1000; hive.default.fileformat •說明:Hive 預設的輸出檔案格式,與建立表時所指定的相同,可選項為 'TextFile' (預設)、 'SequenceFile' 或者 'RCFile'。  hive.default.rcfile.serde:hive預設的RCFILE SerDe格式  預設:org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe; hive.fileformat.check :Hive 是否檢查輸出的檔案格式。預設true; hive.map.aggr  •說明: 決定是否可以在 Map 端進行聚合操作,預設true; hive.groupby.skewindata  •說明:  決定 group by 操作是否支援傾斜的資料。預設是false; hive.optimize.multigroupby.common.distincts •說明:這個應該是如果一張表的查詢用到相同的distinct欄位,可以寫成如下格式:       from src         insert overwrite table dest1 select col1, count(distinct colx) group by col1         insert overwrite table dest2 select col2, count(distinct colx) group by col2; 也就是相當於一表查詢,多表插入那種吧。預設是true  hive.groupby.mapaggr.checkinterval   •說明:對於 Group By 操作的 Map 聚合的檢測時間,以毫秒為單位。預設100000 hive.mapred.local.mem   •說明: Mapper/Reducer 在本地模式的最大記憶體量,以位元組為單位,0為不限制。 預設0。 hive.mapjoin.followby.map.aggr.hash.percentmemory:map端聚合時hash表的記憶體佔比,該設定約束group by在map join後進行,否則使用hive.map.aggr.hash.percentmemory來確認記憶體佔比,預設值0.3; hive.map.aggr.hash.force.flush.memeory.threshold:map端聚合時hash表的最大可用記憶體,如果超過該值則進行flush資料,預設是0.9; hive.map.aggr.hash.percentmemory:map端聚合時hash表所佔用的記憶體比例,預設0.5,這個在map端聚合開啟後使用。 hive.session.history.enabled 設定為true,則會初始化日誌檔案,預設為false; hive.map.aggr.hash.min.reduction  Hive Map 端聚合的哈稀儲存的最小 reduce 比例。預設0.5; hive.optimize.index.filter:自動使用索引,預設不開啟false; hive.optimize.index.groupby:是否使用聚集索引優化group-by查詢,預設關閉false; hive.optimize.ppd:是否支援謂詞下推,預設開啟;所謂謂詞下推,將外層查詢塊的 WHERE 子句中的謂詞移入所包含的較低層查詢塊(例如檢視),從而能夠提早進行資料過濾以及有可能更好地利用索引。 hive.optimize.ppd.storage:謂詞下推開啟時,謂詞是否下推到儲存handler,預設開啟,在謂詞下推關閉時不起作用; hive.ppd.recognizetransivity:在等值join條件下是否產地重複的謂詞過濾器,預設開啟; hive.optimize.groupby:在做分割槽和表查詢時是否做分桶group by,預設開啟true; hive.optimize.skewjoin.compiletime:預設false ,這個,真沒看懂百度翻譯。。。。 hive.optimize.union.remove:預設false ,這個,沒看懂百度翻譯。。。。 hive.mapred.supports.subdirectories:預設false ,哎。。同上 hive.multigroupby.singlemr:將多個group by產出為一個單一map/reduce任務計劃,當然約束前提是group by有相同的key,預設是false; hive.map.groupby.sorted:預設false ,看不懂。。 hive.map.groupby.sorted.testmode:預設false ,看不懂。。 hive.new.job.grouping.set.cardinality:預設30,看不懂。。 hive.join.emit.interval:在發出join結果之前對join最右操作快取多少行的設定,預設1000;hive jira裡有個對該值設定太小的bugfix; hive.join.cache.size:在做表join時快取在記憶體中的行數,預設25000; hive.smbjoin.cache.rows:在做表smb (smb不知道是啥,Sort-Merge-Bucket) join時快取在記憶體中的行數,預設10000 hive.optimize.skewjoin: •說明:是否開啟資料傾斜的join優化,預設不開啟false; hive.skewjoin.key: •說明:判斷資料傾斜的閾值,如果在join中發現同樣的key超過該值則認為是該key是傾斜的join key,預設是100000; hive.skewjoin.mapjoin.map.tasks: •說明:在資料傾斜join時map join的map數控制,預設是10000; hive.skewjoin.mapjoin.min.split: •說明:資料傾斜join時map join的map任務的最小split大小,預設是33554432,該引數要結合上面的引數共同使用來進行細粒度的控制; hive.mapred.mode: •說明:hive操作執行時的模式,預設是nonstrict非嚴格模式,如果是strict模式,很多有風險的查詢會被禁止執行,比如笛卡爾積的join和動態分割槽; hive.enforce.bucketmapjoin:預設false,應該是跟桶有關的join設定; hive.exec.script.maxerrsize:當用戶呼叫transform或者map或者reduce執行指令碼時,最大的序列化錯誤數,預設100000,一般也不用修改; hive.exec.script.allow.partial.consumption:hive是否允許指令碼不從標準輸入中讀取任何內容就成功退出,預設關閉false; hive.script.operator.id.env.var:在使用者使用transform函式做自定義map/reduce時,儲存唯一的指令碼標識的環境變數的名字,預設HIVE_SCRIPT_OPERATOR_ID; hive.script.operator.truncate.env:預設false,知道幹啥的。 hive.exec.compress.output: •說明:一個查詢的最後一個map/reduce任務輸出是否被壓縮的標誌,預設為false,但是一般會開啟為true,好處的話,節省空間不說,在不考慮cpu壓力的時候會提高io; hive.exec.compress.intermediate: •說明:類似上個,在一個查詢的中間的map/reduce任務輸出是否要被壓縮,預設false; hive.exec.parallel: •說明:hive的執行job是否並行執行,預設不開啟false,在很多操作如join時,子查詢之間並無關聯可獨立執行,這種情況下開啟並行運算可以大大加速; hive.exec.parallel.thread.number: •說明:在並行執行時的最大job數,預設是 8; hive.exec.rowoffset:是否提供行偏移量的虛擬列,預設是false不提供,Hive有兩個虛擬列:一個是INPUT__FILE__NAME,表示輸入檔案的路徑,另外一個是BLOCK__OFFSET__INSIDE__FILE,表示記錄在檔案中的塊偏移量,這對排查出現不符合預期或者null結果的查詢是很有幫助的; hive.task.progress:控制hive是否在執行過程中週期性的更新任務進度計數器,開啟這個配置可以幫助job tracker更好的監控任務的執行情況,但是會帶來一定的效能損耗,當動態分割槽標誌hive.exec.dynamic.partition開啟時,本配置自動開啟; hive.hwi.war.file:hive在web介面是的war檔案的路徑,預設是lib/hive-hwi-xxxx(version).war; hive.hwi.listen.host:hwi監聽的host地址,預設是0.0.0.0; hive.hwi.listen.port:hwi監聽的埠,預設是9999; hive.exec.pre.hooks:執行前置條件,一個用逗號分隔開的實現了org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext介面的java class列表,配置了該配置後,每個hive任務執行前都要執行這個執行前鉤子,預設是空; hive.metastore.init.hooks:一個逗號分隔的列表鉤子被呼叫,在hmshandler初始化開始。aninit鉤指定名稱為java類來擴充套件org.apache.hadoop.hive.metastore.metastoreinitlistener。 hive.client.stats.publishers:做count的job的統計釋出類列表,由逗號隔開,預設是空;必須實現org.apache.hadoop.hive.ql.stats.ClientStatsPublisher介面; hive.merge.mapfiles: •說明:在只有map的作業結束時合併小檔案,預設開啟true; hive.merge.mapredfiles: •說明:在一個map/reduce作業結束後合併小檔案,預設不開啟false; hive.heartbeat.interval:傳送心跳的時間間隔,在mapjoin和filter操作中使用,預設1000; hive.merge.size.per.task:   疑問一體化叢集沒有生效。 •說明:作業結束時合併檔案的大小,預設256MB; hive.merge.smallfiles.avgsize: •說明:在作業輸出檔案小於該值時,起一個額外的map/reduce作業將小檔案合併為大檔案,小檔案的基本閾值,設定大點可以減少小檔案個數,需要mapfiles和mapredfiles為true,預設值是16MB; ****************************************mapjoin 的引數********************************************************** hive.mapjoin.smalltable.filesize:輸入表文件的mapjoin閾值,如果輸入檔案的大小小於該值,則試圖將普通join轉化為mapjoin,預設25MB; hive.ignore.mapjoin.hint:  忽略mapjoin暗示  hive.mapjoin.localtask.max.memory.usage:mapjoin本地任務執行時hash表容納key/value的最大量,超過這個值的話本地任務會自動退出,預設是0.9; hive.mapjoin.followby.gby.localtask.max.memory.usage:類似上面,只不過是如果mapjoin後有一個group by的話,該配置控制類似這樣的query的本地記憶體容量上限,預設是0.55; hive.mapjoin.check.memory.rows:在運算了多少行後執行記憶體使用量檢查,預設100000;