这是我参与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具有批处理及流式处理两种方式,是目前很流行的一种数据处理框架。对于整个数据体系来说,具备其特有的特性,值得学习。本文暂时只是入门代码的皮毛,具体的内容有待于后续探索。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。