<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                **1. 對數據進行 ETL 預處理** 使用場景: (1)hive 中文件大小不均勻,有的大有的小。spark在讀取大文件時會對大文件按照block快進行切分,小文件不會切分。如果不進行預處理,那么小文件處理速度快,大文件處理慢、資源沒有得到充分利用,可以先對hive數據進行清洗、去重、重新分區等操作來將原本不均勻的數據重新均勻的存放在多個文件中。以簡化后面依賴此數據源的任務。 (2)hive 中 key分布不均勻,可以將shuffle類操作先進行處理。處理完畢之后,spark應用不必進行重復的shuffle,直接用處理后的結果就可以。在頻繁調用 spark 作業并且有實效要求的場景中,如果今天作業要用到昨天數據的聚合數據,可以每天進行一次預處理,將數據聚合好,從而保證今天作業的實效要求。 <br/> **2. 過濾少數導致傾斜的 key** 使用場景: (1)傾斜 key 沒有意義時,比如存在很多 key是`-`(`-`在我們系統代表空)的記錄,那么就可以直接filter掉來解決`-`帶來的數據傾斜。 (2)傾斜 key 是有意義的,那么就需要單獨拎出來進行單獨處理。 <br/> **3. 提高 shuffle 操作的并行度** 使用場景:同一個 task 被分配了多個傾斜的 key。試圖增加 shuffle read task的數量,可以讓原本分配給一個 task 的多個 key 分配給多個 task,從而讓每個 task處理比原來更少的數據。實現起來比較簡單,可以有效緩解和減輕數據傾斜的影響,原理如下圖 ![](https://img.kancloud.cn/54/58/5458ae27d34d57c3aa6354838945177c_832x371.png) 具體操作是將shuffle算子,比如groupByKey、countByKey、reduceByKey。在調用的時候傳入進去一個參數,一個數字。那個數字就代表了那個 shuffle 操作的 reduce 端的并行度。那么在進行 shuffle 操作的時候,就會對應著創建指定數量的 reduce task。 <br/> **4. 兩階段聚合(局部聚合+全局聚合)** 使用場景:對 RDD 執行 reduceByKey 等聚合類 shuffle 算子或者在 Spark SQL中使用group by語句進行分組聚合時,比較適用這種方案。如果是join類的shuffle操作,還得用其他的解決方案。 <br/> 實現方式:將原本相同的key通過附加隨機前綴的方式,變成多個不同的key,就可以讓原本被一個 task 處理的數據分散到多個 task 上去做局部聚合,進而解決單個 task 處理數據量過多的問題。接著去除掉隨機前綴,再次進行全局聚合,就可以得到最終的結果。如下圖所示。 ![](https://img.kancloud.cn/fe/66/fe66feda38200750b1b75fd8f6a87097_1014x418.png) <br/> **5. 將 reduce join 轉為 map join** 使用場景:join 類操作,存在小表 join 大表的場景。可以將小表進行廣播從而避免shuffle。 <br/> **6. 采樣傾斜 key 并分拆 join 操作** 使用場景:適用于 join 類操作中,由于相同 key 過大占內存,不能使用第 5個方案,但傾斜 key 的種數不是很多的場景。<br/> 實現方式: 第(1)步:對包含少數幾個數據量過大的key的那個RDD,通過sample算子采樣出一份樣本來,然后統計一下每個key的數量,計算出來數據量最大的是哪幾個 key。 第(2)步:將這幾個key對應的數據從原來的RDD中拆分出來,形成一個單獨的RDD,并給每個key都打上n以內的隨機數作為前綴,而不會導致傾斜的大部分 key 形成另外一個 RDD。 第(3)步:接著將需要 join 的另一個 RDD,也過濾出來那幾個傾斜 key 對應的數據并形成一個單獨的 RDD,將每條數據膨脹成 n條數據,這 n 條數據都按順序附加一個 0~n 的前綴,不會導致傾斜的大部分 key 也形成另外一個 RDD。 第(4)步:再將附加了隨機前綴的獨立 RDD 與另一個膨脹 n 倍的獨立 RDD 進行 join,此時就可以將原先相同的 key打散成n份,分散到多個 task 中去進行 join了。 第(5)步:而另外兩個普通的 RDD 就照常 join 即可。最后將兩次 join 的結果使用 union 算子合并起來即可,就是最終的 join 結果。 <br/> 具體原理見下圖: ![](https://img.kancloud.cn/e9/46/e946774119b41b76ba67bd17ba822fff_787x750.png) <br/> **7. 使用隨機前綴和擴容 RDD 進行 join** 使用場景:如果在進行 join 操作時,RDD 中有大量的 key 導致數據傾斜。同第 6 個方案,不同的是它不需要對原先 rdd 進行傾斜 key 過濾,將原來 rdd形成含傾斜 key的rdd,與不含傾斜key的rdd。直接對整個原本的rdd的key一邊進行加隨機數,另一邊進行相應倍數的擴容。而這一種方案是針對有大量傾斜 key的情況,沒法將部分key拆分出來進行單獨處理,因此只能對整個RDD進行數據擴容,對內存資源要求很高。
                  <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>

                              哎呀哎呀视频在线观看