<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                MapReduce 優化方法主要以下幾個方面考慮:數據輸入、Map 階段、Reduce階段、IO 傳輸、數據傾斜問題和常用的調優參數。 [TOC] # 1. 數據輸入 合并小文件:在執行 mr 任務前將小文件進行合并,大量的小文件會產生大量的 map 任務,增大 map 任務裝載次數,而任務的裝載比較耗時,從而導致mr 運行較慢。 <br/> # 2. Map 階段 1. 減少溢寫(spill)次數:通過調整 `io.sort.mb` 及 `sort.spill.percent`參數值,增大觸發 spill 的內存上限,減少 spill 次數,從而減少磁盤 IO。 2. 減少合并(merge)次數:通過調整 `io.sort.factor` 參數,增大 merge 的文件數目,減少 merge 的次數,從而縮短 mr 處理時間。 3. 在 map 之后,不影響業務邏輯前提下,先進行 combine 處理,減少 I/O。 <br/> # 3. Reduce 階段 1. 合理設置 map 和 reduce 數:兩個都不能設置太少,也不能設置太多。太少,會導致 task 等待,延長處理時間;太多,會導致 map、reduce 任務間競爭資源,造成處理超時等錯誤。 2. 設置 map、reduce 共存:調整 `slowstart.completedmaps` 參數,使 map 運行到一定程度后,reduce 也開始運行,減少 reduce 的等待時間。 3. 使用 reduce:因為 reduce 在用于搜集數據集的時候將會產生大量的網絡消耗。 4. 合理設置 reduce 端的 buffer:默認情況下,數據達到一個閾值的時候,buffer中的數據就會寫入磁盤,然后 reduce 會從磁盤中獲得所有的數據。也就是說,buffer 和reduce 是沒有直接關聯的,中間多個一個寫磁盤->讀磁盤的過程,既然有這個弊端,那么就可以通過參數來配置,使得 buffer 中的一部分數據可以直接輸送到reduce,從而減少IO開銷:`mapred.job.reduce.input.buffer.percent`,默認為0.0。當值大于0的時候,會保留指定比例的內存讀buffer中的數據直接拿給reduce使用。這樣一來,設置 buffer 需要內存,讀取數據需要內存,reduce 計算也要內存,所以要根據作業的運行情況進行調整。 <br/> # 4. 數據傾斜問題 1. 數據傾斜現象 數據頻率傾斜——某一個區域的數據量要遠遠大于其他區域。 數據大小傾斜——部分記錄的大小遠遠大于平均值。 2. 如何收集傾斜數據 在 reduce 方法中加入記錄 map 輸出鍵的詳細情況的功能。 ```java public static final String MAX_VALUES = "skew.maxvalues"; private int maxValueThreshold; @Override public void configure(JobConf job) { maxValueThreshold = job.getInt(MAX_VALUES, 100); } @Override public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { int i = 0; while (values.hasNext()) { values.next(); i++; } if (++i > maxValueThreshold) { log.info("Received " + i + " values for key " + key); } } ``` 3. 減少數據傾斜的方法 方法 1:抽樣和范圍分區 可以通過對原始數據進行抽樣得到的結果集來預設分區邊界值。 方法 2:自定義分區 基于輸出鍵的背景知識進行自定義分區。例如,如果 map 輸出鍵的單詞來源于一本書。且其中某幾個專業詞匯較多。那么就可以自定義分區將這這些專業詞匯發送給固定的一部分 reduce 實例。而將其他的都發送給剩余的 reduce 實例。 方法 3:Combine 使用 Combine 可以大量地減小數據傾斜。在可能的情況下,combine 的目的就是提前聚合并精簡數據。 方法 4:采用 Map Join,盡量避免 Reduce Join。 <br/> # 5. 常用的調優參數 1. **資源相關參數** ( 1 )以下參數是在用戶自己的 mr 應用程序中配置就可以生效(mapred-default.xml)。 | 配置參數 | 參數說明 | | --- | --- | | `mapreduce.map.memory.mb` | 一個 Map Task 可使用的資源上限(單位:MB),默認為 1024。如果 Map Task實際使用的資源量超過該值,則會被強制殺死。 | | `mapreduce.reduce.memory.mb` | 一個ReduceTask可使用的資源上限(單位:MB),默認為1024。如果ReduceTask實際使用的資源量超過該值,則會被強制殺死。 | | `mapreduce.map.cpu.vcores` | 每個 Map task 可使用的最多 cpu core數目,默認值: 1 | | `mapreduce.reduce.cpu.vcores` | 每個 Reduce task 可使用的最多 cpu core 數目,默認值: 1 | | `mapreduce.reduce.shuffle.parallelcopies` | 每個 reduce 去 map 中拿數據的并行數。默認值是 5 | | `mapreduce.reduce.shuffle.merge.percent` | buffer 中的數據達到多少比例開始寫入磁盤。默認值 0.66 | |`mapreduce.reduce.shuffle.input.buffer.percent` | buffer 大小占 reduce 可用內存的比例。默認值 0.7 | | `mapreduce.reduce.input.buffer.percent` | 指定多少比例的內存用來存放 buffer中的數據,默認值是 0.0 | ( 2 ) 應 該 在 yarn 啟 動 之 前 就 配 置 在 服 務 器 的 配 置 文 件 中 才 能 生 效(yarn-default.xml)。 | 配置參數 | 參數說明 | | --- | --- | | `yarn.scheduler.minimum-allocation-mb` | 給應用程序 container 分配的最小內存, 默認1024MB | | `yarn.scheduler.maximum-allocation-mb` | 給應用程序 container 分配的最大內存, 默認8192MB | | `yarn.scheduler.minimum-allocation-vcores` | 每個 container 申請的最小 CPU 核數, 默認為1 | | `yarn.scheduler.maximum-allocation-vcores` | 每個 container 申請的最大 CPU 核數, 默認32 | | `yarn.nodemanager.resource.memory-mb` | 給 containers 分配的最大物理內存, 默認8192MB | ( 3 ) shuffle 性 能 優化 的 關 鍵 參 數 , 應在 yarn 啟動 之 前 就配 置 好(mapred-default.xml)。 | 配置參數 | 參數說明 | | --- | --- | | `mapreduce.task.io.sort.mb` | shuffle 的環形緩沖區大小,默認100m | | `mapreduce.map.sort.spill.percent` | 環形緩沖區溢出的閾值,默認80%,即0.8 | 2. **容錯相關參數(mapreduce 性能優化)** | 配置參數 | 參數說明 | | --- | --- | | `mapreduce.map.maxattempts` | 每個 Map Task 最大重試次數,一旦重試參數超過該值,則認為 Map Task 運行失敗,默認值:4。 | | `mapreduce.reduce.maxattempts` | 每個 Reduce Task 最大重試次數,一旦重試參數超過該值,則認為 Map Task 運行失敗,默認值:4。 | | `mapreduce.task.timeout` | Task 超時時間,經常需要設置的一個參數,該參數表達的意思為:如果一個 task 在一定時間內沒有任何進入,即不會讀取新的數據,也沒有輸出數據,則認為該 task 處于 block 狀態,可能是卡住了,也許永遠會卡主,為了防止因為用戶程序永遠 block 住不退出,則強制設置了一個該超時時間(單位毫秒),默認是600000。如果你的程序對每條輸入數據的處理時間過長(比如會訪問數據庫,通過網絡拉取數據等),建議將該參數調大,該參數過小常出現的錯誤提示是AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster. |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看