简介
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。
flume架构
组件中名词解释:
- agent 是一个JVM进程,它以事件的形式讲数据从源头送至目的地
主要由三部分组成:- Source 负责接收数据到Flume,它可以处理各种类型,各种格式的日志,包括avro,thrift,netcat http 等等
- Channel 是位于Source和Sink之间的缓冲区,Channel是线程安全的,可以同时处理几个source的写入操作和几个sink的读取操作。Channel分为两种:Memory ,File 一个基于内存一个基于文件,基于内存的就不用说了,处理速度快,但是不保证数据 的完整性。
- Sink 不断的轮询Channel中的事件,处理完成之后,移除他们。Sink是完全事务型的,在Channel批量删除数据之前,每个Sink用Channel启动一个事务,批量事件一旦成功写出到存储系统或者下一个Flume Agent,Sink就利用Channel提交事务。批量事务一旦成功写出缓存或者下一个Flume Agent,Sink 就利用Channel提交事务。事务一旦被提交,改Channel从自己的内部删除缓存区事件。
- Event 传输单元,由可选的header 和载有数据的一个byte数组组成,Header是容纳了key-value对的HashMap
flume内部实现原理
我们平时使用的架构是 多个flume使用,每个分节点上部署一台flume负责收集发送日志,单独有一台总flume负责将数据写入HDFS或者Hbase中。
flume 安装
安装比较简单,它不像Hive一样依托于hadoop,单纯的下载配置即可用。使用的是稳定版本1.9
修改config目录下的 flume.conf ,如果没有可以复制 flume-conf.properties.template 文件内容。
新增配置:
# Name the components on this agent
#a1的输入源
a1.sources = r1
#a1的目的地
a1.sinks = k1
#a1的缓冲区
a1.channels = c1
# source
#表示a1的输入源的类型为netcat
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# sink
#a1的输出目的地是控制台的logger类型
a1.sinks.k1.type = logger
# channel
#表示a1的channel类型是memory内存型
a1.channels.c1.type = memory
#表示的a1的channel总容量是1000个event
a1.channels.c1.capacity = 1000
#表示a1的channel传输时收集到100条event以后在去提交事务
a1.channels.c1.transactionCapacity = 100
#表示将r1和c1连接起来
a1.sources.r1.channels = c1
#表示将k1和c1连接起来
a1.sinks.k1.channel = c1
开启服务器
flume-ng.cmd agent -conf-file ../conf/flume.conf -name a1 -property flume.root.logger=INFO,console
我们使用netcat作为客户端一直生产数据
nc localhost 44444
以下效果: