在Intellij IDEA用java自定flume source,interceptor 打包放在linux上 测试把接收到的数据包装后输出到kafka
自定义的JsonInterceptor
package com.yc.flume.interceptors;
import com.alibaba.fastjson.JSONObject;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class JsonInterceptor implements Interceptor {
private String[] schema; // ["id","name","age"]
private String separator; //分隔符
public JsonInterceptor(String schema, String separator) {
this.schema = schema.split("[,]");
this.separator = separator;
}
@Override
public void initialize() {
//no-op
}
@Override
public Event intercept(Event event) {
Map<String, String> tuple = new LinkedHashMap();
//将传入的Event中的body内容,加上schema,然后在放入到Event
String line = new String(event.getBody());
String[] fields = line.split(separator);
for(int i = 0; i < schema.length; i++) { //schema: ["id","name","age"]
String key = schema[i];
String value = fields[i];
tuple.put(key, value); //
}
//
String json = JSONObject.toJSONString(tuple);
//将转换好的json,再放入到Event中
event.setBody(json.getBytes());
return event;
}
@Override
public List<Event> intercept(List<Event> events) {
for (Event e: events) {
intercept(e);
}
return events;
}
@Override
public void close() {
//no-op
}
/**
* Interceptor.Builder的生命周期方法
* 构造器 -> configure -> build
*/
public static class Builder implements Interceptor.Builder {
private String fields;
private String separator;
@Override
public Interceptor build() {
//在build创建JsonInterceptor的实例
return new JsonInterceptor(fields, separator);
}
/**
* 配置文件中应该有哪些属性?
* 1.数据的分割符
* 2.字段名字(schema)
* 3.schema字段的分隔符
* @param context
*/
@Override
public void configure(Context context) {
fields = context.getString("fields"); // a1.sources.r1.interceptors.i1.fields=id,name,age
separator = context.getString("separator"); //a1.sources.r1.interceptors.i1.separator=,
}
}
}
测试配置的配置文件
a0.sources=r1
a0.channels=c1
#自定义
a0.sources.r1.type=com.yc.flume.Flume1
a0.sources.r1.filePath=/opt/logs.txt
a0.sources.r1.posiFile=/opt/posi.txt
a0.sources.r1.interval=2000
a0.sources.r1.charset=UTF-8
a0.sources.r1.interceptors=i1 i2 i3
a0.sources.r1.interceptors.i1.type=timestamp
a0.sources.r1.interceptors.i2.type=host
#自定义
a0.sources.r1.interceptors.i1.type = com.yc.flume.interceptors.JsonInterceptor
a0.sources.r1.interceptors.i1.format = id,name,age
a0.sources.r1.interceptors.i1.separator=,
a0.channels.c1.type=org.apache.flume.channel.kafka.KafkaChannel
a0.channels.c1.kafka.bootstrap.servers=node1:9092,node2:9092,node3:9092
a0.channels.c1.kafka.topic=infos0712
a0.channels.c1.parseAsFlumeEvent=true
a0.sources.r1.channels=c1
报错信息
java.lang.InstantiationException: com.yc.flume.interceptors.JsonInterceptor
at java.lang.Class.newInstance(Class.java:427)
at org.apache.flume.interceptor.InterceptorBuilderFactory.newInstance(InterceptorBuilderFactory.java:50)
at org.apache.flume.channel.ChannelProcessor.configureInterceptors(ChannelProcessor.java:111)
at org.apache.flume.channel.ChannelProcessor.configure(ChannelProcessor.java:82)
at org.apache.flume.conf.Configurables.configure(Configurables.java:41)
at org.apache.flume.node.AbstractConfigurationProvider.loadSources(AbstractConfigurationProvider.java:342)
at org.apache.flume.node.AbstractConfigurationProvider.getConfiguration(AbstractConfigurationProvider.java:105)
at org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:145)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodException: com.yc.flume.interceptors.JsonInterceptor.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 14 more
20/07/12 19:19:52 ERROR node.AbstractConfigurationProvider: Source r1 has been removed due to an error during configuration
org.apache.flume.FlumeException: Interceptor.Builder not constructable.
at org.apache.flume.channel.ChannelProcessor.configureInterceptors(ChannelProcessor.java:119)
at org.apache.flume.channel.ChannelProcessor.configure(ChannelProcessor.java:82)
at org.apache.flume.conf.Configurables.configure(Configurables.java:41)
at org.apache.flume.node.AbstractConfigurationProvider.loadSources(AbstractConfigurationProvider.java:342)
at org.apache.flume.node.AbstractConfigurationProvider.getConfiguration(AbstractConfigurationProvider.java:105)
at org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:145)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.InstantiationException: com.yc.flume.interceptors.JsonInterceptor
at java.lang.Class.newInstance(Class.java:427)
at org.apache.flume.interceptor.InterceptorBuilderFactory.newInstance(InterceptorBuilderFactory.java:50)
at org.apache.flume.channel.ChannelProcessor.configureInterceptors(ChannelProcessor.java:111)
... 12 more
Caused by: java.lang.NoSuchMethodException: com.yc.flume.interceptors.JsonInterceptor.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 14 more
解决方法:
配置文件代码改成
a0.sources.r1.interceptors.i1.type = com.yc.flume.interceptors.JsonInterceptor$Builder