怎樣利用Spark Streaming和Hadoop實現近實時的會話連線

mtunique發表於2015-04-17

這個 Spark Streaming 樣例是怎樣將近實時會話帶到到Hadoop中的一個很好的例子。

Spark Streaming 是Apache Spark 中最有趣的元件之一。利用Spark Streaming,你可以通過使用與處理批量載入資料相同的API來建立資料管道,並通過資料管道處理流式資料。此外,Spark Steaming的“micro-batching”方式提供相當好的彈性來應對某些原因造成的任務失敗。

在這篇文章中,我將通過演示網站事件的近實時會話使你熟悉一些常用的以及高階的Spark Streaming功能,然後在Apache HBase中載入事件的有關統計資料,最後選擇你喜歡的BI工具進行繪圖分析。 (Sessionization指的是捕獲單一訪問者的網站會話時間範圍內所有的點選流事件。)你可以在這裡找到了演示的程式碼。

像這樣的系統對於瞭解訪問者的行為(不管是人還是機器)是超級有用的。通過一些額外的工作,它也可以被設計用來包含windowing模式,以此來用非同步的方式發現可能的欺騙。

Spark Streaming 程式碼

我們例子中的main class是:

讓我們來看看這段程式碼段(忽略1-59行,它包含了imports 和其他無聊的東西)。

60到112行:設定Spark Streaming
這些程式碼是Spark Streaming最基本的開始,並可以選擇從HDFS或socket接收資料流。如果你是Spark Streaming新手,我已經新增了一些詳細的註釋幫助理解程式碼。 (我不打算在這裡詳談,因為此時我們仍要討論程式碼。)

114到124行: 字串解析

這裡是Spark Streaming開始的地方. 請看一下幾行::

上面第一行程式碼是對“lines” DStream物件做了一個map函式,並解析原始事件分離出IP地址,時間戳和事件體。對於那些新進入Spark Streaming的人而言,一個DSTREAM儲存著要處理的一批記錄。這些記錄由以前所定義的receiver物件填充,並且此map函式在這個micro-batch內產生另一個DSTREAM儲存變換後的記錄來進行額外的處理。

當看像上面的Spark Streaming示意圖時,有一些事情要注意:

  • 每個micro-batch在你構造StreamingContext時設定的那一秒時會被銷燬
  • Receiver總是被下一個micro-batch中的即將到來的RDDS填充
  • 之前micro batch中舊的RDDs將被清理丟棄

126到135行:產生Sessions

現在,我們有從網路日誌中獲得的IP地址和時間,是時候建立sessions了。下面的程式碼是通過micro-batch內的第一聚集事件建立session,然後在有狀態的DStream中減少這些會話的塊。

這裡有一個關於records如何在micro-batch中被reduce的例子:

會話範圍內的 micro-batch 內加入,我們可以用超酷的updateStateByKey功能,它可以利用先前活躍的micro-batch中的一個DStream做join/reduce-like操作。下圖詳細說明了,就DStreams而言,隨著時間變化這個處理過程是怎樣的。

現在,讓我們深入到定義在檔案的底部的updateStatbyOfSessions函式。該程式碼(注意詳細註釋)很神奇,能使會話流程以連續的微批處理模式發生。

這段程式碼通過很多方式做了很多事,這是整個工作中最複雜的部分。總之,它會跟蹤活動的會話,所以你會知道你是繼續現有的會話還是啟動一個新的。

126到207行:計數和HBase

這部分做了大量的計數工作。在這裡有很多是重複的,所以讓我們只看一個count的例子,然後我們再一步步地把在相同記錄中產生的counts儲存在HBase中。

總之,上面的程式碼是過濾了除活動會話之外的其他所有會話,對他們進行計數,並把最終的計數記錄儲存到一個的HashMap例項中。它使用HashMap作為容器,所以在所有的count做完後,我們可以呼叫下面的reduce函式把他們都合併為一個單獨的記錄。 (我敢肯定還有更好的方法來實現這一點,但這種方法也做的不錯。)

接下來,下面的程式碼處理所有的HashMap,並把他們所有的值儲存在在一個HashMap中。

Spark Streaming與HBase利用HBaseContext進行互動非常簡單。所有你需要做的就是用HashMap和函式將其轉換為一個put物件提供給DSTREAM。

現在,HBase的這些資訊可以用Apache Hive table打包,然後通過你喜歡的BI工具執行一個查詢來獲取像下面這樣的圖,每一次micro-batch該圖都將重新整理。

209到215行:寫入HDFS
最後的任務是把事件資料加入到活動的會話資訊中,然後把事件以會話的開始時間儲存到HDFS。

結論

我希望你跳出這個例子,能感受到只用少量的程式碼就完成了大量的工作,因為它就是這樣的。想象一下你還可以用這種模式和Spark Streaming與HBase HDFS很容易互動的能力去做什麼東西。

Ted Malaska 是 Cloudera 的一個解決方案架構師,Apache Spark的一個貢獻者,O’Reilly的書 Hadoop Applications Architecture 的合著者。

相關文章