矽谷之路54:深入淺出Spark(七)如何排序100TB

t2014年有個比賽,是對100TB的<key, value>pairs按照value進行排序。排序聽起來很簡單基礎但是卻非常重要,而且很考驗分散式系統的性能。排序需要shuffle大量數據,並且數據量自始至終沒有縮減,排序100TB的數據會佔用500TB的硬碟I/O和200TB的network。

來看一下Hadoop vs. Spark的結果:Hadoop使用了2100個nodes,72分鐘完成任務;Spark使用了206個node,23分鐘就完成任務,性能提升了三倍。

Spark是怎麼優化的呢?

t首先所有數據保存在內存里不寫入硬碟,提高速度。

其次傳統mapper的輸出需要經過很多步驟:從本地放到kernel里,再放到java虛擬機里,再放到網卡里,最後才能輸出。

t整個過程數據要copy三次,很影響速度。所以Spark使用了zero-copy的技術,可以直接將數據放到網卡中,不僅提升了速度而且解放了內核和java虛擬機。

計算中最耗時間的其實是shuffle這個過程。我們看到傳統的shuffle過程是基於哈希的,一個mapper對應不同的reducer,所以每個mapper會同時打開多個文件描述符(對應不同reducer)。想像一下如果有上萬個reducer,mapper就要同時維護上萬個文件描述符,寫數據時切換文件描述符會耗費大量時間。

怎麼優化呢?就是對結果排序,這樣只需要打開對應的文件描述符而不用在很多之間來回切換。

本文整理作者:Mengying Tian,查看完整視頻:http://www.bittiger.io/classes

更多內容,請訪問:BitTiger.io, 掃描下面二維碼,關注微信公眾賬號「論碼農的自我修養」

推薦閱讀:

大數據那些事(9):起早貪黑竹籃打水的18摸(IBM)
深度剖析Spark分散式執行原理
一般而言常見的Spark的性能瓶頸有哪些?
Scala快速入門系列:聲明變數、控制結構與函數、常用數組操作

TAG:Spark | 排序算法 |