Flume简介

Apache Flume是一个分布式、可靠、高可用的日志收集系统,支持各种各样的数据来源,如http,log文件,jms,监听端口数据等等,能将这些数据源的海量日志数据进行高效收集、聚合、移动,最后存储到指定存储系统中,如kafka、分布式文件系统、Solr搜索服务器等;

Apache Flume主要有以下几大模块组成:

  1. 数据源采集(Source)
  2. 数据拦截(Interceptor)
  3. 通道选择器(Channel Selector)
  4. 数据通道(Channel)
  5. Sink处理器(Sink Processor)
  6. Sink(Sink)
  7. 事件序列化(Serialization)

模块组成图如下所示:

下面将对各个模块做个简单的介绍,在这之前,有必要先了解一下什么是事件?

在Flume中,所谓的事件指的是Flume数据流中的数据单位,包含header和body,用于存储日志数据,其中header是一个map结构,我们可以往header存放一些信息,如时间戳,appid等,以便后续对事件进行处理,body存放的是收集的日志内容字节流,结构如下图所示:

数据源采集(Source)

先看下source模块在流程图中所处的位置,这里以最简单的架构图来作为示例,如下图所示:

Flume source主要功能是消费传递给它的事件;

Flume内置了各种类型的Source,用于处理各种类型的事件,如下所示,理论上Flume支持所有类型的事件,因为Flume支持自定义Source:

  1. Avro Source:支持Avro协议(实际上是Avro RPC)
  2. Thrift Source:支持Thrift协议
  3. Exec Source:基于Unix的command在标准输出上生产数据
  4. JMS Source:从JMS系统中读取数据
  5. Spooling Directory Source:监控指定目录内数据变更
  6. Twitter 1% firehose Source:通过API持续下载Twitter数据,试验性质
  7. Netcat Source:监控某个端口,将流经端口的每一个文本行数据作为Event输入
  8. Sequence Generator Source:序列生成器数据源,生产序列数据
  9. Syslog Sources:读取syslog数据,产生Event,支持UDP和TCP两种协议
  10. HTTP Source:基于HTTP POST或GET方式的数据源,支持JSON、BLOB表示形式(实际上支持任何形式,因为handle可以自定义)
  11. Legacy Sources:兼容老的Flume OG中Source(0.9.x版本)

这里列举几个比较常用的source,

如Exec Source,通过它我们可以监听一个日志文件的变化,如下配置,

a1.sources = r1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /var/log/secure
a1.sources.r1.channels = c1

Avro Source,通过它,我们可以将两个Flume Agent关联起来(因为agent的source和sink都支持Avro),正是这个特性,大大提高了flume的灵活性,可用性...

a1.sources = r1
a1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port =

HTTP Source,通过它,可以接收http请求上报的数据,如下是配置示例,监听5140端口的http请求,这里的handle是可以自定义的,也就是说我们可以接收任何类型的上报数据,如json格式、xml等等。

a1.sources = r1
a1.channels = c1
a1.sources.r1.type = http
a1.sources.r1.port =
a1.sources.r1.channels = c1
a1.sources.r1.handler = org.example.rest.RestHandler
a1.sources.r1.handler.nickname = random props

数据拦截(Interceptor)

先看下interceptor模块在流程图中所处的位置,如下图所示:

拦截器主要的功能是对事件进行过滤,修改;

Flume内置支持的拦截器如下(主要两类:过滤和修改):

  1. Timestamp Interceptor:在事件头中插入以毫秒为单位的时间戳,如果在之前已经有这个时间戳,则保留原有的时间戳。
  2. Host Interceptor:
  3. Static Interceptor
  4. UUID Interceptor
  5. Morphline Interceptor
  6. Search and Replace Interceptor
  7. Regex Filtering Interceptor
  8. Regex Extractor Interceptor

当然,flume是支持自定义拦截器的,如下是一个简单的配置示例:

#拦截器
a1.sources.r1.interceptors = i1
#a1.sources.r1.interceptors.i1.type = org.apache.flume.sw.interceptor.SignCheckInterceptor$Builder
a1.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.RegexFilteringInterceptor$Builder
a1.sources.r1.interceptors.i1.regex = (\\d):(\\d):(\\d)
a1.sources.r1.interceptors.i1.serializers = s1 s2 s3
a1.sources.r1.interceptors.i1.serializers.s1.name = one
a1.sources.r1.interceptors.i1.serializers.s2.name = two
a1.sources.r1.interceptors.i1.serializers.s3.name = three

通道选择器(Channel Selector)

先看下interceptor模块在流程图中所处的位置,如下图所示:

