如何提升Spark數據處理的效率?

Spark表明着下一代大數據處理技術,而且,藉着開源算法和計算節點集羣分佈式處理,Spark和Hadoop在執行的方式和速度已經遠遠的超過傳統單節點的技術架構。但Spark利用內存進行數據處理,這讓Spark的處理速度超過基於磁盤的Hadoop 100x 倍。
但Spark和內存數據庫Redis結合後可顯著的提升Spark運行任務的性能,這源於Redis優秀的數據結構和執行過程,從而減少數據處理的複雜性和開銷。Spark經過一個Redis鏈接器能夠訪問Redis的數據和API,加速Spark處理數據。
Spark和Redis結合使用到底有多大的性能提高呢?結合這二者來處理時序數據時能夠提升46倍以上——而不是提升百分之四十五。
爲何這些數據處理速度的提高是很重要的呢?如今,愈來愈多的公司指望在交易完成的同時完成對應的數據分析。公司的決策也須要自動化,而這些須要數據分析可以實時的進行。Spark是一個用的較多的數據處理框架,但它不能作到百分之百實時,要想作到實時處理Spark還有很大一步工做須要作
Spark RDD
Spark採用彈性分佈式數據集(RDD),可將數據存在易變的內存中或持久化到磁盤上。 RDD具備不可變化性,分佈式存儲在Spark集羣的各節點,RDD通過tansform操做後建立出一個新的RDD。RDD是Spark中數據集的一種重要抽象,具備良好的容錯性、高效的迭代處理。
Redis
Redis天生爲高性能設計,經過良好的數據存儲結構能達到亞毫秒級的延遲。Redis的數據存儲結構不只僅提升內存的利用和減少應用的複雜性,也下降了網絡負載、帶寬消耗和處理時間。Redis數據結構包括字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets), bitmaps, hyperloglogs 和 地理空間(geospatial)索引半徑查詢。
下面來展現Redis的數據結構如何來簡化應用的處理時間和複雜度。這裏用有序集合來舉例,一個以評分(score)大小排序的元素集合。
Redis能存儲多種數據類型,並自動的以評分(score)排序。常見的例子有,按價格排序的商品,以閱讀數排序的文章名,股票價格時序數據,帶時間戳的傳感器讀數。
有序集合依賴Redis優秀的內建操做能夠實現範圍查詢、求交集,能夠很是快地(O(log(N)))完成添加,刪除和更新元素的操做。Redis內建函數不只減小代碼開發,在內存中執行也減少了網絡延時和帶寬消耗,可達到亞毫秒級的吞吐延遲。特別地,對時序數據集合來說,有序集合數據結構比使用內存鍵值對或使用磁盤的數據庫,能給數據分析帶來數量級上的性能提高。
Spark-Redis connector
爲了提升Spark數據分析的能力,Redis團隊開發了一個Spark-Redis connector,它使得Spark能夠直接使用Redis做爲數據源,瓜熟蒂落的Spark也能使用Redis的各數據結構,進而顯著的提高Spark分析數據的速度。算法


爲了展現Spark結合Redis所產生的效果,Redis團隊拿時序數據集合作基準測試,測試了Spark在不一樣狀況下執行時間範圍查詢:Spark使用堆外內存;Spark使用Tachyon做爲堆外緩存;Spark使用HDFS存儲;Spark結合Redis使用。
Redis團隊改進了Cloudera的Spark分析時序數據的包,採用Redis有序集合數據結構加速時序數據分析,而且實現Spark訪問Redis各種數據結構的接口。此Spark-Redis時序開發包主要作了兩件事:
它讓Redis節點與Spark集羣的節點自動匹配,確保每一個Spark節點都使用本地Redis節點,這樣能夠明顯的優化延遲時間;
集成Spark DataFrame和Spark讀取數據源,使得Spark SQL查詢可自動轉化,並能藉助Redis能有效的恢復數據。
換句話說,使用Spark-Redis時序開發包意味着用戶無需擔憂Spark和Redis二者如何使用。用戶使用Spark SQL進行數據分析能夠得到極大的查詢性能提高。
基準測試
基準測試的時序數據集是跨度32年的1024個股票交易市場按天隨機生成的數據。每一個股票交易所都有有序數據集,以日期和元素屬性(開盤價、最高價、最低價、收盤價等)排序,在Redis中以有序數據結構存儲,採用Spark進行數據分析,描述如圖4.
在上述列子中,就有序集合AAPL來看,有序數據集合以天爲評分(score,以藍色表示),天天相關的值爲一行(Member,以灰色表示)。在Redis中,只要執行一個ZRANGEBYSCORE操做就能夠獲取一個指定時間範圍內的全部股票數據,而且Redis執行此查詢要比其餘Key/Value數據庫快100倍。
橫向比較各類狀況的基準測試,Spark結合Redis執行時間片的查詢速度比Spark使用HDFS快135倍、比Spark使用堆內內存或Spark使用Tachyon做爲堆外內存要快45倍。
Spark-Redis其它應用
按照「Getting Started with Spark and Redis」指南,你能夠一步步安裝Spark集羣和使用Spark-Redis包。它提供一個簡單的wordcount的例子展現如何使用Spark結合Redis。待你熟練使用後能夠本身進一步挖掘、優化其餘的Redis數據結構。
Redis的有序集合數據結構很適合時序數據集合,而Redis其餘數據結構(好比,列表(lists), 集合(sets)和 地理空間(geospatial)索引半徑查詢)也能進一步豐富Spark的數據分析。當使用Spark抽取地理空間信息來獲取新產品的人羣偏好和鄰近中心的位置,可結合Redis的地理空間(geospatial)索引半徑查詢來優化。
Spark支持一系列的數據分析,包括SQL、機器學習、圖計算和流式數據。Spark自己的內存數據處理能力有必定的限制,而藉着Redis可讓Spark更快的作數據分析。其實Spark的DataFrame和Datasets已經在作相似的優化,先把數據進行結構化放在內存裏進行計算,而且Datasets能夠省掉序列化和反序列化的消耗。結合Spark和Redis,藉助Redis的共享。
 數據庫

相關文章
相關標籤/搜索