天天看點

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

本節書摘來自華章出版社《flume日志收集與mapreduce模式》一書中的第2章,第2.3節,作者 [美] 史蒂夫·霍夫曼(steve hoffman)斯裡納特·佩雷拉(srinath perera),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

每一本技術圖書都會有一個“hello world”示例。下面是我們将會使用的配置檔案:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

這裡定義了一個名為agent的代理,它有一個名為s1的源、一個名為c1的通道,以及一個名為k1的接收器。

源s1的類型為netcat,它隻是打開一個socket監聽事件(每個事件一行文本)。它需要兩個參數,分别是一個綁定ip與一個端口号。該示例使用0.0.0.0作為綁定位址(表示監聽任何位址的java約定)以及端口号12345。源配置還有一個名為channels的參數,它是源将事件附加到的通道名。在該示例中使用的是c1。這裡使用了複數,因為你可以配置将一個源寫到多個通道中,不過在這個簡單的示例中我們并沒有這麼做。

名為c1的通道是個記憶體通道,使用了預設配置。

名為k1的接收器的類型是logger。該接收器主要用于調試與測試。它會使用log4j将所有info級别的日志記錄下來,這些日志來自于配置好的通道,在該示例中就是c1。這裡所用的通道是單數的,因為一個接收器隻能從一個通道接收資料。

使用該配置,我們運作代理并使用linux netcat工具連接配接到代理來發送事件。

首先,解壓縮之前下載下傳的二進制分發包:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

接下來,簡單看看help指令。使用help指令運作flume-ng指令:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始
《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

注意,如果指定了目錄,那麼就需要先将其加入到classpath中。

如你所見,可以通過兩種方式調用指令(除了煩瑣的help與version指令外)。我們将使用agent指令,avro-client的使用将在後面進行介紹。

agent指令有兩個必填參數,分别是使用的配置檔案與代理名(如果配置包含了多個代理)。下面來看看我們的示例配置,打開一個編輯器(我使用的是vi,你可以使用自己喜歡的任何編輯器):

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

接下來,将vi配置的内容放到編輯器中,儲存并退回到shell。

現在可以啟動代理了:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

-dflume.root.logger屬性覆寫了conf/log4j.properties中的root logger,使用console追加器。如果沒有覆寫root logger,那麼一切也都正常,隻不過輸出将會被寫到log/flume.log檔案中。當然了,你還可以編輯conf/log4j.properties檔案,修改flume.root.logger屬性(或是其他想要修改的任何屬性)。

你可能會問,既然-f參數包含了配置的完整相對路徑,那為何還要指定-c參數呢。原因在于log4j配置檔案需要放到classpath中。如果指令沒有指定-c參數,那就會報如下錯誤:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

不過你并沒有這麼做,是以會看到如下關鍵的日志輸出:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

這行日志告訴你名為agent的代理已經啟動了。通常情況下,如果在配置檔案中有多個配置,你隻需要這一行日志就可以斷定啟動了正确的配置。

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

下面是另一個檢查,確定加載了正确的檔案,在該示例中就是hw.conf檔案:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

當所有的配置都被解析完畢後,你會看到下面這條消息,它展示了配置好的一切内容。你會看到s1、c1、k1,以及哪些java類完成了實際的工作。你可能會猜想,netcat其實是org.apache.flume.source.netcatsource的便捷方式。如果需要,我們也可以使用類名。事實上,如果編寫了自定義的源,那麼我會使用其類名來作為源的type參數。如果不對flume分發包打更新檔,就無法定義自己的短名字:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

我們看到源現在正在監聽端口12345的輸入,接下來向其發送一些資料。

最後,再打開一個終端。我們使用nc指令(也可以使用telnet或是其他類似的指令)發送字元串“hello world”并敲入來辨別事件的結束:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

“ok”來自于代理,在敲入回車後,它表示将文本行作為一個flume事件來接受。如果檢視代理日志,你會看到如下内容:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

上述日志消息表明該flume事件不包含頭(netcat源自己也沒有添加任何頭)。體以十六進制的形式呈現,并且還有一個字元串表示(便于閱讀,該示例中就是hello world消息)。

如果像下面這樣再發送一行:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

你會在代理的日志中看到如下内容:

《Flume日志收集與MapReduce模式》一2.3 從“Hello World”開始

事件似乎被截斷了。根據設計,logger sink将體内容限制為16位元組,進而避免螢幕充斥着過多的内容。如果想要檢視調試的完整内容,那麼你應該使用其他的sink,也許可以使用file_roll sink,它會将日志寫到本地檔案系統中。

上一篇: java多線程
下一篇: [Java] 多線程