Flink 迭代流可以用来解决部分数据需要重新计算的场景,包括扫码支付等。
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.IterativeStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
public class IterativeStreamExample {
public static void main(String[] args) {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
ParameterTool paramTool = ParameterTool.fromArgs(args);
String host = paramTool.get("host");
int port1 = paramTool.getInt("port");
DataStream<String> inputStream1 = env.socketTextStream(host, port1);
// 做分词
DataStream<Tuple2<String, Integer>> flatStream1 = inputStream1.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
String[] arr = s.split(" ");
for (String item : arr) {
collector.collect(new Tuple2<>(item, 1));
}
}
});
IterativeStream<Tuple2<String, Integer>> iteration1 = flatStream1.iterate(5 * 60 * 1000); //迭代头
DataStream<Tuple2<String, Integer>> iteratedStream1 = iteration1.filter((FilterFunction<Tuple2<String, Integer>>) tuple2 ->
!tuple2.f0.isEmpty()
).keyBy(0).sum(1);
DataStream<Tuple2<String, Integer>> feedbackStream1 = iteratedStream1.filter((FilterFunction<Tuple2<String, Integer>>) stringIntegerTuple2 -> !stringIntegerTuple2.f0.equals("jack"));
iteration1.closeWith(feedbackStream1);
iteratedStream1.print();
try {
env.execute("stream word count");
} catch (Exception e) {
e.printStackTrace();
}
}
}