天天看點

聊聊Spark的分區

通過之前的文章

【Spark RDD詳解】

,大家應該了解到Spark會通過DAG将一個Spark job中用到的所有RDD劃分為不同的stage,每個stage内部都會有很多子任務處理資料,而每個stage的任務數是決定性能優劣的關鍵名額。

首先來了解一下Spark中分區的概念,其實就是将要處理的資料集根據一定的規則劃分為不同的子集,每個子集都算做一個單獨的分區,由叢集中不同的機器或者是同一台機器不同的core進行分區并行處理。

Spark對接不同的資料源,在第一次得到的分區數是不一樣的,但都有一個共性:對于map類算子或者通過map算子産生的彼此之間具有窄依賴關系的RDD的分區數,子RDD分區與父RDD分區是一緻的。而對于通過shuffle差生的子RDD則由分區器決定,當然預設分區器是HashPartitioner,我們完全可以根據實際業務場景進行自定義分區器,隻需繼承Parttioner元件,主要重寫幾個方法即可:

聊聊Spark的分區

以加載hdfs檔案為例,Spark在讀取hdfs檔案還沒有調用其他算子進行業務處理前,得到的RDD分區數由什麼決定呢?關鍵在于檔案是否可切分!

對于可切分檔案,如text檔案,那麼通過加載檔案得到的RDD的分區數預設與該檔案的block數量保持一緻;

對于不可切分檔案,它隻有一個block塊,那麼得到的RDD的分區數預設也就是1。

當然,我們可以通過調用一些算子對RDD進行重分區,如repartition。

這裡必須要強調一點,很多小夥伴不了解,RDD既然不存儲資料,那麼加載過來的檔案都跑哪裡去了呢?這裡先給大家提個引子——blockmanager,Spark自己實作的存儲管理器。RDD的存儲概念其實block,至于block的大小可以根據不同的資料源進行調整,blockmanager的資料存儲、傳輸都是以block進行的。至于block内部傳輸的時候,它的大小也是可以通過參數控制的,比如廣播變量、shuffle傳輸時block的大小等

繼續閱讀