Flume概述、安装与部署、两个简单的小案例

一:Flume概述
1.Flume的定义
Flume是Cloudera提供的一个高可用的,高可靠的,分布式海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。所谓的流式架构,简单来说就是数据源源不断的来,并且不停的处理输出,相对于流式架构,有一个静态数据处理,静态数据处理的代表为mapreduce。
流式数据处理的主要两个特点,一个是源源不断,另一个是粒度细(按行收集数据),粒度越细,实时性越高
Flume的主要作用就是,实时 读取服务器本地磁盘的数据,将数据写入到HDFS

2.FLume基础架构

Flume组成架构如下图所示。

flume能直接从MySQL数据库中读取库表数据到hdfs flume的数据处理流程_Source


方框中的内容就是一个FLume的组成其中的Agent:是一个JVm进程,它以事件的形式将数据从源头送至目的地,Agent主要由三个部分组成Source,Channel,Sink

1)Source
Source负责从源里面拉取数据,并且把数据进行包装(拿到一行数据,会被Flume转换成一个二进制数组,然后把数组包装成一个Event)。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。

2)Channel
Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上(削峰)。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。
Flume自带两种Channel:Memory Channel和File Channel。
Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。
File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。
后面还会扩展一个Kafka Channel

3)Sink
Sink不断地轮询Channel中的事件,对它们进行拆包,拆成二进制数据,且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
Sink组件目的地包括hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定义。

4)Event

传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。Event由Header和Body两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组。

flume能直接从MySQL数据库中读取库表数据到hdfs flume的数据处理流程_大数据_02


二:Flume安装与部署

Flume的安装与部署:
1.下载:可以通过官网http://archive.apache.org/进行下载
2.部署:
1)将下载好的jar包上传到自己集群中喜欢的位置
2)同样将apache-flume-1.9.0-bin.tar.gz解压到自己喜欢的位置

tar -zxf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/

3)根据自己的喜好可以进行改名

mv /opt/module/apache-flume-1.9.0-bin /opt/module/flume

4)环境变量的话,我这里就不配了。如果觉得自己用的不方便可以自行配置。JAVA_HOME和HADOOP_HOME记得配一下。
5)将lib文件夹下的guava-11.0.2.jar删除以兼容Hadoop 3.1.3,避免jar包冲突。

rm /opt/module/flume/lib/guava-11.0.2.jar

三:Flume中的HelloWorld

案例一:监控端口数据官方案例
1)需求:使用Flume监听一个端口,收集该端口数据,并打印到控制台。
2)简单的分析:可以通过netcat工具向本机的一个端口号发送数据,Flume监控这个端口并通过source端读取数据,然后将数据通过Sink打印在控制台上。
3)实现:
(1)可以在Flume目录下创建一个目录存取配置信息。

mkdir job
cd job

(2)创建配置文件

vim netcat-logger.conf

(3)编写配置文件

添加内容如下:
# a1 表示Agent的名称 r1表示Source的名称 k1表示Sink的名称 c1表示Channel的名称
a1.sources = r1 
a1.sinks = k1
a1.channels = c1

# r1为一个netcat源监视6666端口 如果bind设置为localhost或者别的那么就只能接受从指定的地址发来的数据。而设置为0.0.0.0可以接受任意地址的数据
a1.sources.r1.type = netcat
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 6666

# Sink为一个logger Sink
a1.sinks.k1.type = logger

# Channel为一个Memory Channel(内存)
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 定义r1与c1的关系 k1与c1的关系 一个Source连接一个Channel(注意这里一个Source可以连接多个Channel,因此定义的时候使用的是channels,这个s不能去掉) 一个Channel连接一个Sink(一个sink只能与一个Channel相连,因此这里不能加s,但是一个Channel可以与多个Sink相连)
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

具体的参数解析可以查看官网的User Guide,什么参数不明白直接Ctrl+F搜索即可,一般加粗的都为比较重要的配置。

flume能直接从MySQL数据库中读取库表数据到hdfs flume的数据处理流程_hdfs_03


(4)开启Flume监听端口

bin/flume-ng agent -c conf/ -n a1 -f job/flume-netcat-logger.conf -Dflume.root.logger=INFO,console

参数说明:
-c:表示配置文件存储在conf/目录
-n:表示给agent起名为a1
-f:flume本次启动读取的配置文件是在job文件夹下的flume-telnet.conf文件。
-Dflume.root.logger=INFO,console :-D表示flume运行时动态修改flume.root.logger参数属性值,并将控制台日志打印级别设置为INFO级别。日志级别包括:log、info、warn、error。

(5)可以查看一下端口是否监听成功,根据图片可以看到监听成功

netstat -nltp | grep 6666

flume能直接从MySQL数据库中读取库表数据到hdfs flume的数据处理流程_大数据_04

(6)使用netcat工具向本机的6666端口发送内容,可以看到接受成功

nc localhost 6666
aaa

flume能直接从MySQL数据库中读取库表数据到hdfs flume的数据处理流程_数据_05


案例二:实时监控单个追加文件

1)需求:实时监控Hive日志,并上传到HDFS中

2)简单的分析:创建符合条件的Flume配置文件,执行配置文件开启监控,开启hive生成日志,查看HDFS上的数据。

3)实现:

(1)Flume要想将数据输出到HDFS,依赖Hadoop相关jar包

检查/etc/profile.d/my_env.sh文件,确认Hadoop和Java环境变量配置正确

#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin

##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

(2)创建flume-file-hdfs.conf文件

vim flume-file-hdfs.conf

注:要想读取Linux系统中的文件,就得按照Linux命令的规则执行命令。由于Hive日志在Linux系统中所以读取文件的类型选择:exec即execute执行的意思。表示执行Linux命令来读取文件。
(3)编写文件

# Name the components on this agent
a2.sources = r2
a2.sinks = k2
a2.channels = c2

# Describe/configure the source
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /opt/module/hive/logs/hive.log
a2.sources.r2.shell = /bin/bash -c

# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://hadoop102:8020/flume/%Y%m%d/%H
#上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs-
#是否按照时间滚动文件夹
a2.sinks.k2.hdfs.round = true
#多少时间单位创建一个新的文件夹
a2.sinks.k2.hdfs.roundValue = 1
#重新定义时间单位
a2.sinks.k2.hdfs.roundUnit = hour
#是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
#积攒多少个Event才flush到HDFS一次
a2.sinks.k2.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一个新的文件
a2.sinks.k2.hdfs.rollInterval = 60
#设置每个文件的滚动大小
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a2.sinks.k2.hdfs.rollCount = 0

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

# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2

注意:
对于所有与时间相关的转义序列,Event Header中必须存在以 “timestamp”的key(除非hdfs.useLocalTimeStamp设置为true,此方法会使用TimestampInterceptor自动添加timestamp)。
(4)运行Flume

bin/flume-ng agent --conf conf/ --name a2 --conf-file job/flume-file-hdfs.conf

(5)开启Hadoop和Hive并操作Hive产生日志

sbin/start-dfs.sh
sbin/start-yarn.sh
bin/hive

(6)在HDFS上查看文件。