Storm入門指南第一章 基礎知識
Storm是一個分散式、可靠、容錯的流式資料處理系統。處理工作被分派給不同型別的元件(components),每個元件分別負責一個簡單、特定的處理任務。處理Storm叢集輸入流的元件叫噴口(spout),噴口再將資料傳給一個叫螺栓(bolt)的元件,並在螺栓中處理資料,處理完成之後,螺栓要麼將這些資料儲存起來(儲存在資料庫、磁碟甚至是物件中),要麼將它傳給其他螺栓。因此,可以將Storm叢集想象成一個螺栓鏈,每個螺栓都會對噴口傳送的資料作出一些處理。
譯者的話:後面對spout、bolt都採用英文叫法,不再使用噴口、螺栓~~
這裡使用一個簡單的例子去解釋這個概念:昨晚我在看新聞時,幾個播音員開始談論政客和他們的地位,他們不停地重複不同的名字,我很好奇每個名字被提及的次數是否相同,還是有些偏差。
這裡,將播音員們說的字幕想象成你的輸入資料流,讓spout來從一個檔案(或者套接字[socket])讀取這個輸入。當成行的文字到達時,spout將它們交給一個bolt,該bolt將文字分離成一個個的單詞。接著,這個單詞流被傳遞到另一個bolt,這個bolt會將每個單詞與一個預先定義好的政客名字列表作比較。對於每一次匹配成功(單詞與政客名字相同),第二個bolt會在資料庫中增加一次那個名字的計數。當你想看結果的時候,只需要查詢資料庫,該資料庫在資料到達的時候會被實時更新。所有元件(spouts和bolts)的排列、連線被稱為一個拓撲(topology),如圖1-1.
設想簡單地定義整個叢集中每個bolt和spout的並行度,這樣你就可以無限地擴充套件你的拓撲。很神奇,對吧?儘管這只是一個簡單的例子,但是你可以看到Storm有多強大。
Storm的典型用例有哪些呢?
流處理:正如前面的例子中所展示的,和其他流處理系統不同的是,使用Storm不需要中間佇列。
連續計算:向客戶端持續傳送資料,以便它們能實時更新、顯示結果,例如網站統計。
分散式遠端過程呼叫:可簡單地並行執行CPU密集型操作。
Storm叢集組成部分
在Storm叢集中,所有節點被一個連續執行的主節點管理。
在Storm叢集中有兩種節點:主節點(master node)和工作節點(worker nodes)。主節點上執行了一個叫Nimbus的後臺程式,它負責在叢集內分發程式碼、為每個工作節點指派任務、監控失敗的任務。工作節點上執行了一個叫Supervisor的後臺程式,它執行topology的一部分。Storm中的一個topology執行在很多工作節點上,這些工作節點分佈在不同的機器。
由於Storm將所有叢集狀態儲存在Zookeeper或者本地磁碟上,因此這些後臺程式是無狀態的,並且可以在不影響系統健康的情況下失效或者重啟(見圖1-2)。
Storm在底層使用zeromq(0mq,zeromq),它是一個高階、可嵌入、提供極好特性的網路庫,這使得Storm成為可能。下面列舉了一些zeromq的特點:
- 充當併發框架的套接字型檔(socket lib)
- 對於叢集產品和超級計算,比TCP更快速
- 在程式內、IPC、TCP和多播之間傳遞資料
- 非同步IO支援可擴充套件的多核訊息傳遞應用
- 通過展開、釋出訂閱、管道、請求應答連線N-to-N
提示:Storm只使用push/pull套接字。
譯者的話:不必糾結於此處關於zeromq的解釋,容易犯暈,需要的時候再看。
Storm特性
程式設計簡單:如果你嘗試過從頭開始構建實時處理系統,你就會明白它有多痛苦。使用storm,複雜性被大大減少。
支援多種程式語言:使用基於JVM的語言開發變得更簡單了,然而storm支援任何語言,只要你使用或者實現一個小的中間庫。
容錯:Storm關注workers節點的當機,並在必要時刻對任務進行重分配。
可擴充套件:為了擴充套件叢集,你所需做的只是向叢集中增加更多的機器,當它們可用的時候Storm會為新機器分配任務。
可靠:所有的訊息都確保至少處理一次。如果有錯誤,訊息可能會被處理不止一次,但是你永遠不會丟失資料。
快速:速度曾是驅動Storm設計的關鍵因素。
事務性:對於幾乎任何計算,你可以確切地獲取一次訊息語義。
- 本文固定連結: http://www.flyne.org/article/25
- 轉載請註明: 東風化宇 2014年03月06日 於 Flyne 發表
相關文章
- 系統架構基礎知識入門指南-下架構
- 系統架構基礎知識入門指南-上架構
- JavaScript 基礎知識入門JavaScript
- JavaScript入門①-基礎知識築基JavaScript
- sql入門基礎知識分享SQL
- Java入門基礎知識點Java
- Python基礎知識入門(二)Python
- Python入門基礎知識(二)Python
- Java基礎知識入門-JDKJavaJDK
- Dubbo基礎入門知識點
- Python入門必知的知識點!Python基礎入門Python
- Python入門基礎知識例項,Python
- Python入門之基礎知識(一)Python
- Python快速入門之基礎知識(一)Python
- Python 基礎(一):入門必備知識Python
- OpenSSL 入門:密碼學基礎知識密碼學
- Android NDK入門:C++ 基礎知識AndroidC++
- WebSocket系列之基礎知識入門篇Web
- Python入門基礎知識學什麼?Python
- Altium Designer 20 入門基礎知識(1)
- Altium Designer 20 入門基礎知識(5)
- MySQL指南之基礎知識MySql
- 爬蟲開發知識入門基礎(1)爬蟲
- TypeScript入門指南(基礎篇)TypeScript
- 【爬蟲】第一章-Web基礎知識爬蟲Web
- Python基礎入門知識點——深淺拷貝Python
- Python基礎入門知識點——if 語句簡介Python
- Pwn入門筆記(二)a little棧基礎知識筆記
- [基礎入門]網路安全知識問答(二)!
- Python培訓入門基礎知識學什麼?Python
- TypeScript入門完全指南(基礎篇)TypeScript
- 大資料分析入門基礎知識學什麼?大資料
- hadoop大資料平臺安全基礎知識入門Hadoop大資料
- Python基礎入門知識點——Python中的異常Python
- PX4與Ardupilot的入門基礎知識(第一章:架構與啟動過程)架構
- 自媒體入門基礎知識,教你快速入門自媒體平臺
- SQL與NoSQL資料庫入門基礎知識詳解SQL資料庫
- 【WEB基礎】HTML & CSS 基礎入門(1)初識WebHTMLCSS
- 0基礎入門Linux 運維,應該先掌握哪些知識?Linux運維