1. 程式人生 > >大資料日誌檔案實時收集框架Flume介紹及其使用

大資料日誌檔案實時收集框架Flume介紹及其使用

大資料中,我們經常會將一些日誌檔案收集分析,比如網站的日誌檔案等等,我們需要一個工具收集資料並且上傳到HDFS,HIVE,HBASE等大資料倉庫中,Apache為我們提供了一個很好的檔案實時收集框架供我們使用。

一、Flume的介紹

官網的介紹如下:

Apache Flume is a distributed, reliable, and available system for efficiently collecting, aggregating and moving large amounts of log data from many different sources to
a centralized data store. The use of Apache Flume is not only restricted to log data aggregation. Since data sources are customizable, Flume can be used to transport massive quantities of event data including but not limited to network traffic data, social-media-generated data, email messages and pretty much any
data source possible. Apache Flume is a top level project at the Apache Software Foundation.

Flume框架是一個分散式,可信以及高可用的用來從一個源端有效的收集,聚集和移動海量日誌檔案儲存到資料倉庫的系統。
Flume框架在大資料分析中還是有著重要的地位,它是Apache的一個頂級專案。
Flume的架構圖如下:
這裡寫圖片描述
Flume由三大元件構成:

  • Source
  • Channel
  • Sink

在介紹中之所以說它是一個分散式框架,是因為它本身就是一個客戶端,每一個客戶端是一個Agent,可以分佈在一個叢集的各個節點收集日誌資訊。下面的一幅圖表現出其分散式架構:
這裡寫圖片描述

遺憾的是Flume只能執行在linux伺服器上,下面看看安裝執行Flume的必需環境:

  1. linux系統
  2. JDK環境
  3. 足夠的記憶體空間和磁碟空間(一般不需要很大)

Flume是怎樣工作的呢?
這時就有一個概念:
Event:
什麼是event呢?

A Flume event is defined as a unit of data flow having a byte payload and an optional set of string attributes.

event是一次收集傳遞資料的最小單位。
Event由一個可選的header頭和一個載有資料的byte array組成,載有的資料對flume是不透明的,header是一個容納了key-value對的無序集合,key在這個集合中唯一存在,這個類似於Java中的set集合,無序不可重複。

Flume可以從外部的一個源端(例如Web Server)通過Source元件來收集日誌,每一次收集的日誌都會被封裝在一個Event中,主動(put)存放在Channel中,sink會(poll)從這個Channel中獲取資料儲存到資料倉庫中。這個Channel是一個佇列,裡面存放著event,channel可以存放在記憶體中,也可以在檔案中等等。

三大元件的介紹
上面說到Flume的三大元件sources,channel,sinks。
在Apache官網中它提供了這三大元件的種類,這裡列舉了幾個常用的來說明。
常用的Sources:
這裡寫圖片描述
下面的案例中我們會用NetCar TCP Source來演示。

常用的channel:
這裡寫圖片描述
下面案例中使用Memory Channel,存放在記憶體中。

常用Sink如下:
這裡寫圖片描述
下面案例中使用Logger Sink,將收集的資料列印在控制檯日誌中。

二、簡單的Flume日誌搭建

1.安裝Flume
Flume的安裝很簡單,只需要下載安裝解壓然後修改配置檔案即可。下載地址【http://archive.cloudera.com/cdh5/】,這裡使用的是Flume 1.5.0-cdh5.3.6這個版本。
在Flume解壓後,會有一個bin目錄,裡面有一個Flume-ng,Flume-ng只有一個角色的節點:agent節點,agent由Source、channel、sink組成。啟動時會利用它來啟動Flume。

然後進入conf目錄下,在flume-env.sh檔案新增jdk路徑:

export JAVA_HOME=/opt/modules/jdk1.7.0_79

下面我們來列舉一個案例看看Flume是如何實時收集日誌檔案的。
如上面所說,我們使用NetCat Source(linux的一個軟體,可以在遠端伺服器的控制檯輸入資訊並且接收),Memory Channel,Logger Sink,將接收的日誌資訊列印在客戶端。

在conf目錄下建立一個a1.conf檔案,編輯內容如下:

# The configuration file needs to define the sources, 
# the channels and the sinks.
# Sources, channels and sinks are defined per agent, 
# in this case called 'agent'
a1.sources = r1
a1.channels = c1
a1.sinks = k1

#define sources
a1.sources.r1.type = netcat
a1.sources.r1.bind = hadoop-senior.shinelon.com
a1.sources.r1.port = 44444

#define channels
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
#a1.channels.c1.keep-alive=100
#a1.channels.c1.byteCapacityBufferPercentage=20

#define sink
a1.sinks.k1.type = logger
a1.sinks.k1.maxBytesToLog = 2014

#bind sources and sink to channel 
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

上面的程式碼都有註釋,不加詳細解釋,就是定義Source,Channel,Sink。編譯好之後儲存。
注意,使用NetCat Source需要安裝telnet軟體。
在啟動Flume之前講解一下Flume-ng的幾個引數:

  • -c或者–conf:跟配置目錄
  • -f或者–conf-file:跟具體的配置檔案
  • -n或者–name:指定agent的名稱
    然後在Flume 的安裝目錄下輸入命令啟動:
bin/flume-ng agent --conf conf --name al --conf-file conf/a1.conf -Dflume.root.logger=DEBUG,console

然後開啟另一個控制檯,用來連線Flume並且傳送資訊:

[shinelon@hadoop-senior root]$ telnet hadoop-senior.shinelon.com 44444

連線之後,當我們傳送資訊,控制檯就會列印資訊。
這裡寫圖片描述

這裡寫圖片描述

至此,我們就介紹完Flume,並且用一個簡單的案例來演示Flume,通過這個案例我們可以感受到它的工作流程以及它的實時性。