Flink入门WordCount无界流处理实现

新建类:

package test.yh;

import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
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.util.Collector;

public class TestStreamingWordCount {
    public static void main(String[] args) throws Exception {

        //创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //读取数据流,这里通过监听端口来实现实时数据流的数据源
        DataStreamSource stringDataStreamSource = env.socketTextStream("localhost", 9999);

        //下面计算部分与有界流处理方式一样
        SingleOutputStreamOperator> wordAndOneTuple = stringDataStreamSource.flatMap((String everyLine, Collector> out) -> {
                    String[] everyLineWord = everyLine.split(" ");
                    for (String word : everyLineWord) {
                        out.collect(Tuple2.of(word, 1L));
                    }
                })
                .returns(Types.TUPLE(Types.STRING, Types.LONG));

        //根据key(word)进行分组,这里提供了groupByKey的方法,可以直接对key进行分组。在二元元组中,第一个元素的名称是f0,第二个元素的名称是f1,所以这里直接使用f0作为key
        KeyedStream, String> wordAndOneKeyedStream = wordAndOneTuple.keyBy(data -> data.f0);

        //对分组后的结果求和
        SingleOutputStreamOperator> sum = wordAndOneKeyedStream.sum(1);

        //对于流处理,默认数据是无界的,所以它会一直等待源数据,所以我们需要调用execute()方法让它执行。
        sum.print();
        env.execute();
    }
}

启动netcat:

Flink入门WordCount无界流处理实现_第1张图片

运行project,运行后,在上面的nc窗口输入word串,然后去IDEA控制台看实时计算结果:

Flink入门WordCount无界流处理实现_第2张图片

继续输入数据:

Flink入门WordCount无界流处理实现_第3张图片 

 继续输入:

Flink入门WordCount无界流处理实现_第4张图片

 由于同一条数据中的word是并行运算的,所以同一条数据的word的输出结果也是乱序的。

 

你可能感兴趣的:(大数据之Flink,flink,大数据)