设为首页 收藏本站
查看: 1865|回复: 0

[经验分享] Flume

[复制链接]

尚未签到

发表于 2017-5-21 13:51:45 | 显示全部楼层 |阅读模式
简介


  Flume是一个分布式,可靠的,可以用来有效的收集,聚合和移动大的日志数据的可用服务。它是一个基于数据流的简单且灵活的框架。采用可调可靠性机制和多种故障转移及恢复机制保证很好的稳健性和容错性。它使用了一个简单的可扩展的数据模型,允许在线分析应用。data flow(数据流)是Flume最重要的抽象,data flow描述了从数据产生,传输、处理并最终写入目标路径。下图描述了Flume重要的几个组件:
DSC0000.jpg

  结合上图,Flume的一些核心组件



组件


功能


Web Server


数据产生的源头。


Agent


Flume的核心就是Agent 。Agent是一个Java进程,且运行在日志收集端,通过Agent接收日志,然后暂存起来,再发送到目的地。


Source


Agent核心组件之一,Source(源)用于从Web Server收集数据,然后发送到Channel(通道)。


Channel


Agent核心组件之一,Channel(通道)可以用来从Source接收数据,然后发送到Sink,Channel存放零时数据,有点类似队列一样。


Sink


Agent核心组件之一,Sink(接收器)用来把数据发送的目标地点,如上图放到HDFS中。


Event


整个数据传输过程中,流动的对象都是实现了org.apache.flume.Event接口的对象。Event也是事务保证的级别。

Flow Event从源点到达目的点的迁移的抽象

注:Flume支持多个Agent,支持扇入(fan-in)、扇出(fan-out)。




系统要求
  1,java运行时环境--Java 1.6或者更晚的(建议Java 1.7)
  2,内存 - 使用Sources,Channels或者Sinks要配置足够的内存。
  3,硬盘空间 - 使用Channels和Sinks要配置足够的硬盘空间。
  4,目录权限 - 被Agent使用的目录必须要有读和写的权限。
  官方网站:http://flume.apache.org/

用户文档:http://flume.apache.org/FlumeUserGuide.html

开发文档:http://flume.apache.org/FlumeDeveloperGuide.html


数据流模型


  Flume Event被定义为一个字节的有效载荷以及以及一个可选的字符串属性集。Flume Source接收来自外部源的数据(比如:Web Server)。Flume的数据流由Event贯穿始终。事件是Flume的基本数据单元,当Source捕获事件后会进行特定的格式化,然后Source会把Event推送到一个或多个Channel中,可以把Channel看作是一个缓冲区或者一个队列,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。
  Flume提供了大量内置的Source、Channel和Sink类型。不同类型的Source,Channel和Sink可以自由组合。也可以自定义Source,Channel和Sink。关于这三者的组合关系是很灵活的,下面我们看下几幅图:
  多级代理:
  multi-hop模式:事件在到达最终目的地之前通过多个Agent

DSC0001.jpg

  合并:

DSC0002.jpg

  Multiplexing:
  Flume支持multiplexing Event到一个或者多个目的地,它通过多路复用器将Event复制或者选择性的路由到一个或多个Channel。

DSC0003.jpg

  上图的示例,名称为“foo”的Agent,Source会Fan out到三个Channel中,Fan out的方式分为replicating和multiplexing。如果采用replicating方式,那么每个Event会发到这三个Channel中,如果采用multiplexing方式,它是根据Event的属性来路由,然后发送到指定的Channel中。
  注:一个sink只能接收一个Channel发过来的数据

  下面我们分别举两个例子:
  replicating:


# List the sources, sinks and channels for the agent
<Agent>.sources = <Source1>
<Agent>.sinks = <Sink1> <Sink2>
<Agent>.channels = <Channel1> <Channel2>
# set list of channels for source (separated by space)
<Agent>.sources.<Source1>.channels = <Channel1> <Channel2>
# set channel for sinks
<Agent>.sinks.<Sink1>.channel = <Channel1>
<Agent>.sinks.<Sink2>.channel = <Channel2>
<Agent>.sources.<Source1>.selector.type = replicatingreplicating是将Event发送到所有的Channel。
  multiplexing:

# Mapping for multiplexing selector
<Agent>.sources.<Source1>.selector.type = multiplexing
<Agent>.sources.<Source1>.selector.header = <someHeader>
<Agent>.sources.<Source1>.selector.mapping.<Value1> = <Channel1>
<Agent>.sources.<Source1>.selector.mapping.<Value2> = <Channel1> <Channel2>
<Agent>.sources.<Source1>.selector.mapping.<Value3> = <Channel2>
#...
<Agent>.sources.<Source1>.selector.default = <Channel2>
  multiplexing是根据header的值来路由的,根据上面的例子,如果Event header的<someHeader>属性值为Value1的话,就发送Channel1,如果属性值为Value2的话就发送到Channel1,和Channel2,如果属性值为Value3的话,就发送到Channel2中,其他的都发送到Channel2.
  


可靠性
  Event是分阶梯传送的,从Source->Channel->Sink的,Event最终传送到下一个Agent或下一个终端资源库(例如HDFS,文件系统等),在传送打到后,Event在Channel中删除。
  end-to-end指的是:在删除Channel中的Event时,保证Event已经传递到了下一个Agent或者终端资源库,但是这里没有提到Source进入到Channel之前如果保证不丢失。具体的可以看下每个Source的实现。
  Flume采用了事务的方式来保证Event的可靠性传输,保证Event集合在点对点的传输是可靠的。

  


