Spark 原始碼分析之ShuffleMapTask記憶體資料Spill和合並
阿新 • • 發佈:2018-12-14
前置條件
- Hadoop版本: Hadoop 2.6.0-cdh5.15.0
- Spark版本: SPARK 1.6.0-cdh5.15.0
- JDK.1.8.0_191
- scala2.10.7
技能標籤
- Spark ShuffleMapTask 記憶體中的資料Spill到臨時檔案
- 臨時檔案中的資料是如何定入的,如何按partition升序排序,再按Key升序排序寫入(key,value)資料
- 每個臨時檔案,都存入對應的每個分割槽有多少個(key,value)對,有多少次流提交陣列,陣列中保留每次流的大小
- 如何把臨時檔案合成一個檔案
- 如何把記憶體中的資料和臨時檔案,進行分割槽,按key,排序後,再寫入合併檔案中
記憶體中資料Spill到磁碟
- ShuffleMapTask進行當前分割槽的資料讀取(此時讀的是HDFS的當前分割槽,注意還有一個reduce分割槽,也就是ShuffleMapTask輸出檔案是已經按Reduce分割槽處理好的)
- SparkEnv指定預設的SortShuffleManager,getWriter()中匹配BaseShuffleHandle物件,返回SortShuffleWriter物件
- SortShuffleWriter,用的是ExternalSorter(外部排序物件進行排序處理),會把rdd.iterator(partition, context)的資料通過iterator插入到ExternalSorter中PartitionedAppendOnlyMap物件中做為記憶體中的map物件資料,每插入一條(key,value)的資料後,會對當前的記憶體中的集合進行判斷,如果滿足溢位檔案的條件,就會把記憶體中的資料寫入到SpillFile檔案中