1. 程式人生 > >Hadoop map調優引數

Hadoop map調優引數

引數:io.sort.mb(default 100)
當map task開始運算,併產生中間資料時,其產生的中間結果並非直接就簡單的寫入磁碟。
而是會利用到了記憶體buffer來進行已經產生的部分結果的快取,
並在記憶體buffer中進行一些預排序來優化整個map的效能。
每一個map都會對應存在一個記憶體buffer,map會將已經產生的部分結果先寫入到該buffer中,
這個buffer預設是100MB大小,
但是這個大小是可以根據job提交時的引數設定來調整的,
當map的產生資料非常大時,並且把io.sort.mb調大,
那麼map在整個計算過程中spill的次數就勢必會降低,
map task對磁碟的操作就會變少,
如果map tasks的瓶頸在磁碟上,這樣調整就會大大提高map的計算效能。

引數:o.sort.spill.percent(default 0.80,也就是80%)
map在執行過程中,不停的向該buffer中寫入已有的計算結果,
但是該buffer並不一定能將全部的map輸出快取下來,
當map輸出超出一定閾值(比如100M),那麼map就必須將該buffer中的資料寫入到磁碟中去,
這個過程在mapreduce中叫做spill。
map並不是要等到將該buffer全部寫滿時才進行spill,
因為如果全部寫滿了再去寫spill,勢必會造成map的計算部分等待buffer釋放空間的情況。
所以,map其實是當buffer被寫滿到一定程度(比如80%)時,就開始進行spill。
這個閾值也是由一個job的配置引數來控制,
這個引數同樣也是影響spill頻繁程度,進而影響map task執行週期對磁碟的讀寫頻率的。
但非特殊情況下,通常不需要人為的調整。調整io.sort.mb對使用者來說更加方便。

引數:io.sort.factor
當map task的計算部分全部完成後,如果map有輸出,就會生成一個或者多個spill檔案,這些檔案就是map的輸出結果。
map在正常退出之前,需要將這些spill合併(merge)成一個,所以map在結束之前還有一個merge的過程。
merge的過程中,有一個引數可以調整這個過程的行為,該引數為:io.sort.factor。
該引數預設為10。它表示當merge spill檔案時,最多能有多少並行的stream向merge檔案中寫入。
比如如果map產生的資料非常的大,產生的spill檔案大於10,而io.sort.factor使用的是預設的10,
那麼當map計算完成做merge時,就沒有辦法一次將所有的spill檔案merge成一個,而是會分多次,每次最多10個stream。
這也就是說,當map的中間結果非常大,調大io.sort.factor,
有利於減少merge次數,進而減少map對磁碟的讀寫頻率,有可能達到優化作業的目的。

引數:min.num.spill.for.combine(default 3)
當job指定了combiner的時候,我們都知道map介紹後會在map端根據combiner定義的函式將map結果進行合併。
執行combiner函式的時機有可能會是merge完成之前,或者之後,這個時機可以由一個引數控制,
即min.num.spill.for.combine(default 3),當job中設定了combiner,並且spill數最少有3個的時候,
那麼combiner函式就會在merge產生結果檔案之前執行。
通過這樣的方式,就可以在spill非常多需要merge,並且很多資料需要做conbine的時候,
減少寫入到磁碟檔案的資料數量,同樣是為了減少對磁碟的讀寫頻率,有可能達到優化作業的目的。

