Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用kafka streams对json输入流进行有条件排序_Java_Json_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Java 使用kafka streams对json输入流进行有条件排序

Java 使用kafka streams对json输入流进行有条件排序,java,json,apache-kafka,apache-kafka-streams,Java,Json,Apache Kafka,Apache Kafka Streams,我是开发kafka streams应用程序的新手。我的流处理器旨在根据输入json消息中用户键的值对json消息进行排序 Message 1: {"UserID": "1", "Score":"123", "meta":"qwert"} Message 2: {"UserID": "5", "Score":"780", "meta":"mnbvs"} Message 3: {"UserID": "2", "Score":"0", "meta":"fghjk"} 我在这里读到,没有动态解决方案

我是开发kafka streams应用程序的新手。我的流处理器旨在根据输入json消息中用户键的值对json消息进行排序

Message 1: {"UserID": "1", "Score":"123", "meta":"qwert"}
Message 2: {"UserID": "5", "Score":"780", "meta":"mnbvs"}
Message 3: {"UserID": "2", "Score":"0", "meta":"fghjk"}
我在这里读到,没有动态解决方案

在我的用例中,我知道对输入流进行排序所需的用户键和输出主题。因此,我为每个用户编写单独的处理器应用程序,其中每个处理器应用程序都匹配不同的用户ID

在kafka中,所有不同的流处理器应用程序都从同一个json输入主题中读取消息,但如果满足预设的用户条件,则每个应用程序仅将消息写入特定用户的输出主题

public class SwitchStream extends AbstractProcessor<String, String> {
        @Override
        public void process(String key, String value) {
            HashMap<String, String> message = new HashMap<>();
            ObjectMapper mapper = new ObjectMapper();
            try {
                message = mapper.readValue(value, HashMap.class);
            } catch (IOException e){}

            // User condition UserID = 1
            if(message.get("UserID").equals("1")) {
                context().forward(key, value);
                context().commit();
            }
        }

        public static void main(String[] args) throws Exception {
            Properties props = new Properties();
            props.put(StreamsConfig.APPLICATION_ID_CONFIG, "sort-stream-processor");
            props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
            props.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
            props.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());

            props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
            TopologyBuilder builder = new TopologyBuilder();
            builder.addSource("Source", "INPUT_TOPIC");
            builder.addProcessor("Process", SwitchStream::new, "Source");
            builder.addSink("Sink", "OUTPUT_TOPIC", "Process");

            KafkaStreams streams = new KafkaStreams(builder, props);
            streams.start(); 
       }
}
public类SwitchStream扩展了抽象处理器{
@凌驾
公共作废进程(字符串键、字符串值){
HashMap消息=新建HashMap();
ObjectMapper mapper=新的ObjectMapper();
试一试{
message=mapper.readValue(值,HashMap.class);
}捕获(IOE){}
//用户条件UserID=1
if(message.get(“UserID”).equals(“1”)){
context().forward(键、值);
context().commit();
}
}
公共静态void main(字符串[]args)引发异常{
Properties props=新属性();
put(StreamsConfig.APPLICATION_ID_CONFIG,“排序流处理器”);
put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,“localhost:9092”);
put(StreamsConfig.KEY_SERDE_CLASS_CONFIG,Serdes.String().getClass());
put(StreamsConfig.VALUE\u SERDE\u CLASS\u CONFIG,Serdes.String().getClass());
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,“最早”);
TopologyBuilder=新TopologyBuilder();
builder.addSource(“源”、“输入”主题);
addProcessor(“进程”,开关流::新,“源”);
builder.addSink(“Sink”、“OUTPUT_TOPIC”、“Process”);
KafkaStreams streams=新的KafkaStreams(生成器、道具);
streams.start();
}
}
问题1: 如果使用低级别处理器API,是否可以使用高级别的Streams DSL轻松实现相同的功能?(我承认,我发现很难理解和遵循其他高级流DSL的在线示例)

问题2: 输入json主题以20K-25K EPS的高速率获取输入。我的处理器应用程序似乎跟不上这个输入流。我尝试部署每个流程的多个实例,但结果与我希望的结果相差甚远。理想情况下,每个处理器实例应该能够处理3-5K EPS


有没有办法改进我的处理器逻辑,或者使用高级流DSL编写相同的处理器逻辑?这会有所不同吗?

您可以通过
filter()
在高级DSL中实现这一点(您有效地实现了一个过滤器,因为您只在
userID==1
时返回消息)。您可以使用
KStream#branch()
(有关更多详细信息,请参阅文档:)来概括此过滤器模式。另外,请阅读JavaDocs:

KStreamBuilder builder=new KStreamBuilder();
builder.stream(“输入主题”)
.filter(新谓词(){
@覆盖
布尔测试(字符串键、字符串值){
//把处理器逻辑放在这里
返回消息.get(“UserID”).equals(“1”)
}
})
。至(“输出主题”);

关于性能。单个实例应该能够处理10K+记录。如果没有任何进一步的信息,很难说问题出在哪里。我建议询问卡夫卡用户列表(请参阅)

谢谢Matthias!我在低每股收益方面遇到的问题最终与旧版本的卡夫卡+环境有关。