发送数据到Flume

Flume有两类发送数据到Flume Agent的程序性方法:Flume SDK和Embedded Agent API。Flume也自带有log4j appender,可以用来从应用程序发送数据到Flume Agent。

1、构建Flume事件

事件是Flume中数据的基本表现形式,每个Flume事件包含header的一个map集合和一个body,是表示为字节数组的有效负荷。
Event接口:

这里写图片描述
EventBuilder类提供了4个通常用来创建Flume事件的方法:

这里写图片描述
创建好了事件之后,就可以使用Flume SDK和Embedded Agent API发送数据到Flume Agent了。
需要加入如下Maven依赖:

这里写图片描述

2、Flume客户端SDK

因为Flume事件的格式是固定的,因此发送数据到Flume的最好方式是通过Flume支持的RPC格式之一的
RPC调用:Avro和Thrift。通常,首选Avro RPC,它更成熟和优秀。缺点是Avro RPC只支持Java和其他JVM语言。Flume通过Thrift RPC支持非JVM语言。
①创建Flume RPC客户端
通过RpcClientFactory类创建RPC客户端实例:

这里写图片描述
②RPC客户端接口
应用程序调用append和appendBatch方法发送事件。

这里写图片描述
如果列表中传递给appendBatch的事件数量比批量大小要大,RPC客户端将把列表分为多个批量顺次将它们写出,一旦有一个批量操作失败,该方法就抛出异常。如果一些批量操作成功而另一些失败,而应用程序又进行了重试则可能导致最终目的地的事件重复。因此,传递一个不大于批量大小的事件通常是一个好主意。getBatchSize方法返回RPC客户端使用的批量的最大大小。
在每个RPC调用之前,通过调用isActive方法检查RPC客户端是否仍然活跃和是否为执行做好准备是一个好主意。一旦不需要RPC客户端或isActive返回false,必须通过调用close方法关闭RPC客户端,以清理资源和避免任何资源的泄露。

这里写图片描述
③RPC客户端的公共配置参数

这里写图片描述
④默认RPC客户端
默认RPC客户端实例使用Avro RPC协议只能连接到一个Avro Source。为了创建默认RPC客户端,可以使用RpcClientFactory提供的方法:

这里写图片描述
⑤Load-Balancing RPC客户端
对于每个append或appendBatch调用,load-balancing RPC客户端,基于配置,以random或round-robin的顺序,选择配置要发送数据的多个Agent的其中一个。

⑥编写自己的主机选择器
须要实现LoadBalancingRpcClient$HostSelector接口:

这里写图片描述
3、Failover RPC客户端

这里写图片描述
基于hosts参数中主机的顺序进行重试,重试的次数可配置,最大不超过主机数。
4、Thrift RPC客户端
Apache Thrift是一个数据序列化和RPC的框架,用来序列化和反序列化来自不同语言的数据。Thrift通过拥有与语言无关的数据格式规范来支持该特性。然后Thrift编译器可以生成不同语言的代码,用来读取和写入数据。
5、嵌入式Agent
嵌入式Agent是一类很受限的Flume Agent,可以部署在第三方应用程序。比起RPC客户端,使用嵌入式的Agent的优点是该Agent有一个Channel,一个应用程序不需要管理的缓冲区,也可以在磁盘上。这使得应用程序能更长时间的拯救下游失败的Agent,直到Channel满。
嵌入式Agent存在于应用程序的进程地址空间,且在应用程序中创建和运行线程,因此,比起只是使用RPC客户端,应用程序将消耗更多的资源,这就是使用嵌入式Agent提供额外缓冲时间所付出的代价:

这里写图片描述
嵌入式Agent也支持使用File Channel,即使应用程序死亡或机器重启,也能帮助持久化事件。当没有其他进程使用磁盘时File Channel的性能较好,因此即使嵌入该Agent的应用程序也最好不要使用相同的磁盘,以避免不必要的搜索。
通过需要一个名字的公共构造函数创建EmbeddedAgent类的实例,进而创建嵌入式Agent,该名字指的是这个特定Agent的名称。
事件可以使用put或putAll方法写入到Agent,这两个方法分别接收单个事件和批量事件。

这里写图片描述
6、配置嵌入式Agent
一个嵌入式Agent只能有一个Source、一个Channel和一个Sink组,但是Sink组可以包含多个Sink。

### 配置Flume数据传输至Elasticsearch 为了实现Flume向Elasticsearch传输数据的功能,需构建一个由Source、Channel和Sink组成的Flume代理配置。具体来说,可以通过设置Avro Source来接收来自不同源头的数据流,并利用Memory Channel或File Channel作为中介暂存这些数据;最后借助ElasticSearch Sink完成数据最终目的地——即Elasticsearch集群的写入操作。 #### Flume Agent Configuration Example 下面是一个简单的`agent.conf`文件示例,用于说明如何配置上述组件: ```properties # 定义Agent名称及其构成部分 a1.sources = r1 a1.sinks = k1 a1.channels = c1 # 描述source属性 a1.sources.r1.type = exec a1.sources.r1.command = tail -F /path/to/logfile.log # 设置channel特性 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 指定sink为elasticsearch并提供必要参数 a1.sinks.k1.type = org.apache.flume.sink.elasticsearch.ElasticSearchSink a1.sinks.k1.hostNames = localhost:9300 a1.sinks.k1.indexName = logs_index a1.sinks.k1.indexType = log_type # 将各模块连接起来 a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 ``` 此配置展示了如何创建名为`a1`的一个Flume agent实例[^4]。其中,`r1`代表了一个基于命令执行方式获取日志条目的source,而`sink`则被指定为能够直接对接Elasticsearch的服务端点[^1]。此外,还指定了所使用的host地址(这里假设本地运行)、索引名以及文档类型等细节信息以便于后续查询分析工作开展。 对于更复杂的场景,比如跨网络环境下的多节点部署,则可能需要调整相应的主机列表和其他高级选项以适应实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值