社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

fluentd で収集したファイルを Spark Streaming で GET

Spark Streaming ではファイルが更新されたとしても、その差分のみの取得はされない。
Spark Streaming ではあるディレクトリに生成された新規ファイルは自動的に取り込んでくれるよう。
そこで差分のみを fluentd で取得し、それを新規ファイルとして出力してみました。

◆ fluentd の準備
1. ruby のバージョンアップ
fluentd をインストールしようとしたら、ruby のバージョン 2.1.0 以上を要求されたので、まず先にインストールしました。

sudo add-apt-repository -y ppa:brightbox/ruby-ng
sudo apt-get update
sudo apt-get -y install ruby2.1

$ ruby -v
ruby 2.1.9p490 (2016-03-30 revision 54437) [x86_64-linux-gnu]

2. fluentd のインストー

sudo gem install fluentd

3. fluentd のセットアップ

fluentd --setup .
-> fluent.conf ファイルが生成される

4. fluent.conf ファイルの編集
すでにファイルには色々と書き込まれていますが、すべて削除して以下の内容にしました。

## File input
## read apache logs with tag=apache.access
<source>
  type tail
  format none
  path /tmp/input/test.log
  tag apache.access
</source>

# match tag=apache.access and write to file
<match apache.access>
  type file
  path /tmp/logs/result.log
  time_slice_format %Y%m%d%H%M%S
  time_slice_wait 1m
</match>

5. fluentd の起動

fluentd -c fluent.conf -vv

◆ ログファイルの準備
fluentd の source 内で指定したログファイルを適当に更新するだけです。
こんな感じのログです。

apache.access   {"message":"66.249.69.97 - - [24/Sep/2014:22:25:44 +0000] \"GET /071300/242153 HTTP/1.1\" 404 514 \"-\" \"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\""}
2017-06-17T10:30:31+09:00       apache.access   {"message":"71.19.157.174 - - [24/Sep/2014:22:26:12 +0000] \"GET /error HTTP/1.1\" 404 505 \"-\" \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36\""}
2017-06-17T10:30:31+09:00       apache.access   {"message":"71.19.157.174 - - [24/Sep/2014:22:26:12 +0000] \"GET /favicon.ico HTTP/1.1\" 200 1713 \"-\" \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36\""}

すると、更新された差分情報のみが fluentd によって回収され、以下のようなファイルが /tmp/logs 内に出来上がります。
result.log.20170617103031_0.log

◆ Spark streaming の起動
そして、Spark streaming の StreamingTextFileStream で /tmp/logs ディレクトリを監視していると
(単にスペース区切りで文字列カウントしただけなので、アウトプット自体は美しくないですが)
差分のみを取得することが出来ました。

-------------------------------------------
Time: 1497967776000 ms
-------------------------------------------
(\"Mozilla/5.0,5)
((KHTML,,4)
(x86_64),4)
(2017-06-20T23:08:33+09:00	apache.access	{"message":"71.19.157.174,4)
(222,1)
(/favicon.ico,1)
(505,1)
(Gecko),4)
(514,1)