Redis讓Spark數據分析速度提升45倍(留作機器學習使用)

https://redislabs.com/solutions/spark-and-redis

一些內存數據結構比其他數據結構來得更高效;如果充分利用Redis,Spark運行起來速度更快。

Apache Spark已逐漸儼然成爲下一代大數據處理工具的典範。通過借鑑開源算法,並將處理任務分佈到計算節點集羣上,無論在它們在單一平臺上所能執行的數據分析類型方面,還是在執行這些任務的速度方面,Spark和Hadoop這一代框架都輕鬆勝過傳統框架。Spark利用內存來處理數據,因而速度比基於磁盤的Hadoop大幅加快(快100倍)。

但是如果得到一點幫助,Spark可以運行得還要快。如果結合Spark和Redis(流行的內存數據結構存儲技術),你可以再次大幅提升處理分析任務的性能。這歸功於Redis經過優化的數據結構,以及它在執行操作時,能夠儘量降低複雜性和開銷。通過藉助連接件訪問Redis數據結構和API,Spark可以進一步加快速度。

提速幅度有多大?如果Redis和Spark結合使用,結果證明,處理數據(以便分析下面描述的時間序列數據)的速度比Spark單單使用進程內存或堆外緩存來存儲數據要快45倍――不是快45%,而是快整整45倍!

爲什麼這很重要?許多公司日益需要分析交易的速度與業務交易本身的速度一樣快。越來越多的決策變得自動化,驅動這些決策所需的分析應該實時進行。Apache Spark是一種出色的通用數據處理框架;雖然它並非百分之百實時,還是往更及時地讓數據發揮用途邁出了一大步。

Spark使用彈性分佈式數據集(RDD),這些數據集可以存儲在易失性內存中或HDFS之類的持久性存儲系統中。RDD不會變化,分佈在Spark集羣的所有節點上,它們經轉換化可以創建其他RDD。

Redis讓Spark數據分析速度提升45倍! - suke3000 - 御風飛翔

Spark RDD
RDD是Spark中的重要抽象對象。它們代表了一種高效地將數據呈現給迭代進程的容錯方法。由於處理工作在內存中進行,這表示相比使用HDFS和MapReduce,處理時間縮短了好幾個數量級。

Redis是專門爲高性能設計的。亞毫秒延遲得益於經過優化的數據結構,由於讓操作可以在鄰近數據存儲的地方執行,提高了效率。這種數據結構不僅可以高效地利用內存、降低應用程序的複雜性,還降低了網絡開銷、帶寬消耗量和處理時間。Redis數據結構包括字符串、集合、有序集合、哈希、位圖、hyperloglog和地理空間索引。開發人員可以像使用樂高積木那樣使用Redis數據結構――它們就是提供複雜功能的簡單管道。

爲了直觀地表明這種數據結構如何簡化應用程序的處理時間和複雜性,我們不妨以有序集合(Sorted Set)數據結構爲例。有序集合基本上是一組按分數排序的成員。

Redis讓Spark數據分析速度提升45倍! - suke3000 - 御風飛翔

Redis有序集合
你可以將多種類型的數據存儲在這裏,它們自動由分數來排序。存儲在有序集合中的常見數據類型包括:物品(按價格)、商品名稱(按數量)、股價等時間序列數據,以及時間戳等傳感器讀數。

有序集合的魅力在於Redis的內置操作,讓範圍查詢、多個有序集合交叉、按成員等級和分數檢索及更多事務可以簡單地執行,具有無與倫比的速度,還可以大規模執行。內置操作不僅節省了需要編寫的代碼,內存中執行操作還縮短了網絡延遲、節省了帶寬,因而能夠實現亞毫秒延遲的高吞吐量。如果將有序集合用於分析時間序列數據,相比其他內存鍵/值存儲系統或基於磁盤的數據庫,通常可以將性能提升好幾個數量級。

Redis團隊的目標是提升Spark的分析功能,爲此開發了Spark-Redis連接件。這個程序包讓Spark得以使用Redis作爲其數據源之一。該連接件將Redis的數據結構暴露在Spark面前,可以針對所有類型的分析大幅提升性能。

