flink 不要写2个相同的算子

问题:
用flink消费kafka的时候有些数据一直消费不出来

原因:
流后面带了2个相同的算子
val result: DataStream[(String, String, String)] = source_total.map(x =>
//提取出字段信息
Udfs.extract_info(x)
).map(x =>
Udfs.sortAndFixInfo(x)
)

解决方法:
将代码改成这样,后面只跟一个算子,问题就解决了
val result: DataStream[(String, String, String)] = source_total.map(x => { //提取出字段信息 Udfs.sortAndFixInfo(Udfs.extract_info(x)) } )

总结:
之前看文章说flink 生成jobGraph的时候会将2个想同的算子合并在一起,不知是版本原因(flink1.8),还是其它原因数据就是会丢失,所以写代码的时候应该将2个相同的算子合并成一个

Apache Flink是一个用于处理无界和有界数据流的开源分布式计算框架。要编一个自定义源算子(Source Operator),比如`ClickSource`,你需要创建一个新的`SourceFunction`。这里是一个简单的例子,假设我们有一个模拟点击流的数据源: ```java import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class ClickSourceExample { public static void main(String[] args) throws Exception { // 创建流处理环境 final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 模拟点击流数据源 DataStream<String> clickStream = env.addSource(new ClickSource()); // 对点击流进行处理(例如:分词、统计等) DataStream<Tuple2<String, Integer>> wordCount = clickStream .flatMap(new WordSplitter()) .keyBy(0) .sum(1); // 打印结果 wordCount.print(); // 开始执行任务 env.execute("Click Source Example"); } // 自定义源函数 - ClickSource private static class ClickSource extends RichParallelSourceFunction<String> { private boolean isRunning = true; @Override public void run(SourceContext<String> ctx) throws Exception { while (isRunning) { String clickEvent = generateClickEvent(); // 这里需要替换为实际生成点击事件的逻辑 ctx.collect(clickEvent); Thread.sleep(1000); // 假设每秒产生一次点击 } } @Override public void cancel() { isRunning = false; } // 你可以添加更多的辅助方法,如生成点击事件的逻辑 private String generateClickEvent() { // 这里只是一个示例,真实情况可能从文件、网络或其他地方读取 return "User " + UUID.randomUUID().toString() + " clicked on item 'item1'"; } } // 分词算子 private static class WordSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> { @Override public void flatMap(String value, Collector<Tuple2<String, Integer>> out) { // 这里对字符串进行分词并统计每个单词出现的次数 for (String word : value.split("\\s+")) { out.collect(new Tuple2<>(word, 1)); } } } } ``` 在这个例子中,`ClickSource`模拟了一个点击事件流,并通过`WordSplitter`将每个点击事件拆分成单词并计数。记得根据实际需求修改数据生成逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值