1. 程式人生 > >KNN在MR和Spark下實現的IO操作比較

KNN在MR和Spark下實現的IO操作比較

MapReduce中KNN執行過程I/O操作分析:

實現流程:

KNN在MapReduce中的實現,認為訓練集大小遠大於測試集大小。所以測試集快取在記憶體中。

Map任務輸入是一個訓練集檔案的分片(子集),測試集中的每一個樣例與訓練集分片中的所有樣例計算距離,輸出<測試樣例, (與訓練樣例的距離和訓練樣例的類別)>

Combiner階段根據map的輸出得到距測試樣例最近的K個訓練樣例,並輸出。

Reduce任務:根據輸入得到距測試樣例最近的K個訓練樣例,並按投票原則得到對應的類別,輸出到HDFS。

 

通過上述KNN在MapReduce中的流程分析產生的I/O操作的數量,分析I/O操作其實主要就是分析shuffle階段的操作,具體分析如下:

1.首先Map端,map任務從HDFS中讀取資料分片產生一次讀操作。

2.當map函式處理完成每一條輸入產生輸出時,會將輸出寫入到一個預設大小為100M的緩衝區,當緩衝區的資料大小達到閾值(預設為緩衝區大小的80%),便會將緩衝區中的資料溢寫到磁碟中,這個過程產生一次寫操作。

3.上述過程會產生大量的溢寫的小檔案,map任務會將這些檔案進行合併,在合併前會呼叫combiner函式,以減少寫到磁碟的資料。這個過程產生一次讀和寫操作。

4.Reduce端的輸入是若干map任務的map輸出,所以在每個map任務完成時,就複製其輸出到Reduce端本地磁碟。該過程會產生一次讀和寫操作。

5.最後在reduce階段,直接把資料輸入到reduce函式,產生一次讀操作。Reduce函式對資料進行處理得到的輸出直接寫到HDFS中,產生一次寫操作。

綜上所述,KNN在mapreduce中的實現至少有4次讀操作和4次寫操作。

KNN在Spark中I/O操作分析:

由於Spark是基於記憶體的計算,所有的計算都在記憶體中進行。所以通常情況下,Spark任務都只有兩次I/O操作,一次是讀取資料形成RDD,一次是將計算的結果寫入檔案系統(HDFS)。

中間的操作都是在記憶體中進行的。但是如果有shuffle操作且記憶體不足以容納所有的資料就可能會有I/O操作,在KNN的實現過程中,會有一次shuffle操作,所以可能會有一次讀和寫操作。綜述,KNN在Spark中的實現至多會有兩次讀和兩次寫操作,最少會有一次讀和一次寫操作。