云计算 centos php Firefox 程序员 google java Ubuntu 编程 shell 开源 Android mysql Python linux wordpress 微软 apache nginx Windows

《Storm實時數據處理》一2.6 統計與持久化日誌統計信息

2.6 統計與持久化日誌統計信息

我們其實可以收集很多日誌流的統計信息,但由於本節只是為了展示一些基本概念,因此我們只準備收集和處理單時間序列(每分鐘)日誌量。雖說如此,但這應該已經足以展示有關的設計和方法了,這些技巧能夠幫助你在未來實現其他分析工作。

2.6.1 實戰

Step01 下載storm-cassandra contrib項目並將其安裝到Maven倉庫中:


image

Step02 在storm.cookbook.log包中,创建一个继承自BaseRichBolt的类VolumeCountingBolt。为该Bolt声明以下三个字段:
image

Step03 然后实现一个静态工具方法,该方法的作用是获取日志的时间信息,按分钟形式表示出来:
image
image

Step04 实现execute方法(没错,函数体很短):
image

Step05 最后,参照第1章中的方法来创建LogTopology类,并按照如下方法创建Topology:
image

2.6.2 解析

該實現方法看起來簡單得讓人感到不可思議,但事實確實如此。在實現過程中我們使用了storm-cassandra項目(該項目屬於storm-contrib組件)來對所有持久化復雜性進行抽象。storm-cassandra項目通過一個通用且可配置的backtype.storm.Bolt實現來集成Storm和Cassandra,該Bolt的作用是將StormTuple對象寫入Cassandra 列族。
Cassandra是一個面向列族的數據庫系統(http://cassandra.apache.org/)。Cassandra的列族數據模型在提供二級索引便利的同時還具備日誌式結構更新的存儲性能,另外也提供了健壯的物化視圖支持和強大的內置緩存。Cassandra最新的一個功能是計數器列。你可以在集群上的任何地方,通過持久化指定計數器列族中的計數器列來實現計數器的安全自增。
storm-cassandra項目支持兩種持久化風格,第一種是標準的Cassandra列族風格,第二種是基於計數器列的風格。我們在這裏只關註第二種類型的風格,因為它非常適用於當前這個例子。你可以閱讀項目的README文件中有關其他風格的介紹,基本上都差不多。
CassandraCounterBatchingBolt類的實例就能幫我們搞定所有工作 。只需告訴它我們要使用哪個列族,哪個Tuple字段作為行鍵,哪個Tuple字段作為增量,而Tuple中剩下的那個字段則指明了需要更新的計數器列。
我們來看看下面的構造函數:


以及以下作為輸入的元組數據:


這會把columnFamily列族中的SomeCounter計數器列加1L。
對於任何有關系型數據庫背景的開發人員來說,最關鍵的觀念轉變在於了解面向列族數據庫中的數據建模。作為數據庫中大數據家族的一分子,面向列族的數據庫促進了高度不規則數據模型的應用。這個方法移除了表之間的關系以及它們的鎖,實現了對數據庫的大規模、並行讀寫的處理。雖然這種方法會增加數據的冗余,但為了滿足當今大規模數據處理的需求,在一些普通磁盤上面的開銷其實算不了什麽問題。觀念的轉變在於我們要根據在數據集上執行的查詢來選擇適當的數據模型,而不是簡單地將現實世界模型轉化成固有和統一的結構。對應當前查詢的數據類型可以歸納為:查詢給定時間點上所有日誌文件的總數 。
這種方法能讓我們通過簡單地發送Tuple來生成統計數據,我們可以使用這種方法來得到各種問題的答案,下面給出幾個例子:

我們的日誌體積隨著給定時間周期(可以是日、月或者年)的變化趨勢到底是什麽樣的?
日誌文件中出現頻率最高的詞幹是什麽?
列族不只可以包含統計數據,你可以設計任意的不規則結構,並通過發送一個Tuple來表示某一行中任意列的集合。如果該行已經存在,Cassandra會簡單地添加或者更新數據。這其實可以實現非常強大的功能。

延伸阅读

    评论