另外寫文件的時(shí)候也需要一個(gè) buffer :
spark.shuffle.file.buffer = 32k
另外從內(nèi)存里拿到數(shù)據(jù)放到DiskWriter,這中間還要有個(gè)中轉(zhuǎn),是通過
final byte[] writeBuffer = new byte[DISK_WRITE_BUFFER_SIZE=1024 * 1024];
來完成的,都是內(nèi)存,所以很快。
Task結(jié)束前,我們要做一次mergeSpills操作,然后形成一個(gè)shuffle 文件。這里面其實(shí)也挺復(fù)雜的,
如果開啟了
`spark.shuffle.unsafe.fastMergeEnabled=true`
并且沒有開啟
`spark.shuffle.compress=true`
或者壓縮方式為:
LZFCompressionCodec
則可以非常高效的進(jìn)行合并,叫做transferTo。不過無論是什么合并,都不需要進(jìn)行反序列化。
Shuffle Read
Shuffle Read 完全復(fù)用HashShuffleReader,具體參看 Sort-Based Shuffle。
總結(jié)
我個(gè)人感覺,Tungsten-sort 實(shí)現(xiàn)了內(nèi)存的自主管理,管理方式模擬了操作系統(tǒng)的方式,通過Page可以使得大量的record被順序存儲在內(nèi)存,整個(gè)shuffle write 排序的過程只需要對指針進(jìn)行運(yùn)算(二進(jìn)制排序),并且無需反序列化,整個(gè)過程非常高效,對于減少GC,提高內(nèi)存訪問效率,提高CPU使用效率確實(shí)帶來了明顯的提升。