所在位置:首頁 -- 數據庫 -- 正文

使用SMACK堆棧進行快速數據分析


發布時間:2017-4-1  來源:admin

 從大數據到快速數據

除了能夠以批處理模式分析大型數據集之外,現代數據驅動型組織還需要盡快從所收集的數據中生成洞察,并最終采取行動。在這方面,傳統的Hadoop堆棧(HDFS作為存儲層,MapReduce或Tez作為處理框架,YARN作為集群資源管理器)缺乏嚴重性。為了減輕這種情況,業界已經提出了諸如Lambda架構(見《程序員》2016年11月“Lambda與Kappa計算架構之我見”一文)等架構。在Lambda架構中,一個“慢”大數據處理框架(如Hadoop堆棧)與一個“快速”的流處理框架(如Apache Storm)組合在一起。由快速框架處理的數據或者與慢速處理框架周期性地重新集成,或者完全丟棄,并且由使用慢速處理框架處理的數據代替。當然,這種Lambda型結構并不是沒有問題,它會導致代碼重復和需要重新處理與集成數據。

SMACK堆棧

所謂的SMACK堆棧是一個在過去一年中變得流行的架構。SMACK堆棧的各部分如下:

1.Spark作為一個通用、快速、內存中的大數據處理引擎;

2.Mesos作為集群資源管理器;

3.Akka作為一個基于Scala的框架,允許我們開發容錯、分布式、并發應用程序

4.Cassandra作為一個分布式、高可用性存儲層;

5.Kafka作為分布式消息代理/日志。

首先我們將快速討論組成SMACK堆棧的部件,特別注意Cassandra,因為它與堆棧的其他部分不同,似乎沒有在國內廣泛使用

Apache Spark

Apache Spark已經成為一種“大數據操作系統”。數據被加載并保存到簇存儲器中,并且可以被重復查詢。這使得Spark對機器學習算法特別有效。Spark為批處理、流式處理(以微批處理方式)、圖形分析和機器學習任務提供統一的接口。它用Scala編寫,并公開了Scala、Java、Python和R的API。此外,Spark能夠對數據執行SQL查詢,更利于分析師們學習傳統的BI工具。

Apache Mesos

Apache Mesos是一個開源的集群管理器,由加州大學伯克利分校開發。它允許跨分布式應用程序的高效資源隔離和共享。在Mesos中,這樣的分布式應用程序被稱為框架。

Akka

Akka是構建在JVM上運行的并發程序框架。強調一個基于actor的并發方法:actors被當作原語,它們只通過消息而不涉及共享內存進行通信。響應消息,actors可以創建新的actors或發送其他消息。actor模型由Erlang編程語言編寫,更易普及。

Apache Cassandra

