202111-16更文-flink处理数据初体验

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

flink处理数据初体验

前文

本文为对于flink批处理以及流式处理数据的示例代码,并非为标准编码方式,仅为体验级入门代码。

flink进行批处理

下面逐行解释一下代码的含义。首先需要建立flink的环境,由于这里是进行批处理操作,因此直接采用ExecutionEnvironment定义环境即可。由于批处理是已经具有固定的数据集,所以将存储数据的结构声明为DataSet即可。在对于数据进行打散处理后,需要首先进行分组操作。而分组的变量内容为存储在元组中的第0个值。同时,分组后需要再次对数据进行加和操作,加和的变量为元组的第二个值。经过处理,也就能够分析得到每个数据的出现总次数。

String filePath = "D:\projects\flinkProject\src\main\resources\word.txt";
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
//        源数据集
        DataSet<String> dataSet = env.readTextFile(filePath);
//        输出数据集
        DataSet<Tuple2<String,Integer>> outData = dataSet.flatMap(new MyFlatter()).groupBy(0).sum(1);
        outData.print();
复制代码

flink进行流处理

采用flink进行流处理,首先要注意环境要声明为StreamExecutionEnvironment。由于流式数据属于源源不断的类型,与批处理数据直接存在有所区别。因此采用socket获取的方式作为数据源。通过监听端口发送的数据,作为flink处理的源数据。后续与flink进行批处理的方式类似,需要对数据进行分组操作,分组的变量为元组的第一个值。要注意的是,分组时要采用keyBy的方式,与批处理有所区别。经过分组后对于元组的第二个值进行加和,也就得到了所需要的数据统计结果。

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> inputStream = env.socketTextStream("localhost",8888);

DataStream<Tuple2<String,Integer>> outStream = inputStream.flatMap(new MyFlatter())
        .keyBy(0).sum(1);
outStream.print().setParallelism(4);

env.execute();
复制代码

对数据进行处理部分的代码

上述的批处理以及流处理代码中,都采用了数据打散并处理为元组的操作类。而该类的代码如下所示,根据空格将数据进行拆分,并将拆分结果作为元组的第一个值,1作为元组的第二个值进行输出。经过该操作,数据也就初步处理完毕。

public class MyFlatter implements FlatMapFunction<String, Tuple2<String,Integer>> {
    @Override
    public void flatMap(String o, Collector<Tuple2<String,Integer>> collector) throws Exception {
        String[] words = o.split(" ");
        for (String word: words) {
            collector.collect(new Tuple2<>(word, 1));
        }
    }
}
复制代码

总结

flink具有批处理及流式处理两种方式,是目前很流行的一种数据处理框架。对于整个数据体系来说,具备其特有的特性,值得学习。本文暂时只是入门代码的皮毛,具体的内容有待于后续探索。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。

猜你喜欢

转载自juejin.im/post/7031035177606316039