引數:mapred.compress.map.output(default false)
減少中間結果讀寫進出磁碟的方法不止這些,還有就是壓縮。
也就是說map的中間,無論是spill的時候,還是最後merge產生的結果檔案,都是可以壓縮的。
壓縮的好處在於,通過壓縮減少寫入讀出磁碟的資料量。
對中間結果非常大,磁碟速度成為map執行瓶頸的job,尤其有用。
控制map中間結果是否使用壓縮的引數為:mapred.compress.map.output(true/false)。
將這個引數設定為true時,那麼map在寫中間結果時,就會將資料壓縮後再寫入磁碟,讀結果時也會採用先解壓後讀取資料。
這樣做的後果就是:寫入磁碟的中間結果資料量會變少,但是cpu會消耗一些用來壓縮和解壓。
所以這種方式通常適合job中間結果非常大,瓶頸不在cpu,而是在磁碟的讀寫的情況。
說的直白一些就是用cpu換IO。
根據觀察,通常大部分的作業cpu都不是瓶頸,除非運算邏輯異常複雜。所以對中間結果採用壓縮通常來說是有收益的。

引數:mapred.map.output.compression.codec( default org.apache.hadoop.io.compress.DefaultCodec)
當採用map中間結果壓縮的情況下,使用者還可以選擇壓縮時採用哪種壓縮格式進行壓縮,
現在hadoop支援的壓縮格式有:GzipCodec,LzoCodec,BZip2Codec,LzmaCodec等壓縮格式。
通常來說,想要達到比較平衡的cpu和磁碟壓縮比,LzoCodec比較適合。但也要取決於job的具體情況。
使用者若想要自行選擇中間結果的壓縮演算法,
可以設定配置引數:mapred.map.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec或者其他使用者自行選擇的壓縮方式

相關推薦

Hadoop map調引數

引數:io.sort.mb(default 100) 當map task開始運算,併產生中間資料時,其產生的中間結果並非直接就簡單的寫入磁碟。 而是會利用到了記憶體buffer來進行已經產生的部分結果的快取, 並在記憶體buffer中進行一些預排序來優化整

hadoop作業調引數整理及原理(整個mapreduce執行流程都講的清楚,一步一步優化)

1 Map side tuning引數 1.1 MapTask執行內部原理 當map task開始運算,併產生中間資料時,其產生的中間結果並非直接就簡單的寫入磁碟。這中間的過程比較複雜,並且利用到了記憶體buffer來進行已經產生的部分結果的快取,並在記憶體bu

Hadoop效能調全面總結

