Intelligent RDD Management for High Performance In-Memory Computing in Spark
最近在研究一些Spark成本優(yōu)化的東西,看了一些論文稍微總結一下思路,方便思維拓寬和希望與大家交流!
本篇博文參考自:
WWW '17 Companion Proceedings of the 26th International Conference on World Wide Web Companion:
《Intelligent RDD Management for High Performance In-Memory Computing in Spark》
1 文章概述及問題描述
Spark是當下科研界或工業(yè)界中普遍使用的內存計算框架,可以通過將訪問的數據包裝成為彈性分布數據集(RDD),并將這些數據集存儲在快速訪問的主內存中,以大大加快計算速度。
但是,畢竟我們的計算內存是有限的,而Spark本身不會提供RDD的合理存儲機制,除此之外,如果中間的RDD因為一些原因缺失,則會導致該RDD的所在全部計算鏈條重新計算,這將帶來額外的計算和時間成本。
雖然spark內部提供的粗粒度(coarse-grained)checkpoint接口可以讓我們對想要保存的RDD數據進行持久化,但是對于日常的應用業(yè)務,其邏輯和代碼鏈條較為復雜,而人們都是靠經驗去checkpoint一些RDD,很多時候,我們犧牲了磁盤來保證程序的容錯性,這種方式都會導致spark執(zhí)行效率的降低,磁盤IO以及我們分布式存儲系統(tǒng)通常也有一定負擔。
此外,spark中還存在一個內存回收的問題,如果內存不夠用了,spark內部的LRU[2]算法(least recently used)來清楚一些使用頻率最小的RDD,但是該算法只考慮了使用頻率,并沒有考慮該數據分區(qū)的關于成本問題的一些因素,例如其計算成本問題,加入后面需要用到它,到底是計算他的成本小還是一直存儲到下一次使用的成本小。
因此,本文就是為了解決RDD的合理存儲問題,提出** 一個細粒度(Fine-Grained)的RDD-checkpoint和kick-out選擇策略,通過該策略,Spark可以智能地選擇合理的RDD進行存儲,以最大限度地提高內存的使用率 **。
LRU參考:
[2] D. Lee, J. Choi, J. H. Kim, S. H. Noh, S. L. Min,Y. Cho, and C. S. Kim. LRFU: A spectrum of policies that subsumes the least recently used and least frequently used policies. IEEE Transactions on Computers, 50(12):1352-1361, 2001.
2 論文牽扯到的Spark基礎
1). RDD
Spark是用于大數據處理的常用內存計算引擎。 Spark中的關鍵組件是彈性分布式數據集(RDD),它是一種分布式內存抽象,利用RDD進行編程,我們可以以容錯方式在大型集群上提交并執(zhí)行內存中的計算。 RDD利用內存來緩存中間結果,與其他大型數據密集型框架相比,Spark具有巨大的優(yōu)勢,例如。Hadoop的[1]。
** 2). CheckPoint **
checkpoint的目的是用來將某RDD的數據以及元數據信息進行緩存,內存和磁盤均是其緩存的介質對象。一旦RDD被checkpoint,其前面全部的父節(jié)點會被祛除,僅保留checkpointRDD作為其父RDD,這樣的機制可以減少RDD的鏈條長度,便于RDD的恢復。同時可以方便用戶跨多個計算進行RDD數據的訪問。** 但是這樣的粗粒度checkpoint會帶來一個嚴重問題,被切掉的依賴鏈條中的RDD可能在將來會被用到,因此此時spark必須要知道這些RDD的計算信息,以用于恢復**
3 方法概述
本文提出了一個智能的RDD管理方案,以幫助解決長鏈條RDD問題,同時對性能影響較小,并且該方案可以解決內存空間首先的問題。
首先提出了細粒度檢查技術,以避免丟棄高頻被使用的的RDD。 這種細粒度的Chekcpoint方法不會立即拋棄該RDD的全部父依賴,而是會去全局判斷是否要丟棄。
然后,討論如何巧妙地checkpoint一些RDD以消除計算開銷。
為了解決有限的存儲空間問題,提出了一種新穎的kick-out選擇方案來對包含寬依賴性的RDDs進行高速緩存。
文中的實驗驗證部分是基于Spark-1.5.2,并且使用大量數據工作負載,實驗表明該方案比baseline實現了高達28.01%的性能提升。
4 細粒度checkpoint
Lineage可以用于恢復RDD,但是對于長鏈條的RDD,這種恢復是十分耗時的,因此考慮checkpoint的方法來消除這種開銷。
一般來講,checkpoint對于使用頻率高的或是長鏈條的RDD,基于這樣的理論,本文提出如下建模公式來有選擇的對RDD進行checkpoint:
其中L和C分別表示選擇重新計算或是checkpoint達到恢復該RDD的所需時間,w代表故障頻率,取值范圍為[0,1],如果上式成立,則會進行checkpoint。
5 Kick-Out 選擇策略
LRU策略只考慮了時間維度,但是對于復雜長鏈條的計算,內存空間的利用率應當是又要考慮的,因為長鏈條帶來的最大的問題就是計算開銷,尤其是許多的寬依賴意味著這些RDD將來會有較大概率被訪問,所以持久化這些RDD可以在一定程度上提高內存的使用率。
5.1 選擇策略介紹
主要思想是給具有寬依賴的RDD分配優(yōu)先級P,優(yōu)先級決定了使用存儲空間的優(yōu)先級。分配策略如下:
其中L和C就是上面討論的直接計算和通過checkpoint來計算的時間花費,D代表該RDD的依賴程度(這里文中沒有解釋太多,我認為依賴程度就是該RDD所依賴的RDD的個數吧),權重就是將其除以最大的值進行進行歸一化相加得到,思想還是比較好理解的。
實驗驗證選取了Stanford和berkStan的graph dataset。實驗結果表明最大性能提升28.01%,平均提升13.63%。實驗結果如下圖:
6 實驗環(huán)境
1、4臺節(jié)點-64GB-13TB
2、Hadoop-2.6.0,Spark-1.5.2
3、數據集:
1)web-Stanford
2)web-BerkStan
至此,整個模型的思路介紹完畢。
我的博客 : https://NingSM.github.io
轉載請注明原址,謝謝。