什麼是大數據中的實時計算
來自專欄 Java馬戲團
本人才疏學淺, 只能講一講大致概念,幫助一些Java入門後的小夥伴看到更廣闊的世界,不再害怕入門大數據這個領域。
大數據現在主要分為2種計算形式:
- Batch,傳統的離線計算——比如MapReduce任務、Hive等,他們的特點是,可以一批一批處理,比如,統計今天所有訂單的總額——那麼數據就可以很明顯的分批次處理,簡稱批處理
- Streaming,實時計算——數據實時產生,產生後就立刻處理,這種計算方式傾向於把數據看作是Streaming,流。
離線批處理已經比較成熟,也好理解,數據都是現成的,甚至排好序了。人們只需要考慮要怎麼計算他們就行。文章其實可以參考之前寫的一些。
而實時流計算,則出現的稍晚一些,我們就聊聊這些流計算。
中間件
消息中間件,廣泛出現在分散式的系統中。
它是幹嘛的,我們為什麼要用它?
- 流量削峰填谷
- 業務上下游解耦
- 數據的保存、記錄
- 連接其他的系統
就算沒有中間件,我們可以通過http請求直接調用伺服器,伺服器也會返回給你結果。之後這樣的一次請求就消失了,而往往我們需要對這些數據進行二次處理,或者控制它的流量,不能突然加大,把伺服器打垮。
總之,你可以把中間件理解成一個很長的水管,你可以在上游自由地生產數據(生產者),也可以在下游隨意地消費他們(對他們進行計算處理,又叫消費者);你甚至可以隨時消費這個水管中保存的任意時刻的數據。
中間件的一些代表,Kafka,ActiveMQ,RocketMQ。
實時流處理的數據來源,一般就是中間件。
Streaming 流計算
流計算分為2種流派,一種是通過各個流處理引擎或者中間件提供的SDK,大多是一個泛型的抽象類,供你override,編寫每條數據到來時,你要做的業務邏輯,還有一種,是寫SQL語句即可。
為了便於稱呼,我在接下來稱他們為Streaming API與Streaming SQL
Streaming API
這種其實很常見,比如你在中間件上游生產這樣一種數據:
public class Main{ private int num; private String name;}
你就可以在下游的時候,告訴框架,你的數據是這樣子的,然後每來一個數據,把num + 1,然後寫入到下一個中間件里去。
這就是最簡單的實時處理了。
世界要是可以一直這麼簡單就好了,但往往我們會有更複雜的需求。
我列舉一些常有的需求:
過濾
num < 0的不要了
分流
即,原本是一條大粗水管子,我現在要把它們分開一些,name不同的數據不能分到一起。這樣的話, 你就得到了多條邏輯上的stream,同一個stream裡面的數據,name都一樣。
窗口
統計最後10分鐘的num總和。你就需要一個10分鐘的window。可以簡易地理解為,就算是流處理的世界,我也需要一些小的batch。
這些需求常常伴隨、組合出現,通過Streaming API,經過一定程度的學習,你就可以把數據流玩的非常溜。
那你說你不想學這麼多,有沒有簡易一點的,當然有了——
Streaming SQL
通過寫SQL的方式,來完成實時流計算,比如數據的定義:
## 建立源頭表CREATE STREAM TABLE source_data( num int, name string)##後面一般是源中間件的定義,用戶密碼等
同樣的,結果表也可以這樣定義
## 定義結果表,一般是另一個中間件CREATE RESULT TABLE result_table( num int, name string)##後面一般是結果中間件的定義,用戶密碼等
之後就可以直接寫業務邏輯,num+1
INSERT INTO TABLE result_tableSELECT (num+1) as num, name as namefromsource_data;
是不是很easy,我們再看看如果加上10分鐘統計num總和的需求,該怎麼做呢
INSERT INTO TABLE result_tableSELECT sum(num+1) as num, name as namefromsource_dataWHERE num > 0GROUP BY $10分鐘窗口定義$, name;
多了where,與group by
(窗口這裡是偽代碼,因為它本身是個複雜的概念,今天太晚了,明後天再說吧)
用Streaming SQL,你甚至可以非常方便地使用join語法來進行雙流聚合操作,就跟操作MySQL一模一樣。
那麼說了這麼多,你有沒有想在業務中主動試一試流處理呢?
簡單地介紹,希望對你有幫助。
推薦閱讀:
※第二季 ? 第二期 我們因何與眾不同?
※本周知乎熱門視頻 | 新手進健身房必練的四個動作
※關燈後還敢玩手機!我反手就是一記科普!
※怎樣看待「中國成功研發反隱身米波雷達」的新聞?