一、 Hadoop概述 隨著企業要處理的資料量越來越大,MapReduce思想越來越受到重視。Hadoop是MapReduce的一個開源實現,由於其良好的擴充套件性和容錯性,已得到越來越廣泛的應用。 Hadoop實現了一個分散式檔案系統(Hadoop Distributed File Sys

Spark Streaming調引數及最佳實踐深入剖析-Spark商業調實戰

本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何商業交流,可隨時聯絡。

Dubbo效能調引數及原理

Dubbo呼叫模型 常用效能調優引數 原始碼及原理分析 threads FixedThreadPool.java public Executor getExecutor(URL url) { Stri

機器學習 使用交叉驗證為KNN調引數

# KNN的距離演算法 使用的是歐氏距離 即算空間中點的距離 (根號下的 差的平方和) # 要注意的是knn演算法是需要做 標準化處理的 # API:(引數:n_neighbors=5)預設使用5個鄰居 鄰居的數量對演算法的結果有影響 數量越大則要判斷的點越多 from sklearn

JVM記憶體結構--新生代及新生代裡的兩個Survivor區(下一輪S0與S1交換角色,如此迴圈往復)、常見調引數

轉自http://www.cnblogs.com/duanxz/p/6076662.html 一、為什麼會有年輕代   我們先來屢屢,為什麼需要把堆分代?不分代不能完成他所做的事情麼?其實不分代完全可以,分代的唯一理由就是優化GC效能。你先想想,如果沒有分代,那我們

RocksDB 的常用調引數

RocksDB 的引數以其資料多和複雜著稱,要全部弄懂也要費一番功夫,這裡也僅僅會說一下我們使用的一些引數,還有很多我們也需要後面慢慢去研究。 Parallelism RocksDB 有兩個後臺執行緒,flush 和 compaction,兩個都可以同時

mysql知識盤點【肆】_調引數

本文內容整理自《Mysql運維內參》第26章,本書值得一看,即使是開發同學。連結如下: genera_log 建議在資料庫正常服務時,將這個引數設定為關閉狀態,因為它會記

MQ高併發量時的調引數設定說明

高可用(主從)與負載均衡架構圖 訊息傳送中的接收Topic訂閱結果訊息佇列URL地址、訊息接收佇列URL地址、訊息代理的傳送與接收佇列URL地址以及訊息轉發器傳送的Topic結果訊息佇列URL地址,均需設定為Failover 地址。 由於訊息佇列元件ActiveMQ是

JVM效能調的6大步驟,及關鍵調引數詳解

JVM效能調優的6大步驟,及關鍵調優引數詳解 JVM效能調優方法和步驟 1.監控GC的狀態 2.生成堆的dump檔案 3.分析dump檔案 4.分析結果,判斷是否需要優化 5.調整GC型別和記憶體分配 6.不斷分析

JVM調引數彙總啊!!!!總結的很不錯。

-XX:PrintHeapAtGC:列印GC前後的詳細堆疊資訊 輸出形式: 34.702: [GC {Heap before gc invocations=7:  def new generation   total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0

Hadoop效能調方法

當我們寫完一個MR程式之後,我們希望能夠加快程式的執行速度,那麼怎麼進行效能的調優呢,有如下幾種方法? 1、mapper的數量 適當調整mapper的數量,使得每個mapper的執行時間在1分鐘為宜。因為mapper數量過小,則會導致整體速度過慢。太多則導致

JVM分析工具以及JVM常用調引數

#檢視java中的所有執行緒 top -H -p pid[程序號] pidstat -p pid -u -t[執行緒級] #檢視啟動java程序 jps #檢視Java記憶體資訊  jmap jmap -heap pid   ===>檢視Java程序的堆分配資訊 jma

JVM常用調引數

-Xmx:最大JVM可用記憶體, 例:-Xmx4g -Xms:最小JVM可用記憶體, 例:Xms4g -Xmn:年輕代記憶體大小,例:-Xmn2560m -XX:PermSize:永久代記憶體大小,該值太大會導致fullGC時間過長,太小將增加fullGC頻率,例:-XX:PermSize=128m -

JVM調引數簡介、調目標及調經驗

一、JVM調優引數簡介1、 JVM引數簡介-XX 引數被稱為不穩定引數,之所以這麼叫是因為此類引數的設定很容易引起JVM 效能上的差異,使JVM 存在極大的不穩定性。如果此類引數設定合理將大大提高JVM 的效能及穩定性。不穩定引數語法規則:1.布林型別引數值        -

Android系統的效能調引數介紹

在Android系統中有一個類似Windows系統登錄檔的檔案build.prop。這個檔案內定義了系統初始(或永久)的一些引數屬性、功能的開放等。通過調整/增加引數可以達到較調系統性能偏重點和附加功能開啟的作用。在Android 2.2、2.3、4.0中雖然每一版都有自己

5.JVM三大效能調引數:-Xms -Xmx -Xss

1.-Xss是對每個執行緒stack大小的調整。直接影響對方法的呼叫次數 測試結果: 測試程式碼: package com.dt.spark.jvm.basics; public class HelloStackOverFlow {private static int c

JVM效能調2:JVM效能調引數整理

關閉新生代收集擔保。 在一次理想化的minor gc中,Eden和First Survivor中的活躍物件會被複制到Second Survivor。然而,Second Survivor不一定能容納下所有從E和F區copy過來的活躍物件。為了確保minor gc能夠順利完成,GC需要在年老代中額外保留一塊

tomcat 壓力測試調+引數配置

1.壓力測試的時候,當併發數達到100的時候,tomcat的執行緒數和連線池都出現了問題,需修改配置如下     <Connector port="8033" maxThreads="<