除了Flume内置的客户端,我们也可以自定义客户端向Flume发送数据。目前Flume支持自定义客户端通过Avro、Thrift、Log4j、Syslog和HTTP POST(JSON格式)发送的数据。客户端发送的数据必须是Flume能够识别的Event格式。
Flume SDK是一个提供Flume连接和向Flume发送数据(通过RPC)的类库。Flume SDK封装了底层的细节,只提供了统一接口,包括Flume连接、Event封装和Event发送等。Flume SDK可以通过Maven方式引用到项目中。
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-sdk</artifactId>
<version>1.6.0</version>
</dependency>
Event
Event有两个实现类SimpleEvent和JSONEvent。JSONEvent发送JSON格式数据,主要由HTTP Source接收。SimpleEvent和JSONEvent在使用上并没有区别。可以通过EventBuilder的静态方法创建Event,EventBuilder默认创建SimpleEvent。
Event示例代码
String logBody = "这里是日志内容";
// 日志头文件,头文件是可选的
Map<String, String> logHeaders = new HashMap<String, String>();
// 给日志添加时间戳
logHeaders.put("timestamp", System.currentTimeMillis() + "");
// SimpleEvent
Event simpleEvent = new SimpleEvent();
simpleEvent.setBody(logBody.getBytes());
simpleEvent.setHeaders(logHeaders); // 头文件是可选的
// JSONEvent
Event jsonEvent = new JSONEvent();
jsonEvent.setBody(logBody.getBytes());
jsonEvent.setHeaders(logHeaders); // 头文件是可选的
// EventBuilder
EventBuilder.withBody(logBody.getBytes());
EventBuilder.withBody(logBody.getBytes(), logHeaders);
RpcClient
Flume连接和Event发送由RpcClient接口提供,RpcClient有两个基本实现类NettyAvroRpcClient和ThriftRpcClient,分别使用Avro协议和Thrift协议。RpcClient可以通过静态方法RpcClientFactory.getInstance(),getInstance有多个重载方法,如果不指定协议类型,默认使用Avro协议。