可恢复性
  事件在Channel是分阶梯,管理从失败中恢复。Flume支持持久化到本地文件系统中(即:FileChannel,但是性能不佳)。Memory Channel只是存储Event到内存的队列中,性能很好,但是当Agent挂掉,内存中的Event是不能够被恢复的。

  


安装第三方插件
  Flume是完全基于插件的框架,Flume有多种Sources,Channels,Sinks,Serializers。
  虽然可以包括自定义Flume组件,但是加入他们所需的jars到conf/flume-env.sh文件中FLUME_CLASSPATH变量中,Flume现在支持一种特殊的目录结构叫做:plugins.d,它有特殊的格式,这样的话Flume可以自动的启用插件。这样就可以很容易的管理插件包装的问题,也方便调试和排除故障,特别是Lib包冲突的问题。

plugins.d目录
  plugins.d目录位于$FLUME_HOME/plugins.d。在启动的时候,flume-ng启动脚本会检查 plugins.d 目录的插件确保符合下面的格式,并且包含了正确的路径。

插件目录布局
  每个在 plugins.d 内的插件,最多包含三个子目录。
  1,lib - 插件的JAR。
  2,libext - 插件依赖JAR(S)
  3,native - 任何所需的本地库,例如:.so文件

下面是两个插件在 plugins.d 目录中的位置:
plugins.d/
plugins.d/custom-source-1/
plugins.d/custom-source-1/lib/my-source.jar
plugins.d/custom-source-1/libext/spring-core-2.5.6.jar
plugins.d/custom-source-2/
plugins.d/custom-source-2/lib/custom.jar
plugins.d/custom-source-2/native/gettext.so


基于Zookeeper的配置
  Flume支持Agent的配置信息通过Zookeeper,但是这个是一个实验性的功能,不建议在生产环境使用。这个配置文件需要上传到Zookeeper中,这个配置文件将储存在Zookeeper的节点下,下面看Agent a1和a2在zookeeper的结构:

- /flume
|- /a1 [Agent config file]
|- /a2 [Agent config file]配置文件上传后,使用如下参数启动Agent:
$ bin/flume-ng agent –conf conf -z zkhost:2181,zkhost1:2181 -p /flume –name a1 -Dflume.root.logger=INFO,console
参数名称
默认
描述


z




Zookeeper服务器列表,格式是hostname:port,用逗号分隔



p


/flume

Zookeeper存储Agent配置文件的路径。
  详情查看:Flume采用zookeeper管理配置


  


Flume Sources


名称


描述


Avro Source


监听Avro端口并且从外部Avro客户端接收Event。


Thrift Source


监听Thrift端口并且从外部Thrift客户端接收Event。


Exec Source


运行Unix命令,预计能产生持续的输出()


JMS Source


从JMS的queue或者topic读取数据


Spooling Directory Source


监测配置的目录下新增的文件,并将文件中的数据读取出来,可实现准实时。


Kafka Source


作为一个消费者,从Apache Kafka的topic读取消息。


NetCat Source


监听指定端口,将每一行封装成一个Event。


Sequence Generator Source


一个简单的序列生成器,从0开始,每次增加1,主要用于测试。


Syslog TCP Source


读取syslog消息并且生成Flume的Event,TCP每个Event用'n'分割


Multiport Syslog TCP Source


这个是最新,最快,多端口版本的Syslog TCP Source。


Syslog UDP Source


读取syslog消息并且生成Flume的Event,每个输入信息当成一个Event


HTTP Source


接受HTTP的GET或者POST数据,GET是实验性质的,不建议使用。支持JSON、BLOB表示形式


Stress Source


是一个内部负载生成源,用来做压力测试是非常有用的


Avro Legacy Source


允许Flume 1.x的Agent从Flume 0.9.4的Agent中获取数据,它接受0.9.4的Event,并且转化成1.x


Thrift Legacy Source


和Avro Legacy Source雷同


Scribe Source





Flume Sinks


名称


描述


HDFS Sink


将数据写入到HDFS


Hive Sink


将文本或者JSON数据用分隔符分割,直接变成Hive的表,或者是分区


Logger Sink


记录Event的Info级别日志,通常用于测试或调试。


Avro Sink


采用Avro Sink接收到的Event,发送到另外一个Avro Source


Thrift Sink


采用Thrift Sink接收到的Event,发送到另外一个Thrift Source


IRC Sink


从附加的Channel获取数据,转发到配置中的IRC的目的地。IRC(类似于网络聊天室的服务)


File Roll Sink


将Event存放到本地文件系统,根据时间或者大小生成文件。


Null Sink


丢弃所有从Channel获取的Event。


HBaseSink


写入数据到Hbase


AsyncHBaseSink


采用异步的形式写入数据到Hbase


MorphlineSolrSink


将数据写入Solr集群


ElasticSearchSink


将数据写入ElasticSearch集群


Kafka Sink


将数据写入Kafka集群


Flume Channels


名称


描述


Memory Channel


储存Event在内存队列中,如果宕机可能会造成数据的丢失,具有很高的吞吐量。


JDBC Channel


将Event储存在持久化的数据库中,目前支持嵌入式的Derby。


Kafka Channel


将Event储存在Kafka集群(必须单独部署),Kafka提供了高可用和复制性,所以Kafka或者Agent崩溃,数据也不会丢失。


File Channel


将Event持久化在本地文件系统里(性能较差),但是可以保证数据不丢失。


Spillable Memory Channel


Event数据存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件(当前试验性的,不建议生产环境使用)


Pseudo Transaction Channel


仅用于单元测试,不能用于生产环境。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-379629-1-1.html 上篇帖子: Flume 下篇帖子: flume加载配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表