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 TestBoundedStreamingWordCount {

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

        //创建环境,与批处理不同的是这里使用的是Stream的
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //读取原数据文件
        DataStreamSource stringDataStreamSource = env.readTextFile("test_word_dire/testword.txt");

        //将每行数据转换成二元元组
        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();


    }
}

运行:

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

 与之前批处理的运行结果相比,这里可以发现有的word出现了多次,这正是体现了流处理按照流的方式一条一条处理的,所以每次处理后都会有一个结果输出。在使用IDEA运行该程序时,它会以多线程的方式模拟Flink集群的工作机制并行计算(并行数默认是本机CPU核心数,假设CPU核心数是8,那么最前面的数字就只会出现1-8),每行结果最前面的数字表示哪个线程负责的此次运算。基于多线程并行运算,所以计算输出的结果并没有按照原始数据文件的word顺序进行输出,所以运算结果看到的就是乱序的。

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