Cassandra最初是在Facebook開發的,后來成為一個Apache開源項目。它是一個分布式、面向列的NoSQL數據存儲,類似于Amazon的Dynamo和Google的BigTable。與其他NoSQL數據存儲相反,它不依賴于HDFS作為底層文件系統,具有無主控架構,允許它具有幾乎線性的可擴展性,并且易于設置和維護。Cassandra的另一個優勢是支持跨數據中心復制(XDCR)。跨數據中心復制實際上有助于使用單獨的工作負載和分析集群。Cassandra的企業版可從DataStax (http://www.datastax.com)獲得。

根據固定分區鍵,數據在Cassandra集群的節點上分割。其架構意味著它沒有單點故障。根據CAP定理,我們可以在每個表的基礎上對一致性和可用性進行微調。

Apache Kafka

在SMACK堆棧內,Kafka負責事件傳輸。Kafka集群在SMACK堆棧中充當消息主干,可以跨集群復制消息,并將其永久保存到磁盤以防止數據丟失。

在詳細了解SMACK堆棧的各部分如何協同工作之前,我們將快速討論Cassandra的數據模型及其在Cassandra上進行分析所面臨的挑戰。

Cassandra數據模型

與其他NoSQL數據存儲類似,基于Cassandra應用程序的成功數據模型應該遵循“存儲你查詢的內容”模式。也就是說,與關系數據庫相反,在關系數據庫中,我們可以以標準化形式存儲數據。當我們談論Cassandra數據模型時,仍然使用術語table,但是Cassandra表的行為更像排序,分布式映射,然后是關系數據庫中的表。

Cassandra支持用于定義表與插入和查詢數據的SQL語言,稱為Cassandra Query Language(CQL)。

當定義一個Cassandra表時,我們需要提供一個分區鍵,它確定數據在集群節點之間的分布方式,以及確定數據如何排序的聚簇列。當使用CQL查詢時,我們只能查詢(使用WHERE子句)并根據聚簇列排序。

讓我們來看看Cassandra文檔中的一個示例,該文檔是音樂共享服務(如Spotify)中的播放列表建模:

在這個例子中,uuid(通用唯一ID,保證在多個機器之間是唯一的)id是分區鍵,song_order是聚類列,(id,song_order)需要在表的所有行中都是唯一的。此外,id決定了在哪個機器上存儲行,song_order決定了行在物理主機上的存儲順序。也可以在Cassandra中使用復合分區鍵,將它們放在()中。

CQL查詢如下所示:

WHERE子句中出現的任何列都要求是主鍵的一部分,或者可以在其上定義索引。此外,分區鍵只能出現在相等(=)操作中。只有當所選行的集合被作為連續塊存儲在主機上時,范圍查詢才是可行的。通過聚類SQL的類似列和LIMIT子句,CQL能夠支持排序,但不具備GROUP BY的類似功能。

根據特定列進行查詢,減少了對隨機磁盤訪問的需求,但也強烈限制了Cassandra作為分析數據庫的使用。“存儲你查詢的內容”范例需要根據Cassandra數據庫上執行的查詢進行仔細地數據建模,從而限制了支持新查詢的能力。為了對存儲在Cassandra中的數據執行分析,應該將數據加載到單獨的處理框架中,我們選擇Apache Spark框架。

圖1 操作集群和帶有并置的Spark節點的單獨的分析集群

連接Spark和Cassandra

Spark-Cassandra連接器(https://github.com/datastax/spark-cassandra-connector)可以把Cassandra表作為Spark RDDs,將Spark RDDs寫入Cassandra表,以及在Spark應用程序中執行任意CQL查詢。如果可以,還應使用CQL WHERE子句將篩選操作下推到服務器端節點。

為了最大化利用Spark-Cassandra連接器的數據位置感知功能,集群的Spark和Cassandra節點應并置。Cassandra的XDCR跨數據中心復制實際上允許我們分離出一個分析集群,一個Spark節點與Cassandra節點并置,一個Cassandra集群用于重寫操作,其內容被自動復制到分析集群。這樣,任何沉重的分析操作都不會影響純Cassandra集群的寫入性能。將操作(寫入繁重)集群與分析集群分離可提供以下額外的好處:

1. 兩個集群可以獨立縮放;

2. 由于分析和操作集群具有不同的讀/寫模式,可以優化每個集群以實現其預期用途;

3. Cassandra自動處理數據復制;

4.僅需要將其他信息(例如要與其連接的查找表)存儲在分析集群上。

Mesos架構

Mesos從頭開始設計,用于處理異常繁雜的工作負載,也就是說可以將長期運行的批處理作業與較短的事件處理類型任務組合在一起。

Mesos集群由兩種類型的節點組成:

1.主節點,負責資源提供和調度;

2.從節點,運行實際任務。

主節點也可以復制,以提供高可用性。在這種情況下,Zookeeper可以用于領導選舉和服務發現。使用Mesos執行任務的過程遵循以下步驟:

1. 從節點向主節點發布可用資源;

2.主節點發送資源到框架(App);

3.框架中的調度程序回復需要被調度的任務;

4. 任務由主機發送到從機。

兩個工具幫助我們使用Mesos計劃作業:Marathon旨在安排長時間運行的任務;Chronos的行為就像一個“分布式cron”,重復執行短時間運行的任務。我們可以用以下方式部署Spark/Mesos/ Cassandra集群:

Mesos主節點與Zookeeper節點并置;

Cassandra節點與Spark執行器節點并置。

圖2 Cassandra和Spark的Mesos部署方案

使用Akka進行數據攝取

選擇合適的存儲層后,現在需要決定如何處理傳入數據。對數據攝取層的要求是:

1.低延遲和高吞吐量

2.彈性

3.可擴展性

4.背壓手柄負載尖峰

actor完全滿足前三點,例如從HTTP請求中處理每個傳入事件并將其存儲在Cassandra中。

使用Kafka進行預處理

Akka無狀態設計的一個缺點是:actor不能執行任何的數據預處理。Cassandra同樣不適合。使用Spark或Spark Streaming執行這種預聚合也不理想,因為Spark Streaming的微批處理架構并不適用于快速事件處理。

Apache Kafka是合適的備選。因此在SMACK堆棧中,Akka actors將預處理數據寫入分布式日志,如Apache Kafka。為了從Kafka讀取數據,可以依靠Spark Streaming,使用Spark Streaming可以將數據備份到HDFS或對象存儲(如Amazon S3或阿里云OSS),同時將其寫入Cassandra群集。這充當了有效的備份機制,并且根據用例,OSS/S3的存儲成本可能遠低于在Kafka集群中保留數據。然后可以使用Spark從對象存儲中恢復數據。在對象存儲中非現場存儲數據還可防止任何數據中心級故障對組織數據帶來嚴重影響。

結論

SMACK堆棧具有以下優點:

1.簡單工具箱,支持各種數據處理任務(流式、批處理、Lambda類型的架構);

2.依靠經過測試的開源框架;

3.統一集群管理;

4.易于擴展和復制。

圖3 SMACK堆棧架構概述

此外,應用程序中必須寫入特定代碼的主要組件(Akka、Kafka、Spark)都可以使用Scala進行編程,從而允許在架構的不同部分有效共享業務邏輯類型的代碼。

中国北京单场足球彩票 新说唱官方bot免费 手机股票软件 广西山水麻将怎么打 3d走势图5oo期 两肖两码中特期期大公开 刷微信广告赚钱 吉林快3黑彩玩法技巧 北京pk赛车平台玩 云南快乐10分规则 江西时时中奖规则 移动积分差怎么赚钱 七乐彩官方网站 手游游戏主播赚钱吗 老时时彩历史开奖记录 金沙手机投注 内蒙古十一选五助手