分布式日志收集框架Flume---实现网络端口监听日志收集
flume Overview:
Apache Flume是一个分布式,可靠且可用的系统,用于有效地从许多不同的源收集,聚合和移动大量日志数据到集中式数据存储。
Apache Flume的使用不仅限于日志数据聚合。由于数据源是可定制的,因此Flume可用于传输大量事件数据,包括但不限于网络流量数据,社交媒体生成的数据,电子邮件消息以及几乎任何可能的数据源。
Apache Flume是Apache Software Foundation的顶级项目。
需要的系统环境:
- Java运行时环境 - Java 1.8或更高版本(>1.7)
- 内存 - sources, channels和sinks使用的配置的足够内存
- 磁盘空间 - channels和sinks使用的配置的足够磁盘空间
- 目录权限 - agent使用的目录的读/写权限
数据流模型
Flume事件被定义为具有字节有效负载和可选字符串属性集的数据流单元。Flume代理是一个(JVM)进程,它承载事件从外部源流向下一个目标(跃点)的组件。Flume源消耗由外部源(如Web服务器)传递给它的事件。外部源以目标Flume源识别的格式向Flume发送事件。例如,Avro Flume源可用于从Avro客户端或从Avro接收器发送事件的流中的其他Flume代理接收Avro事件。可以使用Thrift Flume Source定义类似的流程,以接收来自Thrift Sink或Flume Thrift Rpc客户端或Thrift客户端的事件,这些客户端使用Flume thrift协议生成的任何语言编写。当Flume源接收事件时,它将其存储到一个或多个频道。该通道是一个被动存储器,可以保持事件直到它被Flume接收器消耗。文件通道就是一个例子 - 它由本地文件系统支持。接收器从通道中移除事件并将其放入外部存储库(如HDFS(通过Flume HDFS接收器))或将其转发到流中下一个Flume代理(下一跳)的Flume源。给定代理程序中的源和接收器与通道中暂存的事件异步运行。
下面看一个例子:
# example.conf: A single-node Flume configuration
#a1:agent的名称
#r1:source的名称
#k1:sink的名称
#c1:channel的名称
# 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
配置好agent,sources,channel,sinks的相关参数后,执行下列的命令运行:
$bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template
flume-ng agent \ #运行一个agent
-n $agent_name\ #可替换成 --name ,指agent的名字----上面的例子中就是a1
-c conf \ #可替换成 --conf , configs 的路径
-f conf/flume-conf.properties.template #可替换成 --conf-file , 配置文件的路径,就是上面的例子保存的地址
-Dflume.root.logger=INFO,console #可加上这一句让日志打印在控制台
example:flume-ng agent --name a1 --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/example.sonf -Dflume.root.logger=INFO,console
运行上面的命令后,使用telnet进行测试:telnet localhost 44444
得到结果 Event: { headers:{} body: 68 65 6C 6C 6F 0D hello. }
Event是Flume数据传输的基本单元
Event = 可选的 header + byte array