Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。
Flume基于流式架构,灵活简单。
Flume 最主要的作用就是,实时读取服务器本地磁盘的数据,将数据写入到HDFS
Flume组成架构如下图所示。
1. Agent:Flume的部署单元,本质是一个JVM进程,Agent内部是以事件的形式将数据从源头送至目的。
2. 组成:Agent主要有3个部分组成,Source、Channel、Sink。
1. Source:是负责接收数据到Flume Agent的组件。
2. 特点:Source组件可以处理各种类型、各种格式的日志数据,
3. Source组件类型:
①avro:本质是RPC框架,支持跨语言、跨平台的数据传输,avro Source在flume中多用于Agent的连接。
②netcat:本质是Linux下的端口类工具,netcat Source在Flume中用于采集端口传输的数据。
③exec:支持执行命令的,并将命令执行后的标准输出作为数据采集,多用于采集一个可追加文件。
④spooling directory:支持对一个目录进行监听,采集目录中一个或多个新生成的文件数据。
⑤taildir:支持对多个目录进行监听,采集一个或多个目录下的一个或多个可追加文件,支持断点续传。
除此之外还有:thrift、jms、sequence generator、syslog、http、自定义Source。
1. Sink:是负责发送数据到外部系统的Flume Agent的组件。
2. 特点:Sink组件不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量的、事务的写入到存储或索引系统、或者被发送到另一个Flume Agent。
3. Sink组件类型:
① logger:logger Sink组件则是将数据写到成Flume框架的运行日志中,配合运行参数-Dflume.root.logger=INFO,console可以将Flume运行日志(其中就包含了采集的数据)输出到控制台,多用于测试环境。
② hdfs:hdfs Sink组件是负责将数据传输到HDFS分布式文件系统中。
③ avro:avro Sink组件配合avro Source组件可以实现Agent的连接。
④ file:file Sink组件是将采集到的数据直接输出到本地文件系统中,即linux的磁盘上。
除此之外还有:thrift、ipc、HBase、solr、自定义Sink。
1. Channel:是负责暂存数据的,是位于Source和Sink组件之间的缓冲区。
2. 特点:
①由于Channel组件的存在,使得Source和Sink组件可以运作在不同的速率上。
②Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。
3. Flume自带两种Channel:
① Memory Channel:基于内存的队列存储事件,适用于对数据安全性要求不高的场景。 快,不安全
② File Channel:基于磁盘存储事件,宕机数据不丢失,适用于对数据安全敏感度高的场景。 慢,安全
1. Event:agent中的事件,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。
2. 特点:Event由Header和Body两部分组成,
① Header:用来存放该event的一些属性,为K-V结构
② Body:用来存放该条数据,形式为字节数组。
1. Flume官网地址:http://flume.apache.org/
2. 文档查看地址:http://flume.apache.org/FlumeUserGuide.html
3. 下载地址:http://archive.apache.org/dist/flume/
# 1. 将apache-flume-1.9.0-bin.tar.gz上传到linux的/opt/software目录下
$ ll
……
-rw-rw-r--.1 atguigu atguigu 67938106 2月 12 10:09 apache-flume-1.9.0-bin.tar.gz
# ------------------------------------------------------------------------------
# 2. 解压apache-flume-1.9.0-bin.tar.gz到/opt/module/目录下
$ tar -zxf /opt/software/apache-flume-1.9.0-bin.tar.gz-C /opt/module/
# 3. 修改apache-flume-1.9.0-bin的名称为flume
$ mv /opt/module/apache-flume-1.9.0-bin /opt/module/flume
# 4. 将lib文件夹下的guava-11.0.2.jar删除以兼容Hadoop 3.1.3
$ rm /opt/module/flume/lib/guava-11.0.2.ja
1. 在Flume中一共有两个事务
·Put事务:在Source组件和Channel组件之间,保证Source组件到Channel组件之间数据传递的可靠性。
·take事务:在Channel组件和Sink组件之间,保证channel组件到Sink组件之间数据传输的可靠性。
2. Put事务流程
① source组件采集外部数据到agent内部,并且将数据包装为事件
② source组件开始将事件传输到Channel组件中
③ 首先,会开启事务,在事务内部,通过doPut方法将一批数据放入到putlist中存储。
④ 之后,调用doCommit方法,把putList中的所有Event放到Channel中,成功之后就清空putList
1. putList在像channel中发送数据前会先检查channel中的容量是否放得下,放不下一个都不会放,调用doRollback
2. 调用doRollback方法后,doRollback方法会进行两步操作:
· 将putList清空
· 抛出ChannelException异常。
3. source组件会捕捉到doRollback抛出的异常后,source就将刚才的一批数据重新采集,然后就开启一个新的事务。
4. 数据批的大小取决于Source组件的配置参数batch size的值
5. putList的大小取决于Channel组件的配置参数transactionCapacity的值(capacity参数是指Channel的容量)
3. Take事务流程
① Sink组件不断的轮询Channel,当其中有新的事件到达时,开启take事务
② take事务开启后,会调用doTake方法将Channel组件中的Event剪切到takeList中。
③ 当takeList中存放了batch size数量的Event之后,就会调用doCommit方法
④ doCommit方法中,首先会将数据写出到外部系统,成功后就会清空takeList。
⑤ 当事务失败时,就会调用doRollback方法来进行回滚,就是将takeList中的数据原封不动的还给channel。
注意: 当take事务失败时,可能向外部写了一半的数据了,但是回滚时,是将tabkeList中的全部数返给channel,当开启新的take事务时,又会将这批数据再次写出到外部,就造成了数据重复。
1. 重要组件:
组件名称 |
概述 |
组件包含类型 |
特点 |
ChannelSelector |
选出Event将要发到那个channel |
Replication Channel Selector |
复制,默认选项 |
Multiplexing Channel Seletctor |
多路复用 |
||
SinkProcessor |
通过配置不同类型的SinkProcess实现不同的功能 |
DefaultSinkProcessor |
单个Sink,默认 |
LoadBalancingSinkProcessor |
负载均衡 |
||
FailoverSinkProcessor |
故障转移 |
2. 执行流程
① Source组件采集外部数据到agent内部,并包装为Event
② 然后,将事件发送到ChannelProcessor中,
· 通过拦截器链中每个拦截器的拦截过滤,符合要求的Event会返回到ChannelProcessor中
· 在通过ChannelSelector,根据不同的选择器来决定Event去往哪个Channel,然后返回到ChannelProcessor
③ 开启Put事务,将批量的Event发送到Channel中
④ 根据SinkProcessor组件配置的类型不同,实现相应的功能(负载均衡或故障转移),最终都会且同一时刻只能有一个Sink去拉取数据。
⑤ Sink组件不断的轮询Channel,当有新的Event到达Channel时,向外部系统写出。
1. Ganglia由gmond、gmetad和gweb三部分组成。
(1)gmond(Ganglia Monitoring Daemon):
是一种轻量级服务,安装在每台需要收集指标数据的节点主机上。
使用gmond,你可以很容易收集很多系统指标数据,如CPU、内存、磁盘、网络和活跃进程的数据等。
(2)gmetad(Ganglia Meta Daemon):
整合所有信息,并将其以RRD格式存储至磁盘的服务。
(3)gweb(Ganglia Web)Ganglia可视化工具:
gweb是一种利用浏览器显示gmetad所存储数据的PHP前端。
在Web界面中以图表方式展现集群的运行状态下收集的多种不同指标数据。
之后更新