1. 程式人生 > >1.Flume概念,功能,架構

1.Flume概念,功能,架構

1.Flume介紹

Flume是一種分散式、可靠且可用的服務,用於有效地收集、聚合和移動大量日誌資料。它是基於流資料的靈活架構。它具有高可靠性機制和許多故障轉移及恢復機制,具有強大的容錯能力。它使用簡單的可擴充套件資料模型,允許線上分析應用程式。

2.Flume架構

Flume-ng只有一個角色的節點:Agent角色。Agent角色有Source、Channel、Sink組成。

  • Source:用於採集資料,Source是產生資料流的來源方,同時將產生的資料流傳輸到Channel。
  • Channel:連線Sources和Sinks,這個管道類似與一個佇列。
  • Sink:從Channels收集資料,將資料寫到目標源,可以是下一個Source也可以是HDFS或HBASE。

Event是Flume資料傳輸的基本單元,Flume以Event的形式將資料從源頭傳送到最終目的地。Event由(可選的)Header和載有資料的一個Byte Array組成。

  • 載有的資料對Flume是不透明的
  • Header是容納了key-value的無序集合,key在集合內是唯一的
  • Header可以在上下文路由中擴充套件

3.Apache Flume安裝配置

# 0.需要的環境
# flume工作準備:(1)Java執行環境(2)記憶體(3)磁碟空間(4)目錄許可權
# 1.下載apache flume 1.7
https://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.6.0/apache-flume-1.6.0-bin.tar.gz
# 2.解壓
tar -zvf apache-flume-1.6.0-bin.tar.gz
mv apache-flume-1.6.0-bin flume-1.6.0
# 3.配置JAVA_HOME
cd flume-1.6.0/conf
cp flume-env.sh.template flume-env.sh #修改JAVA_HOME
# 4.啟動
bin/flume-ng agent \    #agent
    -n agent-01 \    #指定名稱
    -c conf \        #指定配置檔案目錄
    -f conf/flume-conf.properties.template    #指定配置檔案

4.編寫第一個Flume Agent(實時讀取資料)

#1.新建a1.conf
touch conf/a1.conf

#2.編寫a1.conf
#agent
a1.sources = r1
a1.channels = c1
a1.sinks = k1
#source
a1.sources.r1.type=netcat
a1.sources.r1.bind=master
a1.sources.r1.port=55555
#channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#sink
a1.sinks.k1.type=logger
#bind
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1

執行啟動flume命令:

bin/flume-ng agent -c conf -n agent-a1 -f conf/a1.conf \
-Dflume.root.logger=DEBUG,console #因為預設配置輸出日誌到檔案,我們需要它輸出到控制檯可見。

安裝並啟動telnet:

# 1.安裝telnet-server
yum -y install telnet-server
# 2.開啟服務
service xinetd start
# 3.開啟埠55555
telnet master 55555

5.編寫第二個Flume Agent(收集日誌,儲存到HDFS)

a2.sources = r2
a2.sinks = k2
a2.channels = c2

a2.sources.r2.type = exec
a2.sources.r2.command = tail -f /var/log/my.log # mysql本地日誌
a2.sources.r2.shell = /bin/bash -c

a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100

a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://master:8020/mysql_r2/ #hdfs目錄
a2.sinks.k2.hdfs.fileType = DataStream
a2.sinks.k2.hdfs.writeFormat = Text
a2.sinks.k2.hdfs.batchSize = 5

a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2

啟動flume:

bin/flume-ng agent -c conf -n a2 -f conf/a2.conf -Dflume.root.logger=DEBUG,console

檢視收集結果:

[[email protected] ~]# hdfs dfs -ls /mysql_r2
Found 14 items
-rw-r--r--   3 root root        338 2018-10-26 15:30 /mysql_r2/FlumeData.1540538984894
-rw-r--r--   3 root root          7 2018-10-26 15:36 /mysql_r2/FlumeData.1540539367248
-rw-r--r--   3 root root         70 2018-10-26 15:37 /mysql_r2/FlumeData.1540539409803
-rw-r--r--   3 root root         70 2018-10-26 15:37 /mysql_r2/FlumeData.1540539409804
-rw-r--r--   3 root root         70 2018-10-26 15:37 /mysql_r2/FlumeData.1540539409805
-rw-r--r--   3 root root         56 2018-10-26 15:37 /mysql_r2/FlumeData.1540539409806
-rw-r--r--   3 root root         70 2018-10-26 15:37 /mysql_r2/FlumeData.1540539468662
-rw-r--r--   3 root root         70 2018-10-26 15:37 /mysql_r2/FlumeData.1540539468663
-rw-r--r--   3 root root         70 2018-10-26 15:38 /mysql_r2/FlumeData.1540539468664
-rw-r--r--   3 root root         42 2018-10-26 15:38 /mysql_r2/FlumeData.1540539468665
-rw-r--r--   3 root root         70 2018-10-26 15:39 /mysql_r2/FlumeData.1540539553306
-rw-r--r--   3 root root         28 2018-10-26 15:39 /mysql_r2/FlumeData.1540539553307
-rw-r--r--   3 root root          7 2018-10-26 15:40 /mysql_r2/FlumeData.1540539600840
-rw-r--r--   3 root root         35 2018-10-26 15:44 /mysql_r2/FlumeData.1540539884180.tmp

6.編寫第三個Flume Agent(實時收集日誌,按時間分目錄儲存到HDFS)

a3.sources = r3
a3.sinks = k3
a3.channels = c3

a3.sources.r3.type = spooldir
a3.sources.r3.spoolDir= /var/log/my.log # mysql本地日誌
a3.sources.r3.ignorePattern = ^(.)*\\.log$ #不收集log結尾的
a3.sources.r3.fileSuffix = .delete #收集完之後檔名以.delete結尾
a3.sources.r3.useLocalTimeStamp = true #使用本地日期

a3.channels.c3.type = file
a3.channels.c3.checkpointDir = /mnt/flume/checkpoint
a3.channels.c3.dataDirs = /mnt/flume/data

a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path = hdfs://master:8020/spool/logs/%Y%m%d #hdfs目錄(日期變動的目錄)
a3.sinks.k3.hdfs.fileType = DataStream
a3.sinks.k3.hdfs.writeFormat = Text
a3.sinks.k3.hdfs.batchSize = 5

a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3

啟動flume:

bin/flume-ng agent -c conf -n a3 -f conf/a3.conf -Dflume.root.logger=DEBUG,console

檢視收集結果:

[[email protected] ~]# hdfs dfs -ls /spool/logs/
Found 14 items
-rw-r--r--   3 root root        0 2018-10-26 15:30 /spool/logs/20181025
-rw-r--r--   3 root root        0 2018-10-26 15:36 /spool/logs/20181026