本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Flume组件的说明
Flume Source
| Source类型 | 说明 | |
|---|---|---|
| Avro Source | 支持Avro协议(实际上是Avro RPC),内置支持 | |
| Thrift Source | 支持Thrift协议,内置支持 | |
| Exec Source | 基于Unix的command在标准输出上生产数据 | |
| JMS Source | 从JMS系统(消息、主题)中读取数据,ActiveMQ已经测试过 | |
| Spooling Directory Source | 监控指定目录内数据变更 | |
| Twitter 1% firehose Source | 通过API持续下载Twitter数据,试验性质 | |
| Netcat Source | 监控某个端口,将流经端口的每一个文本行数据作为Event输入 | |
| Sequence Generator Source | 序列生成器数据源,生产序列数据 | |
| Syslog Sources | 读取syslog数据,产生Event,支持UDP和TCP两种协议 | |
| HTTP Source | 基于HTTP POST或GET方式的数据源,支持JSON、BLOB表示形式 | |
| Legacy Sources | 兼容老的Flume OG中Source(0.9.x版本) |
Flume Channel
| Channel类型 | 说明 | |
|---|---|---|
| MemoryChannel | Event数据存储在内存中 | \ |
| JDBCChannel | Event数据存储在持久化存储中,当前FlumeChannel内置支持Derby | \ |
| FileChannel | Event数据存储在磁盘文件中 | \ |
| SpillableMemoryChannel | Event数据存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件(当前试验性的,不建议生产环境使用) | \ |
| PseudoTransactionChannel | 测试用途 | \ |
| CustomChannel | 自定义Channel实现 |
Flume Sink
| Sink类型 | 说明 | |
|---|---|---|
| HDFS Sink | 数据写入HDFS | \ |
| Logger Sink | 数据写入日志文件 | \ |
| Avro Sink | 数据被转换成Avro Event,然后发送到配置的RPC端口上 | \ |
| Thrift Sink | 数据被转换成Thrift Event,然后发送到配置的RPC端口上 | \ |
| IRC Sink | 数据在IRC上进行回放 | \ |
| File Roll Sink | 存储数据到本地文件系统 | \ |
| Null Sink | 丢弃到所有数据 | \ |
| HBase Sink | 数据写入HBase数据库 | \ |
| Morphline Solr Sink | 数据发送到Solr搜索服务器(集群) | \ |
| ElasticSearch Sink | 数据发送到Elastic Search搜索服务器(集群) | \ |
| Kite Dataset Sink | 写数据到Kite Dataset,试验性质的 | \ |
| Custom Sink | 自定义Sink实现 |
拦截器与选择器
flume本身不限制agent中source、channel和sink的数量,因此flume source可以接收事件,并可以通过配置将事件复制到多个目的地,这使得source通过==channel处理器、拦截器和channel选择器==,写入数据到channel成为可能 每个source都有自己的channel处理器,每次source将数据写入channel,它是通过委派该任务到其channel处理器来完成的,然后,channel处理器将这些事件传到一个或多个source配置的拦截器中, 拦截器是一段代码,可以基于某些它完成的处理来读取事件和修改或删除事件,基于某些标准,如正则表达式,拦截器可以用来删除事件,为事件添加新报头或移除现有的报头等,每个source可以配置成使用多个拦截器,按照配置中定义的顺序被调用,将拦截器的结果传递给链的下一个单元,这就是所谓的责任链的设计模式,一旦拦截器处理完事件,拦截器链返回的事件列表传递到channel列表,即通过channel选择器为每个事件选择channel。 source可以通过处理器-拦截器-选择器路由写入多个channel,channel选择器的决定每个事件必须写入到source附带的哪个channel的组件。因此拦截器可以用来插入或删除事件中的数据,这样channel选择器可以应用一些条件在这些事件上,来决定事件必须写入哪些channel,channel选择器可以对事件应用任意过滤条件,来决定每个事件必须写入哪些channel,以及哪些channel是必须的或可选的。 写入到必需的channel失败将会导致channel处理器抛出channelexception,表明source必须重新重试该事件,而未能写入可选channel失败仅仅忽略它,一旦写出事件,处理器会对source指示成功状态,可能发送确认给发送该事件的系统,并继续接受更多的事件。
Sink组
sink运行器运行一个sink组,sink组可含有一个或多个sink,如果组中只存在一个sink,那么没有组将更有效率,sink运行器仅仅是一个询问sink组来处理下一批事件的线程,每个sink组有一个sink处理器,处理器选择组中的sink之一去处理下一个事件集合,每个sink只能从一个channel获取数据,尽管多个sink可以从同一个channel获取数据,选定的sink从channel中接收事件,并将事件写入到下一阶段或最终目的地。
Sink组可实现负载均衡与故障转移。
因为每个Avro Sink对Avro Source保持持续开放的连接,拥有写入到相同Agent的多个Sink会增加更多的socket连接,且在多层时Agent上占据更多的资源,对相同Agent增加大量Sink之前必须谨慎考虑。