通道选择器的主要功能是对事件流进行复制和分流;

Flume内置了两种类型的通道选择器:

  1. 复制(Replicating Channel Selector),使用该选择器,我们可以同时让同一事件传递到多个channel中,最后流入多个sink;
  2. 分流(Multiplexing Channel Selector),使用该选择器,我们可以让特定的事件流入到特定的channel中,如不同项目产生的日志事件,交由不同的sink处理;

如下是一个分流的配置示例:

a1.sources = r1
a1.channels = c1 c2 c3 c4
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = state
a1.sources.r1.selector.mapping.CZ = c1
a1.sources.r1.selector.mapping.US = c2 c3
a1.sources.r1.selector.default = c4

当然,通道选择器是支持自定义的,我们可以自己实现通道选择器,并做如下配置:

a1.sources = r1
a1.channels = c1
a1.sources.r1.selector.type = org.example.MyChannelSelector

数据通道(Channel)

先看下channel模块在流程图中所处的位置,如下图所示:

通道Channel的主要功能是缓存日志事件;

Flume内置的Channel如下:

  1. Memory Channel:内存通道
  2. JDBC Channel:存储在持久化存储中,当前Flume Channel内置支持Derby
  3. File Channel:存储在磁盘文件中
  4. Spillable Memory Channel:存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件(当前试验性的,不建议生产环境使用)
  5. Pseudo Transaction Channel:测试用途

同样,Flume支持自定义通道;

如下是一个内存通道的配置示例:

a1.channels = c1
a1.channels.c1.type = memory
a1.channels.c1.capacity =
a1.channels.c1.transactionCapacity =
a1.channels.c1.byteCapacityBufferPercentage =
a1.channels.c1.byteCapacity =

Sink处理器

先看下Sink处理器在流程图中所处的位置,如下图所示:

Sink处理器的主要功能是让一组sink groups支持负载均衡和灾难转移功能,我觉得跟通道选择器有点类似通过自定义的方式,我觉得是可以实现通道选择器的功能的;

Flume内置的sink处理器如下:

  1. load_balance:负载均衡
  2. failover:主备(灾难转移)

同样的,也支持自定义sink处理器;

如下是一个负载均衡的例子,使用随机选择算法:

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = random

Sink(Sink)

先看下Sink模块在流程图中所处的位置,如下图所示:

Sink的主要功能是将事件输出到下一个agent的source或其它存储系统如,分布式文件系统、kafka、本地文件系统、日志等;

Flume内置的sink如下:

  1. HDFS Sink:数据写入HDFS
  2. Logger Sink:数据写入日志文件
  3. Avro Sink:数据被转换成Avro Event,然后发送到配置的RPC端口上
  4. Thrift Sink:数据被转换成Thrift Event,然后发送到配置的RPC端口上
  5. IRC Sink:数据在IRC上进行回放
  6. File Roll Sink:存储数据到本地文件系统
  7. Null Sink:丢弃到所有数据
  8. HBase Sink:数据写入HBase数据库
  9. Morphline Solr Sink:数据发送到Solr搜索服务器(集群)
  10. ElasticSearch Sink:数据发送到Elastic Search搜索服务器(集群)
  11. Kite Dataset Sink:写数据到Kite Dataset,试验性质的

当然,flume也是支持自定义的;

我们举个本地文件系统的例子,配置如下即可:

a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = file_roll
a1.sinks.k1.channel = c1
a1.sinks.k1.sink.directory = /var/log/flume

事件序列化(Serialization)

序列化在流程图中所处的位置与Sink一样,这里就不画了,简单地说,Sink负责将事件输出到外部,那么以何种形式输出(直接文本形式还是其它形式),需要包含哪些东西(body还是header还是其它内容...),就是由事件序列化来完成的;

Flume内置的事件序列化如下:

  1. Body Text Serializer:看名字就知道,直接将事件的body作为文本形式输出,事件header将被忽略
  2. Avro Event Serializer:Avro序列化,包含事件全部信息

Flume同样支持自定义事件序列化,需要实现EventSerializer接口;

下面举个Body Text Serializer的配置示例:

a1.sinks = k1
a1.sinks.k1.type = file_roll
a1.sinks.k1.channel = c1
a1.sinks.k1.sink.directory = /var/log/flume
a1.sinks.k1.sink.serializer = text
a1.sinks.k1.sink.serializer.appendNewline = false

结语

上面对flume各个模块,或者说组件,做了一个简短的介绍,基本知道了Flume是个怎么回事,接下来将对各个组件做个介绍,并开发各个组件的自定义实现。

参考资料

http://flume.apache.org/FlumeUserGuide.html

