一、简介
之前有做过一个采用flume消费Kafka数据到S3的案例,今天做个记录。很多公司,会采用云服务,这种场景会比较多的用到,希望能帮助有需要的人。
二、主要配置
需要在flume的安装目录conf下面创建一个core-site.xml文件(这个文件一般会有,需要添加一些配置),配置文件中添加s3认证的信息。
<configuration>
<property>
<name>fs.s3a.connection.ssl.enabled</name>
<value>false</value>
</property>
<property>
<name>fs.s3a.bucket.probe</name>
<value>0</value>
</property>
<property>
<name>fs.s3a.access.key</name>
<value>xxxxxxxxx</value>
</property>
<property>
<name>fs.s3a.secret.key</name>
<value>xxxxxxxxxxx</value>
</property>
</configuration>
sink配置:
agent.sinks.s3hdfs.type = hdfs
agent.sinks.s3hdfs.hdfs.path = s3a://<bucket.name>/<path>/%Y%m%d #路径换成对于的s3路径
agent.sinks.s3hdfs.hdfs.fileType = DataStream
agent.sinks.s3hdfs.hdfs.filePrefix = FilePrefix
agent.sinks.s3hdfs.hdfs.writeFormat = Text
agent.sinks.s3hdfs.hdfs.rollCount = 5000
agent.sinks.s3hdfs.hdfs.rollSize = 67108864 #64Mb filesize
agent.sinks.s3hdfs.hdfs.batchSize = 10000
agent.sinks.s3hdfs.hdfs.rollInterval = 0
之后启动flume程序,看看对于的目录文件数据是否正常写入
三、补充flume的拦截器
如果需要做数据预处理,需要用到拦截器
1、创建一个maven工程,在pom文件中添加flume的依赖
<dependencies>
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-core</artifactId>
<version>1.9.0</version>
</dependency>
</dependencies>
2、创建一个类,实现Interceptor接口。
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
3、实现一个静态内部类创建拦截器
public class MyInterceptor implements Interceptor {
// 初始化方法
@Override
public void initialize() { }
// 处理单条event
@Overridepublic Event intercept(Event event) { //自定义规则 }
// 处理多条event
@Override
public List<Event> intercept(List<Event> events) {
for (Event event : events) {
intercept(event);
}
return events;
}
// close方法
@Override
public void close() { }
// 静态内部类
public static class MyBuilder implements Builder{
// 创建拦截器
@Override
public Interceptor build() {
return new MyInterceptor();//这是拦截器类名
}
// 配置方法
@Override
public void configure(Context context) {
}
}
}
通过以上步骤,自定义拦截器的代码开发已完成,然后打包成jar, 放到Flume的安装目录下的lib中。
拦截器的配置
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = com.<package.name>.flume.MyInterceptor$MyBuilder
补充说明:如果kafka上报的是时间戳,这个时间戳是全球各个地方当地发生的时间戳,可以在数据转换的时候处理成统一的东八区时间,然后按照这个东八区时间统一进行处理,这样可以解决业务上发生事件统计时间不一致问题。(不同业务场景不同解决)