标签:wordcount 源码下载 slf4j 抽象类 isnull 约束 行业 bbb 分类
转:
https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
接下来咱们开发一个应用来体验CoProcessFunction,功能非常简单,描述如下:
如果您不想写代码,整个系列的源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
名称 | 链接 | 备注 |
---|---|---|
项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
这个git项目中有多个文件夹,本章的应用在flinkstudy文件夹下,如下图红框所示:
package com.bolingcavalry.coprocessfunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.StringUtils;
public class WordCountMap implements MapFunction> {
@Override
public Tuple2 map(String s) throws Exception {
if(StringUtils.isNullOrWhitespaceOnly(s)) {
System.out.println("invalid line");
return null;
}
String[] array = s.split(",");
if(null==array || array.length<2) {
System.out.println("invalid line for array");
return null;
}
return new Tuple2<>(array[0], Integer.valueOf(array[1]));
}
}
package com.bolingcavalry.coprocessfunction;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.co.CoProcessFunction;
/**
* @author will
* @email zq2599@gmail.com
* @date 2020-11-09 17:33
* @description 串起整个逻辑的执行类,用于体验CoProcessFunction
*/
public abstract class AbstractCoProcessFunctionExecutor {
/**
* 返回CoProcessFunction的实例,这个方法留给子类实现
* @return
*/
protected abstract CoProcessFunction<
Tuple2,
Tuple2,
Tuple2> getCoProcessFunctionInstance();
/**
* 监听根据指定的端口,
* 得到的数据先通过map转为Tuple2实例,
* 给元素加入时间戳,
* 再按f0字段分区,
* 将分区后的KeyedStream返回
* @param port
* @return
*/
protected KeyedStream, Tuple> buildStreamFromSocket(StreamExecutionEnvironment env, int port) {
return env
// 监听端口
.socketTextStream("localhost", port)
// 得到的字符串"aaa,3"转成Tuple2实例,f0="aaa",f1=3
.map(new WordCountMap())
// 将单词作为key分区
.keyBy(0);
}
/**
* 如果子类有侧输出需要处理,请重写此方法,会在主流程执行完毕后被调用
*/
protected void doSideOutput(SingleOutputStreamOperator> mainDataStream) {
}
/**
* 执行业务的方法
* @throws Exception
*/
public void execute() throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 并行度1
env.setParallelism(1);
// 监听9998端口的输入
KeyedStream, Tuple> stream1 = buildStreamFromSocket(env, 9998);
// 监听9999端口的输入
KeyedStream, Tuple> stream2 = buildStreamFromSocket(env, 9999);
SingleOutputStreamOperator> mainDataStream = stream1
// 两个流连接
.connect(stream2)
// 执行低阶处理函数,具体处理逻辑在子类中实现
.process(getCoProcessFunctionInstance());
// 将低阶处理函数输出的元素全部打印出来
mainDataStream.print();
// 侧输出相关逻辑,子类有侧输出需求时重写此方法
doSideOutput(mainDataStream);
// 执行
env.execute("ProcessFunction demo : CoProcessFunction");
}
}
package com.bolingcavalry.coprocessfunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.functions.co.CoProcessFunction;
import org.apache.flink.util.Collector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CollectEveryOne extends AbstractCoProcessFunctionExecutor {
private static final Logger logger = LoggerFactory.getLogger(CollectEveryOne.class);
@Override
protected CoProcessFunction, Tuple2, Tuple2> getCoProcessFunctionInstance() {
return new CoProcessFunction, Tuple2, Tuple2>() {
@Override
public void processElement1(Tuple2 value, Context ctx, Collector> out) {
logger.info("处理1号流的元素:{},", value);
out.collect(value);
}
@Override
public void processElement2(Tuple2 value, Context ctx, Collector> out) {
logger.info("处理2号流的元素:{}", value);
out.collect(value);
}
};
}
public static void main(String[] args) throws Exception {
new CollectEveryOne().execute();
}
}
12:45:38,774 INFO CollectEveryOne - 处理1号流的元素:(aaa,111),
(aaa,111)
12:45:43,816 INFO CollectEveryOne - 处理2号流的元素:(bbb,222)
(bbb,222)
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos
转:
Flink处理函数实战之五:CoProcessFunction(双流处理)
标签:wordcount 源码下载 slf4j 抽象类 isnull 约束 行业 bbb 分类
原文地址:https://www.cnblogs.com/wangtcc/p/14710851.html