http://shiyanjun.cn/archives/915.html

Apache Flume 1.7.0 各个模块简介的更多相关文章

  1. Apache Flume 1.7.0 发布,日志服务器

    Apache Flume 1.7.0 发布了,Flume 是一个分布式.可靠和高可用的服务,用于收集.聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型.这是一个可靠.容错的服务. 本次更 ...

  2. Apache Flume 1.7.0 源码编译 导入Eclipse

    前言 最近看了看Apache Flume,在虚拟机里跑了一下flume + kafka + storm + mysql架构的demo,功能很简单,主要是用flume收集数据源(http上报信息),放入 ...

  3. Apache Flume 1.6.0 发布,日志服务器

    Apache Flume 1.6.0 发布,此版本现已提供下载: http://flume.apache.org/download.html 更新日志和文档: http://flume.apache. ...

  4. Apache Flume 1.7.0 自定义输入输出

    自定义http source config a1.sources.r1.type=http a1.sources.r1.bind=localhost a1.sources.r1.port= a1.so ...

  5. Flume 1.5.0简单部署试用

    ================================================================================ 一.Flume简介 ========= ...

  6. Apache Flume日志收集系统简介

    Apache Flume是一个分布式.可靠.可用的系统,用于从大量不同的源有效地收集.聚合.移动大量日志数据进行集中式数据存储. Flume简介 Flume的核心是Agent,Agent中包含Sour ...

  7. 各开源协议BSD,GPL,LGPL,Apache 2.0,mit等简介*

    快速阅读 分类 子分类 开源约定 BSD original BSD license.FreeBSD license.Original BSD license 为所欲为 Apache Licence 2 ...

  8. Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(一)

    Flume 1.7.0 User Guide Introduction(简介) Overview(综述) System Requirements(系统需求) Architecture(架构) Data ...

  9. Apache Flume 安装文档、日志收集

    简介: 官网 http://flume.apache.org 文档 https://flume.apache.org/FlumeUserGuide.html hadoop 生态系统中,flume 的职 ...

随机推荐

  1. 利用base64库暴力破解base加密

    做个base加密题python语法出了一堆错误..... 附上py中关于base加密/解码的知识:http://www.open-open.com/lib/view/open1433990719973 ...

  2. GCTF2017部分write up

    Misc stage1 拿到题看到是一张图片隐写 用神器Stegsolve看看发现左上角藏着一张二维码 截下来,不能直接扫,需要反色处理一下 扫出来是一串十六进制 看头几个十六进制数发现是pyc文件 ...

  3. 浅尝JavaScript document对象

    document对象 每个载入浏览器的 HTML 文档都会成为 Document 对象.document 对象是HTML文档的根节点与所有其他节点(元素节点,文本节点,属性节点, 注释节点).Docu ...

  4. jersery+jetty嵌入式restful的框架开发

    随着微服务的流程,越来越多的后台服务采用了restful api风格的开放API,jersery+jetty嵌入式变成了一个很好的选择, 我自己写了一个简单的框架,https://github.com ...

  5. [翻译]成为顶尖程序员应当学什么?Python、C还是Ruby?

    原文地址(墙外):https://medium.com/life-tips/should-you-learn-python-c-or-ruby-to-be-a-top-coder-infographi ...

  6. Ext常用开发基础知识

    Ext常用开发基础知识 组件定义 //这种方法可以缓存所需要的组件 调用起来比较方便(方法一 ) Ext.define('MySecurity.view.home.HomePanel', { //添加 ...

  7. net::ERR_CONNCTION_ABORTED与http post request header is too large 错误

    开始浏览器报(net::ERR_CONNCTION_ABORTED)然后就一直找这个错误是怎么引起的,找了一圈也没有找到答案. 后来看了一下后台发出后台错http post request heade ...

  8. http(一)web和网络基础

    深入学习http不为别的,只为补充底层知识,打好根基,深入了解其他技术,擒贼先擒王,学好九阳神功以后,乾坤大挪移,太极剑就容易了,急于求成,就只能变周芷若.走着...... 来源于:图解HTTP 1. ...

  9. 浅析ConcurrentHashMap

    一.导论 这些天一直在看关于多线程和高并发的书籍,也对jdk中的并发措施了解了些许,看到concurrentHashMap的时候感觉知识点很乱,有必要写篇博客整理记录一下. 当资源在多线程下共享时会产 ...

  10. jsp登陆页面验证码在火狐浏览器不能刷新问题处理方案

    jsp登陆页面在火狐浏览器验证码不能刷新问题处理方案: <img src="YzmServlet" onClick="this.src='YzmServlet?ti ...