一些內(nèi)存數(shù)據(jù)結(jié)構(gòu)比其他數(shù)據(jù)結(jié)構(gòu)來得更高效;如果充分利用Redis骤坐,Spark運行起來速度更快绪杏。
Apache Spark已逐漸儼然成為下一代大數(shù)據(jù)處理工具的典范。通過借鑒開源算法纽绍,并將處理任務(wù)分布到計算節(jié)點集群上蕾久,無論在它們在單一平臺上所能執(zhí)行的數(shù)據(jù)分析類型方面,還是在執(zhí)行這些任務(wù)的速度方面拌夏,Spark和Hadoop這一代框架都輕松勝過傳統(tǒng)框架僧著。Spark利用內(nèi)存來處理數(shù)據(jù),因而速度比基于磁盤的Hadoop大幅加快(快100倍)障簿。
但是如果得到一點幫助盹愚,Spark可以運行得還要快。如果結(jié)合Spark和Redis(流行的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲技術(shù))站故,你可以再次大幅提升處理分析任務(wù)的性能皆怕。這歸功于Redis經(jīng)過優(yōu)化的數(shù)據(jù)結(jié)構(gòu),以及它在執(zhí)行操作時西篓,能夠盡量降低復(fù)雜性和開銷愈腾。通過借助連接件訪問Redis數(shù)據(jù)結(jié)構(gòu)和API,Spark可以進一步加快速度岂津。
提速幅度有多大?如果Redis和Spark結(jié)合使用虱黄,結(jié)果證明,處理數(shù)據(jù)(以便分析下面描述的時間序列數(shù)據(jù))的速度比Spark單單使用進程內(nèi)存或堆外緩存來存儲數(shù)據(jù)要快45倍――不是快45%吮成,而是快整整45倍!
為什么這很重要?許多公司日益需要分析交易的速度與業(yè)務(wù)交易本身的速度一樣快橱乱。越來越多的決策變得自動化辜梳,驅(qū)動這些決策所需的分析應(yīng)該實時進行。Apache Spark是一種出色的通用數(shù)據(jù)處理框架;雖然它并非百分之百實時仅醇,還是往更及時地讓數(shù)據(jù)發(fā)揮用途邁出了一大步冗美。
Spark使用彈性分布式數(shù)據(jù)集(RDD),這些數(shù)據(jù)集可以存儲在易失性內(nèi)存中或HDFS之類的持久性存儲系統(tǒng)中析二。RDD不會變化粉洼,分布在Spark集群的所有節(jié)點上,它們經(jīng)轉(zhuǎn)換化可以創(chuàng)建其他RDD叶摄。
Spark RDD
RDD是Spark中的重要抽象對象属韧。它們代表了一種高效地將數(shù)據(jù)呈現(xiàn)給迭代進程的容錯方法。由于處理工作在內(nèi)存中進行蛤吓,這表示相比使用HDFS和MapReduce宵喂,處理時間縮短了好幾個數(shù)量級。
Redis是專門為高性能設(shè)計的会傲。亞毫秒延遲得益于經(jīng)過優(yōu)化的數(shù)據(jù)結(jié)構(gòu)锅棕,由于讓操作可以在鄰近數(shù)據(jù)存儲的地方執(zhí)行,提高了效率淌山。這種數(shù)據(jù)結(jié)構(gòu)不僅可以高效地利用內(nèi)存裸燎、降低應(yīng)用程序的復(fù)雜性,還降低了網(wǎng)絡(luò)開銷泼疑、帶寬消耗量和處理時間德绿。Redis數(shù)據(jù)結(jié)構(gòu)包括字符串、集合退渗、有序集合移稳、哈希、位圖会油、hyperloglog和地理空間索引个粱。開發(fā)人員可以像使用樂高積木那樣使用Redis數(shù)據(jù)結(jié)構(gòu)――它們就是提供復(fù)雜功能的簡單管道。
為了直觀地表明這種數(shù)據(jù)結(jié)構(gòu)如何簡化應(yīng)用程序的處理時間和復(fù)雜性翻翩,我們不妨以有序集合(Sorted Set)數(shù)據(jù)結(jié)構(gòu)為例几蜻。有序集合基本上是一組按分數(shù)排序的成員。
Redis有序集合
你可以將多種類型的數(shù)據(jù)存儲在這里体斩,它們自動由分數(shù)來排序。存儲在有序集合中的常見數(shù)據(jù)類型包括:物品(按價格)颖低、商品名稱(按數(shù)量)絮吵、股價等時間序列數(shù)據(jù),以及時間戳等傳感器讀數(shù)忱屑。
有序集合的魅力在于Redis的內(nèi)置操作蹬敲,讓范圍查詢暇昂、多個有序集合交叉、按成員等級和分數(shù)檢索及更多事務(wù)可以簡單地執(zhí)行伴嗡,具有無與倫比的速度急波,還可以大規(guī)模執(zhí)行。內(nèi)置操作不僅節(jié)省了需要編寫的代碼瘪校,內(nèi)存中執(zhí)行操作還縮短了網(wǎng)絡(luò)延遲澄暮、節(jié)省了帶寬,因而能夠?qū)崿F(xiàn)亞毫秒延遲的高吞吐量阱扬。如果將有序集合用于分析時間序列數(shù)據(jù)泣懊,相比其他內(nèi)存鍵/值存儲系統(tǒng)或基于磁盤的數(shù)據(jù)庫,通陈榛蹋可以將性能提升好幾個數(shù)量級馍刮。
Redis團隊的目標是提升Spark的分析功能,為此開發(fā)了Spark-Redis連接件窃蹋。這個程序包讓Spark得以使用Redis作為其數(shù)據(jù)源之一卡啰。該連接件將Redis的數(shù)據(jù)結(jié)構(gòu)暴露在Spark面前,可以針對所有類型的分析大幅提升性能警没。
Spark Redis連接件
為了展示給Spark帶來的好處匈辱,Redis團隊決定在幾種不同的場景下執(zhí)行時間片(范圍)查詢,以此橫向比較Spark中的時間序列分析惠奸。這幾種場景包括:Spark在堆內(nèi)內(nèi)存中存儲所有數(shù)據(jù)梅誓,Spark使用Tachyon作為堆外緩存,Spark使用HDFS佛南,以及結(jié)合使用Spark和Redis梗掰。
Redis團隊使用Cloudera的Spark時間序列程序包,構(gòu)建了一個Spark-Redis時間序列程序包嗅回,使用Redis有序集合來加快時間序列分析及穗。除了讓Spark可以訪問Redis的所有數(shù)據(jù)結(jié)構(gòu)外,該程序包另外做兩件事:
自動確保Redis節(jié)點與Spark集群一致绵载,從而確保每個Spark節(jié)點使用本地Redis數(shù)據(jù)埂陆,因而優(yōu)化延遲。
與Spark數(shù)據(jù)幀和數(shù)據(jù)源API整合起來娃豹,以便自動將Spark SQL查詢轉(zhuǎn)換成對Redis中的數(shù)據(jù)來說最高效的那種檢索機制焚虱。
簡單地說,這意味著用戶不必擔心Spark和Redis之間的操作一致性懂版,可以繼續(xù)使用Spark SQL來分析鹃栽,同時大大提升了查詢性能。
用于這番橫向比較的時間序列數(shù)據(jù)包括:隨機生成的金融數(shù)據(jù)躯畴,每天1024支股票民鼓,時間范圍是32年薇芝。每只股票由各自的有序集合來表示,分數(shù)是日期丰嘉,數(shù)據(jù)成員包括開盤價夯到、最高價、最低價饮亏、收盤價耍贾、成交量以及調(diào)整后的收盤價。下圖描述了用于Spark分析的Redis有序集合中的數(shù)據(jù)表示:
Spark Redis時間序列
在上述例子中克滴,就有序集合AAPL而言逼争,有表示每天(1989-01-01)的分數(shù),還有全天中表示為一個相關(guān)行的多個值劝赔。只要在Redis中使用一個簡單的ZRANGEBYSCORE命令誓焦,就可以執(zhí)行這一操作:獲取某個時間片的所有值,因而獲得指定的日期范圍內(nèi)的所有股價着帽。Redis執(zhí)行這種類型的查詢的速度比其他鍵/值存儲系統(tǒng)快100倍杂伟。
這番橫向比較證實了性能提升。結(jié)果發(fā)現(xiàn)仍翰,Spark使用Redis執(zhí)行時間片查詢的速度比Spark使用HDFS快135倍赫粥,比Spark使用堆內(nèi)(進程)內(nèi)存或Spark使用Tachyon作為堆外緩存快45倍。下圖顯示了針對不同場景所比較的平均執(zhí)行時間:
Spark Redis橫向比較
如果你想親自嘗試一下予借,不妨遵照這篇可下載的逐步指南:《Spark和Redis使用入門》(https://redislabs.com/solutions/spark-and-redis)越平。該指南將逐步引導(dǎo)你安裝典型的Spark集群和Spark-Redis程序包。它還用一個簡單的單詞計數(shù)例子灵迫,表明了可以如何結(jié)合使用Spark和Redis秦叛。你在試用過Spark和Spark-Redis程序包后,可以進一步探究利用其他Redis數(shù)據(jù)結(jié)構(gòu)的更多場景瀑粥。
雖然有序集合很適合時間序列數(shù)據(jù)挣跋,但Redis的其他數(shù)據(jù)結(jié)構(gòu)(比如集合、列表和地理空間索引)可以進一步豐富Spark分析狞换。設(shè)想一下:一個Spark進程試圖根據(jù)人群偏好以及鄰近市中心避咆,獲取在哪個地區(qū)發(fā)布新產(chǎn)品效果最好的信息。現(xiàn)在設(shè)想一下修噪,內(nèi)置分析自帶的數(shù)據(jù)結(jié)構(gòu)(比如地理空間索引和集合)可以大大加快這個進程查库。Spark-Redis這對組合擁有無限的應(yīng)用前景。
Spark支持一系列廣泛的分析黄琼,包括SQL、機器學習、圖形計算和Spark Streaming现柠。使用Spark的內(nèi)存處理功能只能讓你達到一定的規(guī)模弛矛。然而有了Redis后,你可以更進一步:不僅可以通過利用Redis的數(shù)據(jù)結(jié)構(gòu)來提升性能丈氓,還可以更輕松自如地擴展Spark周循,即通過充分利用Redis提供的共享分布式內(nèi)存數(shù)據(jù)存儲機制,處理數(shù)百萬個記錄万俗,乃至數(shù)十億個記錄。
時間序列這個例子只是開了個頭闰歪。將Redis數(shù)據(jù)結(jié)構(gòu)用于機器學習和圖形分析同樣有望為這些工作負載帶來執(zhí)行時間大幅縮短的好處。