flume自定义 interceptor 报错没有init方法(已解决)

在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值