1. 程式人生 > >apache-flume-1.7.x配置安裝

apache-flume-1.7.x配置安裝

本文內容主要參考自Apache Flume使用者文件(http://flume.apache.org/FlumeUserGuide.html),由於關於Apache Flume 1.X的中文參考資料不是很多,所以這裡將我部署的過程記錄下來,希望能給有同樣需要的人們有一些提示作用。
(英文文件的內容很多,這裡只寫一些我自己用到的)

Overview

Apache Flume 是一個高效的分散式日誌收集系統,可以將大量的日誌資料從不同的資料來源集中到一起。(PS:知道這些就夠了)

System Requirments

1、JDK 1.7+
2、充足的記憶體
3、磁碟還有可用空間
4、對有相應目錄的讀寫許可權

資料流模型

這裡寫圖片描述
從圖上可以看到,每一個Agent 包含一個Source 一個channel 一個sink
source 可以理解為資料來源(日誌檔案、AVRO、… 有很多 看文件就能知道,我只用到了檔案)
sink 可以理解為資料目的地(同樣也有很多,我測試環境也是直接寫到檔案)
channel 可以理解為資料流管道(種類也有不少,文件中給的例子是用的記憶體,但是記憶體是不穩定的,所以我的測試環境也換成了檔案)
簡單表述三者作用(不嚴謹表述):source 讀取日誌資料將其寫入channel中,sink從channel中讀取資料然後寫到其指定的地方。這裡如果sink寫失敗,那麼資料就會一直在channel中堆積直到sink恢復正常(這樣就確保了日誌資料不會丟失)
多個 Apache Flume Agent 還可以連線在一起,模型如下圖所示
這裡寫圖片描述

知道了以上內容就可以開始搭建測試環境了

硬體環境

三臺伺服器IP地址分別為192.168.0.101~103,全部使用linux ubuntu 12.04 server 作業系統

系統結構

這裡寫圖片描述

安裝過程

  wget  http://mirrors.cnnic.cn/apache/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz  #下載壓縮包
  tar -xvzf apache-flume*.tar.gz  #解壓
  mv  apache-flume /data/local/flume #本人比較喜歡把把軟體安裝在/data/local目錄下   

配置

這裡我直接把我本地的配置發上來

# flume.conf: A Flume configuration

# Agent a1
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# source 配置
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /data/logs/system.log

# sink 配置
a1.sinks.k1.type=avro
a1.sinks.k1.hostname=192.168.0.101
a1.sinks.k1.port=4545

# channel 配置
a1.channels.c1.type = file
a1.channels.c1.checkpointDir=/data/logs/channels/a1/checkpoint
a1.channels.c1.dataDirs = /data/logs/channels/a1/data

# 繫結source、single到channel上
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

#ageng a2
a2.sources=r2
a2.sinks=k2
a2.channels=c2
#a2 source 配置
a2.sources.r2.type=avro
a2.sources.r2.bind=192.168.0.101
a2.sources.r2.port=4545

#a2 sink 配置 將合併後的日誌資料寫到/data/local/collector目錄下
a2.sinks.k2.type = file_roll
a2.sinks.k2.sink.directory = /data/local/collector
a2.sinks.k2.sink.rollInterval=3600



##下面是註釋掉的程式碼為配置sink ,日誌按天合併後儲存到單獨的資料夾中
#a2.sinks.k2.type=hdfs
#a2.sinks.k2.hdfs.path=hdfs://hadoop-master:9000/events/%y-%m-%d
#a2.sinks.k2.hdfs.filePrefix=events-
#a2.sinks.k2.hdfs.rollInterval=0
#a2.sinks.k2.hdfs.rollSize=0
#a2.sinks.k2.hdfs.rollCount=0
#a2.sinks.k2.hdfs.useLocalTimeStamp=true

#a2 channel配置
a2.channels.c2.type = file
a2.channels.c2.checkpointDir=/data/logs/channels/a4/checkpoint
a2.channels.c2.dataDirs = /data/logs/channels/a4/data

# 繫結source、single到channel上
a2.sources.r2.channels=c4
a2.sinks.k2.channel=c4

說明:

執行

在192.168.0.101上使用下面命令啟動Agent2(a2)

bin/flume-ng agent --conf conf --conf-file ./conf/flume.conf --name a2 -Dflume.root.logger=INFO,console

在192.168.0.101另啟動一個終端,執行下面命令啟動Agent1(a1)

bin/flume-ng agent --conf conf --conf-file ./conf/flume.conf --name a1 -Dflume.root.logger=INFO,console

分別在192.168.0.102~103上同樣啟動Agent1(a1)

bin/flume-ng agent --conf conf --conf-file ./conf/flume.conf --name a1 -Dflume.root.logger=INFO,console

生成測試資料的python小程式

#!/usr/bin/python
import os
import random
from time import ctime,sleep
for i in range(1,1000000):
        smil=random.randint(50,100)
        print smil/1000.0
        com="echo \"hello message from 202\t"+str(i)+"\">> /data/logs/system.log";
        print com
        os.system(com)
        sleep(smil/1000.0)

測試結果

可以看到在目錄/data/logs/collector 目錄下生成了多個合併後的日誌檔案

PS:

建議大家閱讀Flume的文件,雖然英文讀起來比較累但是大家搞技術的誰不懂點英文呢,所以下點功夫還是能看懂的。
如果通過本文仍不能理解Flume的工作流程,建議大家學習文件中給出的 A simple example 。(下面作個簡單解釋)

# example.conf: A single-node Flume configuration

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

# Describe the sink
a1.sinks.k1.type = logger

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

原文:This configuration defines a single agent named a1. a1 has a source that listens for data on port 44444, a channel that buffers event data in memory, and a sink that logs event data to the console.
譯:這個配置定義了一個名稱為a1的agent。a1有一個source 監聽埠44444 (接收44444埠的任何收到的資料),一個記憶體管道(channel)將所有接收到的資料都暫存在記憶體當中,一個sink 將收到的資料列印到控臺。

 $ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console

執行上述命令後在另外一個命令視窗執行(沒有telnet? apt-get install telnet 或者yum install telnet 安裝 )

$ telnet localhost 44444
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Hello world! <ENTER>
OK

我們可以看到Flume 的控臺打印出

12/06/19 15:32:19 INFO source.NetcatSource: Source starting
12/06/19 15:32:19 INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:44444]
12/06/19 15:32:34 INFO sink.LoggerSink: Event: { headers:{} body: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0D          Hello world!. }