(
spark
裡是shufflemaptask
)的輸出進行
partition
,不同的
partition
送到不同的
reducer
(spark
裡reducer
可能是下乙個
stage
裡的shufflemaptask
,也可能是
resulttask
)。reducer
以記憶體作緩衝區,邊
shuffle
邊aggregate
資料,等到資料
aggregate
好以後進行
reduce()
(spark
裡可能是後續的一系列操作)。
hadoop mapreduce
是sort-based
,進入combine()
和reduce()
的records
必須先sort
。這樣的好處在於
combine/reduce()
可以處理大規模的資料,因為其輸入資料可以通過外排得到(
對每段資料先做排序,
reducer
的shuffle
對排好序的每段資料做歸併)。目前的
spark
預設選擇的是
hash-based
,通常使用
hashmap
來對shuffle
來的資料進行
aggregate
,不會對資料進行提前排序。如果使用者需要經過排序的資料,那麼需要自己呼叫類似
sortbykey()
的操作;如果你是
spark 1.1
的使用者,可以將
spark.shuffle.manager
設定為sort
,則會對資料進行排序。在
spark 1.2
中,sort
將作為預設的
shuffle
實現。hadoop mapreduce
將處理流程劃分出明顯的幾個階段:
map(), spill, merge, shuffle, sort, reduce()
等。每個階段各司其職,可以按照過程式的程式設計思想來逐一實現每個階段的功能。在
spark
中,沒有這樣功能明確的階段,只有不同的
stage
和一系列的
transformation()
,所以spill, merge, aggregate
等操作需要蘊含在
transformation() 中。
如果我們將
map
端劃分資料、持久化資料的過程稱為
shuffle write
,而將reducer
讀入資料、
aggregate
資料的過程稱為
shuffle read
。那麼在
spark
中,問題就變為怎麼在
job
的邏輯或者物理執行圖中加入
shuffle write
和shuffle read
的處理邏輯?以及兩個處理邏輯應該怎麼高效實現?
shuffle write
由於不要求資料有序,
shuffle write
的任務很簡單:將資料
partition
好,並持久化。
之所以要持久化,一方面是要減少記憶體儲存空間壓力,另一方面也是為了 fault-tolerance。
Hadoop 和 Spark 的異同
談到大資料,相信大家對hadoop和apache spark這兩個名字並不陌生。但我們往往對它們的理解只是提留在字面上,並沒有對它們進行深入的思考,下面不妨跟我一塊看下它們究竟有什麼異同。首先,hadoop和apache spark兩者都是大資料框架,但是各自存在的目的不盡相同。hadoop實質上更...
hadoop和spark的異同
解決問題的層面不一樣 首先,hadoop和apache spark兩者都是大資料框架,但是各自存在的目的不盡相同。hadoop實質上更多是乙個分布式資料基礎設施 它將巨大的資料集分派到乙個由普通計算機組成的集群中的多個節點進行儲存,意味著您不需要購買和維護昂貴的伺服器硬體。同時,hadoop還會索引...
Hadoop和Spark的異同
談到大資料,相信大家對hadoop和apache spark這兩個名字並不陌生。但我們往往對它們的理解只是提留在字面上,並沒有對它們進行深入的思考,下面不妨跟我一塊看下它們究竟有什麼異同。解決問題的層面不一樣 首先,hadoop和apache spark兩者都是大資料框架,但是各自存在的目的不盡相同...