Redis讓Spark數據分析速度提升45倍! - suke3000 - 御風飛翔


Spark Redis連接件
爲了展示給Spark帶來的好處,Redis團隊決定在幾種不同的場景下執行時間片(範圍)查詢,以此橫向比較Spark中的時間序列分析。這幾種場景包括:Spark在堆內內存中存儲所有數據,Spark使用Tachyon作爲堆外緩存,Spark使用HDFS,以及結合使用Spark和Redis。

Redis團隊使用Cloudera的Spark時間序列程序包,構建了一個Spark-Redis時間序列程序包,使用Redis有序集合來加快時間序列分析。除了讓Spark可以訪問Redis的所有數據結構外,該程序包另外做兩件事:

自動確保Redis節點與Spark集羣一致,從而確保每個Spark節點使用本地Redis數據,因而優化延遲。

與Spark數據幀和數據源API整合起來,以便自動將Spark SQL查詢轉換成對Redis中的數據來說最高效的那種檢索機制。

簡單地說,這意味着用戶不必擔心Spark和Redis之間的操作一致性,可以繼續使用Spark SQL來分析,同時大大提升了查詢性能。

用於這番橫向比較的時間序列數據包括:隨機生成的金融數據,每天1024支股票,時間範圍是32年。每隻股票由各自的有序集合來表示,分數是日期,數據成員包括開盤價、最高價、最低價、收盤價、成交量以及調整後的收盤價。下圖描述了用於Spark分析的Redis有序集合中的數據表示:

Redis讓Spark數據分析速度提升45倍! - suke3000 - 御風飛翔

Spark Redis時間序列
在上述例子中,就有序集合AAPL而言,有表示每天(1989-01-01)的分數,還有全天中表示爲一個相關行的多個值。只要在Redis中使用一個簡單的ZRANGEBYSCORE命令,就可以執行這一操作:獲取某個時間片的所有值,因而獲得指定的日期範圍內的所有股價。Redis執行這種類型的查詢的速度比其他鍵/值存儲系統快100倍。

這番橫向比較證實了性能提升。結果發現,Spark使用Redis執行時間片查詢的速度比Spark使用HDFS快135倍,比Spark使用堆內(進程)內存或Spark使用Tachyon作爲堆外緩存快45倍。下圖顯示了針對不同場景所比較的平均執行時間:

Redis讓Spark數據分析速度提升45倍! - suke3000 - 御風飛翔

Spark Redis橫向比較
如果你想親自嘗試一下,不妨遵照這篇可下載的逐步指南:《Spark和Redis使用入門》(https://redislabs.com/solutions/spark-and-redis)。該指南將逐步引導你安裝典型的Spark集羣和Spark-Redis程序包。它還用一個簡單的單詞計數例子,表明了可以如何結合使用Spark和Redis。你在試用過Spark和Spark-Redis程序包後,可以進一步探究利用其他Redis數據結構的更多場景。

雖然有序集合很適合時間序列數據,但Redis的其他數據結構(比如集合、列表和地理空間索引)可以進一步豐富Spark分析。設想一下:一個Spark進程試圖根據人羣偏好以及鄰近市中心,獲取在哪個地區發佈新產品效果最好的信息。現在設想一下,內置分析自帶的數據結構(比如地理空間索引和集合)可以大大加快這個進程。Spark-Redis這對組合擁有無限的應用前景。

Spark支持一系列廣泛的分析,包括SQL、機器學習、圖形計算和Spark Streaming。使用Spark的內存處理功能只能讓你達到一定的規模。然而有了Redis後,你可以更進一步:不僅可以通過利用Redis的數據結構來提升性能,還可以更輕鬆自如地擴展Spark,即通過充分利用Redis提供的共享分佈式內存數據存儲機制,處理數百萬個記錄,乃至數十億個記錄。

時間序列這個例子只是開了個頭。將Redis數據結構用於機器學習和圖形分析同樣有望爲這些工作負載帶來執行時間大幅縮短的好處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章