Apache Spark is increasingly becoming a model for next-generation big data processing tools.。透過借鑒開源演算法,並將處理任務分散到運算節點叢集上,無論在它們在單一平台上所能執行的資料分析類型方面,或是在執行這些任務的速度方面,Spark和Hadoop這一代框架都輕鬆勝過傳統框架。 Spark利用記憶體處理數據,因而速度比基於磁碟的Hadoop大幅加快(快100倍)。
但如果得到一點幫助,Spark可以運作得還要快。如果結合Spark和Redis(流行的記憶體資料結構儲存技術),你可以再次大幅提升處理分析任務的效能。這歸功於Redis經過優化的資料結構,以及它在執行操作時,能夠盡量降低複雜性和開銷。使用連接器連接到Redis的資料結構和API能夠進一步加快Spark的速度。
提速幅度有多大?如果Redis和Spark結合使用,結果證明,處理資料(以便分析下面描述的時間序列資料)的速度比Spark單單使用進程記憶體或堆外快取來儲存資料要快45倍――不是快45%,而是快整整45倍!
分析交易速度的重要性日益逐漸增長,因為許多公司需要實現與業務交易速度同等快速的分析。越來越多的決策變得自動化,驅動這些決策所需的分析應該要即時進行。 Apache Spark是一種出色的通用資料處理架構;雖然它並非***即時,還是往更及時地讓資料發揮用途邁出了一大步。
Spark使用彈性分散式資料集(RDD),這些資料集可以儲存在易失性記憶體或HDFS之類的持久性儲存系統中。所有分佈在Spark叢集的節點上的RDD都保持不變,但可以透過轉換操作建立其他RDD。
Spark RDD
#RDD是Spark中的重要抽象物件。它們代表了一種高效地將資料呈現給迭代進程的容錯方法。使用記憶體進行處理意味著相較於使用HDFS和MapReduce,處理時間將減少若干數量級。
Redis是專門為高性能設計的。亞毫秒延遲得益於經過最佳化的資料結構,由於讓操作可以在鄰近資料儲存的地方執行,提高了效率。這種資料結構不僅可以有效地利用記憶體、降低應用程式的複雜性,還降低了網路開銷、頻寬消耗量和處理時間。 Redis支援多個資料結構,其中包括字串、集合、有序集合、雜湊、位圖、hyperloglog和地理空間索引。 Redis資料結構就像樂高積木一樣,為開發人員提供了簡單的通道來實現複雜功能。
為了直覺地顯示這個資料結構如何簡化應用程式的處理時間和複雜性,我們不妨以有序集合(Sorted Set)資料結構為例。有序集合基本上是一組按分數排序的成員。
Redis有序集合
你可以將多種類型的資料儲存在這裡,它們自動由分數來排序。儲存在有序集合中的常見數據類型包括:物品(按價格)、商品名稱(按數量)、股價等時間序列數據,以及時間戳等感測器讀數。
有序集合的魅力在於Redis的內建操作,讓範圍查詢、多個有序集合交叉、按成員等級和分數檢索及更多事務可以簡單地執行,具有***的速度,還可以大規模執行。內建操作不僅節省了需要編寫的程式碼,記憶體中執行操作還縮短了網路延遲、節省了頻寬,因而能夠實現亞毫秒延遲的高吞吐量。如果將有序集合用於分析時間序列數據,相較於其他記憶體鍵/值儲存系統或基於磁碟的資料庫,通常可以將效能提升好幾個數量級。
Spark-Redis連接件是為了提高Spark的分析能力而由Redis團隊開發的。這個程式包讓Spark得以使用Redis作為其資料來源之一。透過此連接件,Spark可以直接存取Redis的資料結構,從而顯著提高各種類型的分析效能。
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來分析,同時大幅提升了查詢效能。
在此橫向比較中所使用的時間序列資料包括:隨機產生的金融資料以及32年內每天的1024檔股票。每隻股票由各自的有序集合來表示,分數是日期,數據成員包括開盤價、***價、***價、收盤價、成交量以及調整後的收盤價。 The following image depicts the data representation in a Redis sorted set used for Spark analysis:
Spark Redis時間序列
#在上述上述範例中,就有序集合AAPL而言,有表示每天(1989-01-01)的分數,還有全天中表示為一個相關行的多個值。只要在Redis中使用一個簡單的ZRANGEBYSCORE指令,就可以執行此操作:取得某個時間片的所有值,以取得指定的日期範圍內的所有股價。 Redis可以比其他按鍵/值儲存系統更快執行這類查詢,速度可以快100倍。
這番橫向比較證實了效能提升。結果發現,Spark使用Redis執行時間片查詢的速度比Spark使用HDFS快135倍,比Spark使用堆內(進程)記憶體或Spark使用Tachyon作為堆外快取快45倍。下圖顯示了不同場景所比較的平均執行時間:
#Spark 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資料結構用於機器學習和圖形分析同樣有望為這些工作負載帶來執行時間大幅縮短的好處。以上是Redis怎麼讓Spark提速的詳細內容。更多資訊請關注PHP中文網其他相關文章!