关于Flume的介绍
Flume 是一个日志收集系统 :
Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。是HADOOP生态圈的一个组件,主要应用与实时数据的流方式,比如一旦有某事件触发可以将实时的日志数据发向HADOOP文件系统HDFS中,
Flume可以将数量庞大的数据从各项数据资源集中起来存储的工具/服务,或数集中机制,所以它还有较强的缓冲作用,
Flume具有较高的容错性.例如当收集数据的速度超过将写入数据的时候,Flume会在数据生产者和数据收容器间作出调整,保证其能够在俩者直接提供可推送的平稳数据,
Flume支持多路径流量,多管道接入流量.例如Flume的数据发出源及目的地可以是不同类别的比如社交媒体,HBASE HDFS ,Kafka,Spark Stream,甚至是其他的Flume.
Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力 。Flume提供了从console(控制台)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系统),支持TCP和UDP等2种模式),exec(命令执行)等数据源上收集数据的能力。
flume的一些核心概念:
Agent代理 | 使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。 |
Client客户端 | 生产数据,运行在一个独立的线程。 |
Source源 | 从Client收集数据,传递给Channel。 |
Sink接收器 | 从Channel收集数据,进行相关操作,运行在一个独立线程。 |
Channel通道 | 连接 sources 和 sinks ,这个有点像一个队列。 |
Events事件 | 传输的基本数据负载。 |
Flume的外部架构:
Flume的内部架构:
Flume以agent为最小的独立运行单位。一个agent就是一个JVM。单agent由Source、Sink和Channel三大组件构成,如下图:
解释source,channel,sink:
Flume事件(EVENT):
1. EVENT事件是flume传输数据流的基本单位
2. 数据推送过程中flume事件(event)从source,流向channel,再到sink
3. EVENT事件是由一个推送的字节数组(该数据组是从数据源接入点传入,并传输给sink设置的目的,比如HDFS).它是由event headers(头信息,) eventbody, event信息(flume收集到日记记录)组成
Flume的配置:
监控网络 1. 准备flume文件,并导入到linux里面,直接解压2. 进入conf文件夹创建一个.conf文件,这个文件就是一个Agent,比如:
touch a1.conf
2. 编辑这个文件文件,在文件内写入
这里是source监听一个指定的网络端口,只要应用程序向这个窗口里面写数据,这个source组件就可以获取信息然后写入到channle,sink从channle 里获取信息,完成后日志数据将被推送到控制台
# 定义agent的source,channel,sink的名字
# a1 就是我们当前文件的名字 即为 Agent的名字
# sr1 就是source的名字
# ch1 就是channel的名字
# log1 就是sink的名字
a1.sources = sr1
a1.channels = ch1
a1.sinks = log1
# 设置source的参数
a1.sources.sr1.type = netcat # 监听的类型, netcat 为监听网络
a1.sources.sr1.bind = zhang # 绑定ip 此时的zhang为一个静态ip 原为: 192.168.50.88
a1.sources.sr1.port = 44444 # 端口为 44444
# 设置channel(管道)的参数
a1.channels.ch1.type = memory # channel的存放位置, 此时存放在memory(内存中)
# 设置sink的参数
a1.sinks.log1.type = logger # sink的传输类型, 这里传数据到logger
# 把source 和 sink 通过 channel 连接在一起
a1.sources.sr1.channels = ch1
a1.sinks.log1.channel = ch1
3. 启动flume
进入flume的bin目录代码 :
./flume-ng agent -c conf -f Agent的文件路径 -n 给它一个名字 -Dflume.root.logger=INFO,console
./flume-ng agent -c ./conf -f /home/hadoop/opt/apache-flume-1.8.0-bin/conf/a1.conf -n a1 -Dflume.root.logger=INFO,console
4. 测试
新建一个window窗口输入命令
telnet zhang 44444
当 window 和你监听的网络建立连接后,你就可以在window发送消息,当你返回你的flume就会看到有提示消息
监控文件
1. 在conf文件夹里面创建一个.conf文件和.text文件,比如:
touch b1.conf
touch b1.text
2. 编辑该文件
# 定义agent的source,channel,sink
b2.sources = sr1
b2.channels = ch1
b2.sinks = log1
# 设置source的参数
b2.sources.sr1.type = exec # 监控类型为文件
b2.sources.sr1.command = tail -f /home/hadoop/opt/apache-flume-1.8.0-bin/bin/a2.text # 监控文件地址
# 设置channel(管道)的参数
b2.channels.ch1.type = memory
# 不设置是因为有默认设置
# 设置sink的参数
b2.sinks.log1.type = logger
# 同上
# 把source 和 sink 通过 channel 连接在一起
b2.sources.sr1.channels = ch1
b2.sinks.log1.channel = ch1
3. 启动flume
在bin目录下
./flume-ng agent -c ./conf -f /home/hadoop/opt/apache-flume-1.8.0-bin/conf/b1.text -n b1 -Dflume.root.logger=INFO,console
4. 测试(新建一个linux窗口)
echo aaaa >> /home/hadoop/opt/apache-flume-1.8.0-bin/conf/b1.text
此时我通过重定向往测试的文件 b1.text 里输入内容,当然你也可以直接编辑这个文件
做完上面几步后返回flume的窗口,你会看到新的提示
监控文件夹
步骤跟上面的一样,代码如下:
# 定义agent的source,channel,sink
b2.sources = sr1
b2.channels = ch1
b2.sinks = log1
# 设置source的参数
b2.sources.sr1.type = spooldir # 监控类型为文件夹
b2.sources.sr1.spoolDir= /home/hadoop/opt # 监控的文件夹
# 设置channel(管道)的参数
b2.channels.ch1.type = memory
# 不设置是因为有默认设置
# 设置sink的参数
b2.sinks.log1.type = logger
# 同上
# 把source 和 sink 通过 channel 连接在一起
b2.sources.sr1.channels = ch1
b2.sinks.log1.channel = ch1
测试的方法同上!
上面三个例子的最后sink存储在logger,现在我们试着将它存储在给hdfs
代码只需要将上面的sink的参数进行修改
b1.sinks.log1.type = hdfs # 存储的类型
b1.sinks.log1.hdfs.path = /user/hadoop/event/%y-%m-%d/%H%M/%S # 存储的路径,后面正则为时间
b1.sinks.log1.hdfs.filePrefix = events- # 文件的前缀
b1.sinks.log1.hdfs.round = true # 对时间的处理
b1.sinks.log1.hdfs.roundValue = 10 # 时间的值
b1.sinks.log1.hdfs.roundUnit = minute # 时间的单位
b1.sinks.log1.hdfs.useLocalTimeStamp = true # 获取本地时间
b1.sinks.log1.hdfs.fileType = DatasTream # 文件编码类型
存储的路径可以是本机的也可以是集群里面的,如果在另一个机子路径则输入:
b1.sinks.log1.hdfs.path = hdfs://python2:9000/user/hadoop/event/%y-%m-%d/%H%M/%S
例如:
这是一个监控文件夹的,但存储的路径为hdfs:
启动:
./bin/flume-ng agent -c conf -f conf/b1.conf -n bl
./bin/flume-ng agent -c conf -f conf/b1.conf -n bl -Dflume.root.logger=info,console
俩种方式都可以使用,第二种的会在控制台进行输出
测试:
首先启动hadoop,查看是否存在event文件夹
往被监控的那个文件夹发送移动一个文件,之后继续查看是否存在event
存在的话通过cat 查看里面的文件: