Flume是Apache開發的一款多平臺、分佈式、高可用的數據收集聚合系統。今天從設計角度來解析Flume的架構組成及其特色。html
首先談一下數據流(data flow)。Flume本質上是對數據流的處理,其定義數據處理的最小單元是event,一個event由包含數據的有效負載(payload)和一組可選屬性組成。Flume實際上處理的就是events flow。web
Flume在數據收集和聚合上有很大的靈活性,這得益於其整個系統能夠由單個或者多個節點(agent)拼接而成。每一個節點負責從上游數據源向下遊數據接收方分發event。每一個節點既能夠做爲數據源也能夠做爲數據接收方。apache
在節點的內部,agent由source、channel和sink組成。source負責消費從上游節點獲取的events,並將其放到channel中,目前Flume支持Avro、Thrift、Syslog、Netcat等數據流。channel分爲兩種類型,一種是memory channel,它適合高吞吐量場景,但節點掛掉後數據可能會丟失。另外一種是file channel,也就是channel裏的數據會同步到硬盤裏,節點意外掛掉後數據可恢復,但處理時間會稍長一些,Flume默認使用file channel。sink從channel取數據並將其放入下游節點。架構
下圖是從多個web server數據源收集數據,並統一聚合到一個節點,而後將數據導入到hdfs中。分佈式
https://flume.apache.org/_images/UserGuide_image02.png
Flume節點還支持更復雜的多源、多數據沉積池的組合,以下圖:ide
https://flume.apache.org/_images/UserGuide_image01.png
Flume採用事務來保證數據傳輸的可靠性。每一個event只有當被確認傳遞到下游節點或者數據沉積池以後才把該event從channel中刪除。節點中的sources和sinks被包含在一個事務中。source接收上游的events,若其中一個event接收異常,則全部的events都丟棄,這將致使數據重發。同理,sink在將events導入到下游數據沉積池時,任何一個event發送異常,則全部的events都將從新發送。ui
具體如何使用配置請參考:
https://flume.apache.org/Flum...spa