实际开发中Flume中常用的source源,sink,channel,intercepertor等介绍,而实际上关于agent代理中设置选项有很多,具体要到官网去查看。
| 组件 | 使用介绍 |
source 数据源 | Avro | 监听由Avro sink 或Flume SDK 通过Avro RPC发送的事件所抵达的端口 |
Exec | 运行一个Unix命令(例如 tail -F /path/to/file),并且把从标准输出上读取的行转化为事件。但是要注意,此source不一定能保证把事件传送到channel,更好的选择可以参考spooling directory source 或者Flume SDK. | |
HTTP | 监听一个端口,并且使用可插拔句柄,比如JSON处理程序或者二进制数据处理程序,把HTTP请求转换成事件 | |
JMS | 读取来自JMS Queue或者Topic的消息并将其转换成事件 | |
Spooling directory /spooldir | 按行读取保存在缓冲目录中的文件,并将其转换为事件。 | |
Netcat | 监听一个端口,并把每行文本转换为一个事件 | |
Syslog | 从日志中读取行,并将其转换为事件 | |
Thrift | 监听由Thrift sink或Flume SDK通过Thrift RPC发送的事件所抵达的窗口 | |
Squence genetartor | 依据增量计数器来生成事件,主要用来测试用 | |
kafka | 监听kafka的Topic,当成事件 | |
| 组件 | 使用介绍 |
sink 目地 | HDFS | 以文本,序列化文件,Avro或定制格式写入到HDFS中。 |
HBASE | 使用某种序列化工具将数据写入到HBASE中 | |
Logger | 使用SLF4J记录INFO级别的事件,主要用来测试 | |
kafka | 将事件写入到kafka消息缓存对列 | |
Elasticcsearch | 使用Logstash格式将事件写入到Elasticsearch集群中 | |
NULL | 丢弃所有事件 | |
Avro | 通过Avro RPC发送事件到一个Avro source群中 | |
File roll | 将事件写入到本地文件系统 | |
Hive | 将事件按固定的格式导入到hive表中或者对应的分区里。 | |
IRC | 将事件发送给IRC通道 | |
| 组件 | 使用介绍 |
channel 通道 | file | 将事件存储在一个本地文件系统上的事务日志中。这种类型的channel具有持久性:只要事件被写入channel,即使使用了代理,代理重新启动,事件也不会丢失。agent1.channnels.channel1.type=file |
memory | 将事件缓存到内存中,因此不具有持久性存储能力。所以采用memory channel时,如果代理重新启动,事件就会丢失。在有些时候这种情况允许。和file channel相比,memory channel 速度快,吞吐量较高 agent1.channnels.channel1.type=memory | |
jdbc | 将事件存储到数据库中。 | |
| 组件 | 使用介绍 |
拦截器 interce-ptor
| Timestamp | 给特定source传递过来的事件加一个时间戳header.其中包含的是代理处理事件的时间,以ms为单位。具体参考博客Flume拦截器那篇 agent1.sources.souce1.interceptors = interceptor1 agent1.sources.source1.interceptors.interceptor1.type = timestamp。 |
UUID | 在所有的事件上设置一个ID header,它是一个全局的唯一标识符,对将来删除重复数据有用。 agent1.sources.source1.interceptors.interceptor1.type = org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder | |
static | 将所有的事件上设置一个固定的header及其值。具体参考官网 | |
Host | 将所有事件上设置一个包含代理主机名或IP地址的主机header. |
总之:我们经常在使用flume的过程后中,会用flume去收集数据,然后打到kafka中去。但是有一个问题,当flume中收集的数据量太大的时候,打到kafka中,kafka一时半会消费不了,就会造成数据堆积,怎么截距这种问题呢?
解决方案:可以通过设定参数这种方式,但是在这里这种方式显然已经不可行了,数据量太大了。这种情况下可以通过给flume设定拦截器的方式,来解决这种问题。