分布式数据流计算系统的数据缓存技术综述
點擊上方藍字關注我們
分布式數據流計算系統的數據緩存技術綜述
袁旭初,?付國,?畢繼澤,?張巖峰,?聶鐵錚,?谷峪,?鮑玉斌,?于戈
東北大學計算機科學與工程學院,遼寧 沈陽 110169
論文引用格式:
袁旭初,?付國,?畢繼澤,?張巖峰,?聶鐵錚,?谷峪,?鮑玉斌,?于戈.分布式數據流計算系統的數據緩存技術綜述.?大數據[J], 2020, 6(3):101-116
YUAN X C, FU G, BI J Z, ZHANG Y F, NIE T Z, GU Y, BAO Y B, YU G.Survey on data caching technology of distributed dataflow system.?Big Data Research[J], 2020, 6(3): 101-116
1 引言
計算機的計算模型可以分為控制流和數據流兩大類。控制流計算模型按指令的順序驅動操作,計算機內的數據是否參加運算依賴于當時執行的指令。圖靈機理論是控制流計算機的基礎,控制流計算機也被稱為馮·諾伊曼型計算機,它是主流計算機一直采用的基本體系結構。控制流天然擅長描述控制邏輯,但其使用變量緩存中間結果,不利于并行或異構計算抽象。數據流計算模型采用數據驅動方式,只有當一條或一組指令需要的操作數全部準備好時,才能激發相應指令的一次執行,執行結果又流向等待這一數據的下一條或一組指令,以驅動該條或該組指令的執行。指令之間天然的依賴關系決定了指令的執行順序,指令按照數據流圖執行。
數據流計算模型在許多方面優于控制流計算模型,其優點主要體現在以下3個方面。
(1)高度并行計算
在數據流方法中,由于沒有指令執行順序的限制,從理論上來說,指令執行更加靈活,通過系統優化可以獲得最大的并行性。相似地,其靈活性同樣適用于高度異構計算。
(2)支持流水線處理
由于在指令中直接使用數值本身,而不是使用存放數值的地址,因此可以在過程級及指令級充分開發異步并行性,把串行執行算子實際處理的數據變成一條異步處理流水線,即前一個算子處理完部分結果后就讓后一個算子開始處理。
(3)函數式編程
面向數據流的編程模型對豐富的算子進行了抽象,通過用戶定義函數為算子指定用戶處理邏輯,用戶無須使用變量維護中間狀態,實現優化空間巨大且靈活的函數式編程。
目前許多主流的計算系統(如Spark、Flink、TensorFlow、Google Dataflow等)采用了數據流編程模型。一個數據流程序中一般包含算子和中間結果數據兩大類元素,算子還包含數據源算子(source)、數據池算子(sink)、轉換算子(transformer)。數據源是數據的生產者,如文件或者視頻采集設備;數據池指定程序輸出的位置,如文件或者數據庫;轉換算子是系統提供或者用戶自定義的數據操作集合,描述對一個或多個輸入數據的處理過程,同時輸出一個或多個中間結果數據。中間結果數據位于各算子之間,是由算子產生或供算子消費的數據。數據流處理程序采用算子連接數據流的模式,當一個數據流程序被執行的時候,它會被映射為一個有向無環圖(directed acyclic graph,DAG),數據流圖的頂點為算子,數據流圖的邊為中間結果數據。程序啟動時從一個或多個數據源算子開始,結束于一個或多個數據池算子。
數據流模型不僅被應用于內存計算中,也被應用到分布式集群(如Spark)或者異構計算環境(如TensorFlow)中,算子可能被設計為跨多臺機器的分布式算子,有些算子在CPU執行,有些算子在GPU執行,甚至是跨CPU-GPU執行。而算子之間數據的流動需要考慮跨網絡或者跨CPU-GPU的情況,數據流的維護和管理也不僅在內存中完成。在這種分布式數據流系統和異構數據流系統中,算子和數據不再統一存在于單機內存中。算子之間數據生產和數據消化的速度不一致可能會導致數據堆積或者算子閑置等問題,造成嚴重的空間開銷,影響數據流系統的效率。為了支持高效的數據流系統,需要為分布式數據流系統和異構數據流系統設計數據流的緩存系統,以保證數據流在分布式計算節點之間或者異構CPU-GPU之間的高效緩存和移動。然而,目前并沒有針對分布式或異構數據流系統的通用數據流緩存系統。
現有的消息隊列(message queue,MQ)系統(如Kafka等)常被用作數據源算子的數據緩存系統,特別是為視頻采集設備這種主動推送數據源提供數據緩沖支持。這些系統利用優化的分布式存儲將數據消息存到保持數據有序性的消息隊列中,可以在一定程度上滿足緩存需求。
本文選取Kafka、RabbitMQ、ActiveMQ、Pulsar 5個典型的分布式消息隊列系統進行系統分析,并分析未來的數據流緩存系統的需求和研究方向。
2 分布式數據流計算系統概述
2.1 數據流計算模型
計算模型是對計算任務完成過程的一種抽象描述,主要由3個部分組成:計算任務的描述方法、計算任務的執行機構以及計算任務在執行機構上的運行方法。根據計算任務的描述形式,可以將計算模型分為控制流計算模型和數據流計算模型。在控制流計算模型中,采用控制流的方式描述計算任務。控制流即以控制驅動程序。以下面包含控制流概念的代碼1為例,由于控制條件的存在,無論輸入是多少,總是執行被控制的部分,而不執行另一部分。在控制流計算模型中,進行數據傳遞的關鍵是借助變量保存中間狀態。通過中間變量,可以根據任務的執行邏輯將其劃分為不同的階段,這樣一來,每個階段只需要完成一部分邏輯子功能即可。
將代碼1的控制邏輯用數據流的方式表示,如代碼2所示,代碼的執行邏輯以流水線的方式按順序執行。不論是否滿足條件,均執行相應代碼,只不過數據總是只滿足一種情況,最后將兩部分的結果做交集。如果上游輸入數據不斷到來,這段代碼便可以不斷地執行下去,并且總是同時執行真(ture)和假(false)的分支邏輯,但是無論何時,總有一個分支上的流水線的數據集為空。
在數據流計算模型中,用數據流圖的形式表示計算任務。根據任務中不同子任務的依賴關系將其轉化為數據流圖,復雜的程序邏輯便可以容易地以流水線的方式執行,同時提高執行效率。數據流編程模型是以數據驅動程序的,一個處理邏輯的輸出作為下一個處理邏輯的輸入,無須維護數據的中間狀態,將這種處理邏輯抽象為算子,通常不同算子之間的任務相互獨立,可以在不同的線程上執行。在分布式或異構的環境下,算子也可以在不同的機器或容器內執行。只要數據到達,算子即可開始處理,從而使得各個算子形成流水線的結構,數據則在流水線中被并行處理,這種處理方式在處理具有復雜依賴關系的程序邏輯時有天然的優勢。
在數據流圖中,用節點和邊描述程序邏輯。其中,節點表示操作,即數據流的邏輯計算單元,有向邊表示數據依賴關系。數據流計算模型的核心思想是用數據控制計算。當一個操作所需的數據全部準備完畢之后,便可以啟動運算。當只有部分數據到達時,則需要等待。當一個操作執行完成并將結果傳遞給下一個操作后,無論下一個操作是否能正常執行,這個操作都可以立刻對新數據進行計算。如此,整個程序便可以以流水線的方式并行執行。圖1顯示了在數據流系統Spark中分別對2組數據進行映射(map)和過濾(filter)之后再進行連接(join)的執行過程,彈性分布式數據集(RDD)表示Spark中的基本數據集。首先,數據集1 (RDD1)和數據集2(RDD2)準備完畢,并被輸入計算節點中,分別執行映射和過濾操作,這兩步沒有相互依賴的關系,也沒有執行先后之分。然后,當連接算子的2個操作數都準備完畢后,即數據集3(RDD3)和數據集4(RDD4)已經計算得出時,執行連接操作。最后,計算出結果,數據向下一個計算單元傳輸。在連接操作進行的同時,如果有新的映射或過濾操作數到達,映射操作或過濾操作可以同時執行。如此,數據流圖中多個計算節點便可以以流水線的方式并行執行。當一個程序有多個這樣的計算過程時,它們之間也可以以流水線的方式并行執行。
傳統的計算機采用控制流作為計算機的核心,即馮·諾伊曼體系結構,它通過一個中央處理器執行計算任務,用程序計數器根據程序控制邏輯控制指令依次執行。數據流的體系結構不同于傳統的馮·諾伊曼體系結構,它以數據為驅動,數據在程序運行過程中起主導作用,這對于計算機發展來說是一個突破。針對數據流計算機的具體設計方案有很多,學術界和工業界也相繼成功研制出一些專用機。以全新的體系結構設計出的數據流計算機不再需要CPU,而是把功能分散到各個部件中,取消了程序計數器,以數據是否到達異步控制每一條指令的執行,這樣更容易實現數據的并行。但這種新型的體系結構僅適用于某些特殊應用場景,還不能代替傳統的控制流計算機。進入20世紀80年代后,隨著多線程概念的發展,學術界和工業界的研究者更多地將研究重點放在更高層次的線程級并行上,結合傳統控制流與數據流的優勢研究數據流計算模型。
圖1???數據流模型示例
雖然在硬件上已經能夠做到支持數據流并行,但在軟件生態上仍發展落后,難以在實際生產中應用。數據流計算模型在算法程序設計中的優勢引起了廣大研究者的關注,與傳統并行計算模型算法相比,基于數據流的并行計算模型具有支持度高、可拓展性好、性能功耗比高等優點,許多數據流執行模型相繼被提出。而由于大數據的快速發展,對大數據的處理需要更加高效的平臺,因此在現有硬件的基礎上,以數據流為核心的大數據處理平臺應運而生。
2.2 主流分布式數據流系統
依賴數據流的概念,工業界發展出許多支持大數據處理、機器學習等任務的系統,這些系統在大數據、人工智能時代發揮著舉足輕重的作用。結合控制流和數據流的優勢,Suettlerlein等人、Flink、TensorFlow、Google Dataflow等。這些系統在多次的版本迭代中不斷適應變化的需求,發揮著越來越重要的作用,展現出越來越強大的性能,逐步實現對異構環境的支持、對新硬件的支持以及在云環境下的應用等。當然,還有一些系統由于一些限制并沒有得到大規模的應用,但在數據流系統的應用探索中也扮演著重要的角色,例如HAMR基于Codelet執行模型,并拓展到集群系統中,實現了更好的資源利用和任務同步,同時支持批處理和實時流處理。Naiad引入時間戳(timestamp)的概念描述任意復雜的流式計算,同時也解決了一般分布式系統難以處理的增量計算問題。Yita由中興飛流信息科技有限公司研發,是基于數據流的運行時系統,采用特有的、動態的、細粒度的任務調度及資源管理,在計算性能、資源消耗等方面表現優異。幾個目前比較流行的數據流系統如下。
(1)Spark
Spark是由美國加州大學伯克利分校的AMP實驗室于2009年開發的基于內存計算的大數據并行處理框架。作為大數據處理平臺的后起之秀,Spark在2014年打破了由Hadoop保持的基準排序記錄,對于同樣的數據集,Spark僅用Hadoop十分之一的計算資源便將計算速度提高3倍。Spark以其運行速度快、易使用、通用性好以及運行模式多樣的優勢得到了眾多開發者的青睞。Spark最大的特點就是基于內存,數據和中間結果都存儲在內存中,避免了頻繁的磁盤I/O開銷。除此之外,Spark采用數據流計算模型,將一個應用劃分為不同的任務,然后根據其依賴關系轉化為DAG,在DAG中,各個任務以數據流的模式執行,極大地開發了程序中潛在的并行性,大大加快了執行效率。
(2)Google Dataflow
Google Dataflow是由谷歌公司研究開發的一個數據處理模型,其目的在于提供一種統一批處理和流處理的系統。Dataflow模型基于事件時間(event-time)實現對流式數據的順序處理,支持非對齊的窗口聚合,在正確性、時延和成本之間能做到較好的平衡,并實現數據處理中的邏輯概念和底層物理之間的解耦。目前已經在Google Cloud(谷歌云)中使用,其針對批數據和流數據提供統一的應用程序接口(application programming interface,API),開發者能夠更加聚焦于數據邏輯本身定義數據處理流水線,然后由Google Cloud執行。
(3)Flink
Flink起源于一個叫作Stratosphere的研究項目,旨在建立下一代大數據分析引擎,于2014年4月成為Apache的孵化項目。Flink的基本模型也是數據流模型。它同時支持批處理和流處理,將計算任務轉化為DAG,以數據流的模式執行。相對于Spark框架而言,Flink支持更高吞吐率、低時延、高性能的流處理,更適合對實時性要求高的場景。
(4)TensorFlow
TensorFlow是谷歌公司在2015年開源的通用高性能計算庫,用于機器學習和深度神經網絡方面的研究,它的通用性使其也可以應用于多種計算領域。TensorFlow也采用數據流的形式進行計算。數據流圖中的節點表示數學操作,邊表示節點之間相互聯系的數據數組,即張量。一旦輸入端的所有張量準備好,節點將被分配到各種計算設備中異步并行地執行運算。
數據流打破了并行度的限制,更容易實現超大規模的并行,基于數據流的系統在許多方面有發展的空間。首先,在大數據和高性能計算的應用需求下,基于數據流的系統應當與體系結構結合起來,協同發展,使得應用可以拓展到更大規模的平臺上;其次是實現更細粒度的資源管理與任務管理,提升并行性,保證系統的兼容性,使其可在不同硬件平臺進行移植;最后,數據流系統在系統可靠性以及能耗方面都有深入研究的空間。
3 典型分布式數據流計算系統中的緩存技術分析
如前所述,數據流系統常使用消息隊列系統對數據源進行緩存處理。在數據流系統中,并沒有一個統一的緩存管理機制進行算子之間的數據緩存。一般系統會通過多種機制處理算子之間速度不匹配的問題,包括系統底層實現和手動參數設置。下面對這些技術進行介紹。
(1)設置合理的并行度
數據流系統在處理大數據問題時很重要的一點在于可以實現流水線并行,這大大提高了傳統串行處理的效率。但并行處理的能力跟硬件資源密切相關,因此在進行數據流作業時,要合理設置作業的并行度,充分利用硬件資源的性能,提升作業的處理速度。以Spark為例,設置并行度是Spark應用程序性能調優的重要方法之一,通過合理設置并行度,充分利用集群資源,避免資源的閑置,減少每個任務(task)要處理的數據量,提升整個Spark作業的處理速度。
(2)流量控制
在網絡通信中,經常會出現這樣的情況,生產者(producer)端產生數據的速度比消費者(consumer)端處理數據的速度快或者慢,如果僅在發送端和接收端設置一個緩存區,明顯是不夠的。如果緩存區空間是有限的,那么很快緩存區就會被耗盡,新到達的數據只能被丟棄;如果緩存區空間是無限的,那么緩存區會不斷增長,直到內存耗盡。為了解決緩存問題,需要通過流量控制解決上下游的速度差。流量控制通常有2種解決方案:靜態限速和動態反壓。靜態限速通過限制發送端的發送速率實現,但這種方式有2點限制:第一是無法預估接收端能承受多大的速率,第二是其承受能力通常也會動態地波動。一般以動態反壓的方式進行流量控制,接收端根據自己的處理情況及時地給予發送端反饋,告知發送端自己能承受的傳輸速率,使得發送端能實時地調整自己的發送速率以匹配接收端的處理能力。
(3)數據本地化
在分布式系統中,數據分布存儲在各個節點中。為盡可能地減少不必要的網絡傳輸,任務在執行前都會根據數據的分區信息進行分配,優先將其分配到要計算的數據所在的節點上。當本地計算資源不足時,任務會暫停,以等待空閑的資源釋放出來;當等待一段時間還沒有空閑的計算資源時,便會降低數據本地化級別,將任務轉移到其他進程、節點甚至機架上運行。這似乎是與最快地處理任務的目標相矛盾的,但這一措施盡量地避免了網絡傳輸通信帶來的性能開銷,同時也比較好地處理了各個節點計算資源和計算任務之間不匹配的問題,令作業的處理效率達到極致。
除了上述機制,各個數據流系統中還有許多用于解決算子之間可能存在的速度不匹配問題的措施,如代碼優化、通信優化等。
4 典型分布式消息隊列系統
4.1 分布式消息隊列系統
分布式消息隊列系統又稱為消息中間件,是企業IT系統的核心組件,具有可靠投遞、低耦合、流量控制、廣播、最終一致性等功能,是異步遠程過程調用(remote procedure call,RPC)的主要手段之一。由于數據源的差異性,尤其針對實時數據,數據流系統往往需要利用消息隊列對數據進行緩存,再從中讀取及處理數據。利用消息隊列的特性,數據流系統可以更方便地處理數據。因此消息隊列系統作為數據流系統數據源的緩存系統得到了廣泛的應用。目前有很多流行的分布式消息系統,如頂級項目Kafka以及炙手可熱的新星Pulsar等。下面對其中幾個進行簡單介紹。
(1)Kafka
Apache Kafka集群(對集群進行管理)。生產者產生消息后,將其推送(push)到broker中,當消費者需要消費消息時從broker中拉取(pull)。
圖2???Kafka系統架構
Kafka主要支持簡單的消息隊列功能,一般適用于在大數據類的系統中執行實時數據計算、日志采集等任務,總體來說功能比較單一,但這換來的是超高的吞吐量和毫秒級的時延,在單機下吞吐量可以達到十萬級,而且還提供了優秀的可用性及可靠性,方便拓展,活躍的社區也保證了使用的便易性。但為了保證良好的性能,Kafka一般要求支撐較少的主題(topic)數量。除此之外,Kafka存在消息被重復消費的問題,這對數據準確性會有一些影響。
(2)RabbitMQ
RabbitMQ是一個開源的消息緩存系統,最初創建于2007年。RabbitMQ使用一個交換器接收broker的消息,并將它們推送給消費者。RabbitMQ不是面向磁盤的,即大多數消息傳遞操作是在內存中進行的,只有在內存不足或者指定存儲消息時,才會將消息持久化到磁盤中。RabbitMQ最初起源于金融系統,用于在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。RabbitMQ是高級消息隊列協議(advanced message queuing protocol,AMQP)的一個開源實現,其系統架構如圖3所示。RabbitMQ沒有使用第三方分布式集群管理服務(如Kafka中的ZooKeeper)對集群進行管理, Erlang語言可以很好地實現分布式管理。RabbitMQ比較特別的一點是具有靈活的路由功能,在消息進入隊列之前,首先通過交換器(exchange)對消息進行路由。RabbitMQ可以利用內置的exchange實現典型的路由功能,也可以將多個exchange綁定在一起,實現更復雜的路由功能。
RabbitMQ基于Erlang語言開發,并發能力和性能都很強。它最大的特點是時延低,可以達到微秒級,但吞吐量比較低,遜色于Kafka。它基于主從架構實現高可用性,社區也相對活躍,適用于對實時性、可靠性要求比較高的任務。由于其采用Erlang語言開發,對于很多Java開發者來說不是很友好,難以進行深入的研究和維護。
(3)ActiveMQ
ActiveMQ是一個比較流行的開源、多協議、基于Java的消息服務器,旨在為應用程序提供高效、可擴展、穩定、安全的企業級消息通信。ActiveMQ實現了JMS1.1 (Java消息服務),并提供了很多附加的特性,比如Java管理拓展(Java management extensions,JMX)、主從管理、消息組通信、消息優先級、延遲接收消息、虛擬接收者、消息持久化、消息隊列監控等。ActiveMQ的結構與Kafka類似,通過ZooKeeper對集群進行管理。ActiveMQ同時支持對消息的持久化和非持久化,可以將消息存儲在內存、文件或數據庫中。其中,可以通過Java數據庫連接(Java database connectivity,JDBC)將消息存儲在數據庫中,這是其不同于其他消息系統的一點。
相比于Kafka,ActiveMQ的吞吐量要低一個數量級,在單機環境下可以達到萬級,時延則為毫秒級。ActiveMQ利用主從架構實現高可用性,MQ功能極其完備,整體比較成熟,適用于處理解耦和異步問題。然而其社區活躍度日趨愈下,而且也缺乏大規模吞吐量場景的驗證。
(4)RocketMQ
RocketMQ是阿里巴巴集團在2012年開源的分布式消息系統,在2016年成為Apache的孵化項目,并于2017年9月25日成為Apache的頂級項目。作為經歷過多次阿里巴巴“雙11”這種“超級工程”的洗禮并有穩定出色表現的國產中間件,近年來RocketMQ以其高性能、低時延和高可靠等特性被越來越多的國內企業使用。如圖4所示,RocketMQ包含四大組件:生產者、消費者、名稱服務器(nameserver)、broker,每個組件都可以部署成集群模式進行水平拓展。同樣,broker是消息存儲中心,接收來自消費者的消息并進行存儲,消費者從這里拉取消息。broker有主節點(master)和從節點(slave)2種類型,其中master可讀可寫,而slave是只讀的。從物理結構上看,broker有單master、多master、多master多slave等多種集群部署方式。另外,nameserver用來保存與broker相關的元信息,其功能與第三方集群管理服務ZooKeeper類似。
RocketMQ也提供優秀的吞吐量,時延為毫秒級,在性能上與Kafka很接近。與Kafka不同的是,RocketMQ在同等機器資源下,可以支撐大規模的主題,這是其很大的優勢。同時,RocketMQ的MQ功能也較為完善,基于分布式的結構,便于拓展,模型簡單,接口易用。基于Java開發的RocketMQ也方便開發者進行深度定制開發。
(5)Pulsar
Apache Pulsar是2016年由雅虎開源的下一代大規模分布式消息系統。Pulsar在實時計算系統的消息、存儲、計算3個方面進行了很好的協調和統一。Pulsar遵循發布者-訂閱者模型,使用內置的多數據中心副本,引入了多租戶的概念。另外, Pulsar有一個Kafka API兼容接口,這使得將現有的Kafka程序移植到其中更加容易。如圖5所示,Pulsar在架構上最明顯的特征就是采用了消息服務和消息存儲分層的策略。大多數消息系統將數據存儲在broker中,而Pulsar依賴BookKeeper這種可拓展度高、強容災和低時延的存儲服務,將存儲與計算分離,既充分地保證了數據的可用性,又可以在不移動實際數據的前提下,實現broker的動態擴展。
圖3???RabbitMQ系統架構
圖4???RocketMQ系統架構
圖5???Pulsar系統架構
Pulsar支持多租戶的概念,可以在主題命名空間級別實現數據隔離,并且支持細粒度的訪問控制,這使得Pulsar的應用程序更加安全、可靠。同時,Pulsar在性能上的表現也極為出色,相比于Kafka,在一個小型集群中針對一個分區一個主題、消息為100 byte的測試,Pulsar的吞吐量提升了2.5倍,時延降低了40%。整體來說,Pulsar能夠作為消息系統領域的有力競爭者,但是由于其發展較晚,社區相對不夠活躍,還需進一步接受市場的檢驗。
4.2 系統特性對比
本節選取一些重要的特征,對各個系統進行對比,見表1。對于其中一些特征,解釋如下。
實現語言:由于Java簡單易用、功能強大,而且有平臺獨立、分布式等諸多特性,目前大多數消息系統是使用Java語言開發的,由于Java語言使用廣泛,因此這些消息系統便于開發者們進行二次開發。而RabbitMQ則使用Erlang語言,盡管不利于二次開發,但是由于Erlang語言本身的高可用、高并發特點,并且其消息機制與AMQP極度吻合,使得RabbitMQ擁有諸多特性,這也是其被阿里巴巴集團青睞的一個重要原因。
客戶端軟件開發工具包(software development kit,SDK):每個消息系統都提供了包括原生和第三方的多種語言版本的SDK,故消息隊列系統在許多領域、許多應用中得到了廣泛的使用。
通信協議:在實現消息隊列功能時需要應用消息協議,各個消息系統使用的協議不同,根據使用的消息協議是否向行業開放消息規范文檔,可以將其分為開放協議和私有協議。常見的開放協議有AMQP、簡單(流)文本定向消息協議(simple(or streaming)text orientated messaging protocol,STOMP)、可拓展通信和表示協議(extensible messaging and presence protocol,XMPP)等,有些系統會根據自身情況對一些基本協議進行封裝,如Kafka基于TCP/IP自行封裝了一套協議,而RocketMQ則完全使用了一套自定義的消息協議。
消息順序性保證:在消息系統中,能否保證消息的發送和消費的順序一致是一個很重要的問題。某些應用場景(如銀行業務)對消息的順序要求很嚴格,而另一些應用場景則對消息順序的要求較為寬松。Kafka的分布式單位是一個分區,在一個分區內部是保證有序的,但多個分區之間并不保證有序。RabbitMQ和ActiveMQ也是在某些特殊情況或模式下才能保證順序。因此這些系統更適用于那些對消息順序要求寬松的應用場景。而RocketMQ和Pulsar則能夠保證消息的全局有序。某些業務場景(如短信定時發送需求)會要求消息延時或定時發送,在上述幾種系統中,除了Kafka和Pulsar不能實現這樣的需求,其他系統都能通過直接或間接的方式實現。
批量傳輸:消息批量處理表示在消息系統中,可以一次傳輸多條消息,以減少通信消耗,提高消息處理能力。在上述幾種系統中,除RabbitMQ外,其他系統均支持批量傳輸。
持久化:不同的消息系統支持不同的持久化模式,即將消息以多種方式存儲在磁盤、內存或文件中,根據應用需求選擇合適的持久化模式。
消息優先級:在某些應用場景下,某些消息可能需要被優先消費,這時就可以對消息設置優先級,不同的系統以不同的方式支持消息優先級設置,但Kafka和RocketMQ不支持這一特性。
事務消息:為了保證消息傳輸的可靠性,即確保消息在傳輸過程中不丟失,需要利用消息的事務機制,而在上述消息系統中,Pulsar不支持事務消息,但可以通過其他方式在一定程度上保證消息的可靠性,官方也通報在接下來即將發布的新版本中加入對事務的支持。
集群管理服務:作為一個分布式系統,各個消息系統一般需要配套其他集群管理服務實現集群下的環境,如Kafka、ActiveMQ和Pulsar都使用ZooKeeper作為集群管理工具,RocketMQ則使用自帶的nameserver實現,RabbitMQ則完全依靠Erlang語言的分布式特性來構建集群。除此之外,各個系統還擁有許多共同或不同的特性。
4.3 對數據流系統的支持與未來的展望
目前,大多數消息隊列系統提供了一些針對數據流系統的編程接口,消息系統可以作為數據源與數據流系統之間的緩存系統緩存源數據,并為數據流系統提供穩定的數據輸入。但對于數據流系統算子計算的中間數據,還無法使用現有的數據流系統進行緩存。盡管數據流系統本身有一些機制可以用來平衡算子之間可能存在的速度差異,但這些機制耦合在系統的各個模塊之中,沒有一個統一的緩存管理模塊解決這個問題。而且隨著數據量的增多,應用對計算效率的要求越來越高,未來很有可能出現系統自身基本的緩存機制無法支撐巨量數據和高速計算的情況,故需要一個統一且強大的緩存管理機制。消息隊列系統可以作為一個獨立的緩存管理模塊中的存儲子模塊,充分發揮其數據緩存管理性能,從而解決數據流系統中的緩存問題。
5 數據緩存技術
在傳統意義上,緩存(cache)是用一個硬件或軟件組件存儲數據,此數據可能是前序計算的結果,也可能來自其他存儲位置。當后續進程需要用到該數據時,可以直接從緩存中讀取,而讀取速度要比重新計算或者從數據原始位置讀取快得多。這一過程要求請求的數據位于緩存中,稱為緩存命中。如今緩存的概念更加廣泛,不僅在CPU和內存之間有緩存,內存和磁盤之間也有緩存,甚至在網絡應用中也存在緩存的概念。凡是位于2個速度相差較大的數據讀寫或處理單元之間,用于平衡兩者數據傳輸速度差異的結構,都可以被稱為緩存。
緩存技術中包括幾個重要概念,分別是命中率、緩存容量、緩存更新策略。
(1)命中率
在緩存系統中,若可以直接通過緩存獲取需要的數據,則稱為命中,否則稱為沒有命中。其中,命中率=命中數/(命中數+沒有命中數)。顯然,命中率越高,緩存系統的效率就越高,對系統性能的提升就越明顯。
(2)緩存容量
緩存容量就是緩存中最多能容納的數據量。通常各種緩存機制會對緩存容量大小進行一定的限制。當實際緩存的數據超出緩存容量時,就會觸發緩存更新策略。
(3)緩存更新策略
緩存更新策略一般有3種,分別是先進先出(first in first out,FIFO)、最近最少使用(less frequently used,LFU)和最近最久未使用(the least recently used, LRU)。FIFO即最先進入緩存的數據,在緩存空間不夠的情況下,會先被清除出去。LFU即使用次數最少的數據會先被淘汰,這里需要記錄數據的使用次數。LRU即如果一個數據在最近一段時間沒有被訪問,那么可以認為將來它被訪問的可能性也很小,這時便可以優先將其淘汰。同時,基于這3種基本緩存更新策略已經衍生出許多改進算法,使緩存效率更高,并且適用于不同的場景。為了充分發揮作用,緩存不僅暫存剛剛訪問過的數據,還可以根據上下文對應用進行預測,以實現數據的預取,把未用過但將要用到的數據存入緩存中。
數據緩存可以應用在很多方面。其中比較傳統的是應用在CPU和內存之間的緩存,作為臨時數據暫存器,緩存在一定程度上解決了CPU運行處理速度和內存讀寫速度不匹配的問題。CPU的緩存也可以使用多級緩存,每一級緩存的讀寫速度和容量均不相同,從而在控制成本的情況下,可以盡可能地發揮CPU處理性能的潛力。另外是網絡中的緩存,隨著互聯網的發展,每時每刻都有大量的數據產生,面對爆炸式增長的數據,為保證數據的高效傳輸,緩存成為一種很有效的手段。互聯網流量的主要來源是流視頻內容。隨著視頻質量的不斷提高,流媒體給網絡基礎設施帶來的壓力也在增加。使用內容分發網絡將內容緩存到離用戶更近的地方,是減少網絡負載的常見解決方案。
在數據流系統中,算子之間的速度差異也可能導致數據堆積或算子閑置的問題,而隨著數據量的增加,應用對系統處理能力的要求日益提高,這一問題可能越發明顯。因此對算子之間的中間數據進行緩存管理也是很重要的一個研究方向。但目前的數據流系統中還沒有一個系統性的緩存管理機制,僅使用一些分布式系統中常用的技術來優化這一問題。數據流系統中以數據為驅動的特點使得數據的流暢運轉變得十分重要,根據數據流計算模型的特點設計相應的緩存管理也將有很大的發展空間。
6 結束語
數據流系統以其良好的性能在業界得到了廣泛的應用,已經成為新一代大數據解決方案的重要組成部分。數據流算子之間的緊密配合使得數據流系統的性能發揮到極致,因此數據流算子之間的數據緩存管理和存儲抽象也將成為一個重要的研究方向。而傳統的消息隊列系統可以以其優秀的數據緩存管理能力在數據流系統中發揮作用,成為數據流系統的重要組成部分。
作者簡介
袁旭初(1995-),男,東北大學計算機科學與工程學院碩士生,主要研究方向為分布式系統、并行計算等 。
付國(1996-),男,東北大學計算機科學與工程學院碩士生,主要研究方向為分布式系統、并行計算等 。
畢繼澤(1998-),男,東北大學計算機科學與工程學院本科生,主要研究方向為大數據處理、并行與分布式計算等 。
張巖峰(1982-),男,博士,東北大學計算機科學與工程學院教授,主要研究方向為大數據處理與挖掘、深度學習、并行與分布式計算等 。
聶鐵錚(1980-),男,博士,東北大學計算機科學與工程學院副教授,主要研究方向為大數據管理、數據集成與融合、區塊鏈等 。
谷峪(1981-),男,博士,東北大學計算機科學與工程學院教授,主要研究方向為大數據分析、分布式計算、時空和圖數據管理等 。
鮑玉斌(1968-),男,博士,東北大學計算機科學與工程學院教授,主要研究方向為商務智能、數據挖掘、大數據分析等 。
于戈(1962-),男,博士,東北大學計算機學院教授、博士生導師,中國計算機學會會士。現任中國計算機學會信息系統專業委員會主任、數據庫專業委員會委員、系統軟件專業委員會委員,《計算機學報》《軟件學報》《計算機研究與發展》等期刊編委。曾獲得“教育部跨世紀人才基金”和“中國高校青年教師獎”。主要研究方向為分布式數據庫系統、數據科學與大數據管理、區塊鏈技術與應用等 。
大數據期刊
《大數據(Big Data Research,BDR)》雙月刊是由中華人民共和國工業和信息化部主管,人民郵電出版社主辦,中國計算機學會大數據專家委員會學術指導,北京信通傳媒有限責任公司出版的期刊,已成功入選中文科技核心期刊、中國計算機學會會刊、中國計算機學會推薦中文科技期刊,并被評為2018年國家哲學社會科學文獻中心學術期刊數據庫“綜合性人文社會科學”學科最受歡迎期刊。
關注《大數據》期刊微信公眾號,獲取更多內容
往期文章回顧
《大數據》2020年第3期目次&摘要
專題導讀:數據資產化探索
數據資產化框架初探
基于利潤最大化的數據資產價值評估模型
基于區塊鏈的數據市場
數據資產標準研究進展與建議
面向價值實現的數據資產管理體系構建
專題導讀:面向大數據處理的數據流計算技術
面向大數據處理的數據流編程模型和工具綜述
數據流計算模型及其在大數據處理中的應用
數據流計算環境下的集群資源管理技術
總結
以上是生活随笔為你收集整理的分布式数据流计算系统的数据缓存技术综述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CyberSecurityLearni
- 下一篇: 【CyberSecurityLearni