flink简单实例

802 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情

在上一篇文章中flink入门须知大致了解了下flink,然后我就急于求成的想让他跑起来,这里记录了flink一个简单的处理实例,仅供初学者参考。

flink程序流程

1.获取执行环境

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

这里还有一种

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

但这种环境随着版本升级被淘汰了。后者与前者是数据处理模式的差别,但是我们是有别的方法设置处理模式的。

2.设置数据处理模式

env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);

指定为自动模式:AUTOMATIC 此设置后,flink将会自动识别数据源类型。有界数据流,则会采用批方式进行数据处理;无界束流,则会采用流方式进行数据处理。 一般来说用这个就没问题,但也是有必要知道还有两种其他处理模式的。

  • 1.强制指定为批数据处理模式:BATCH
env.setRuntimeMode(RuntimeExecutionMode.BATCH);
  • 2.强制指定为流数据处理模式:STREAMING
env.setRuntimeMode(RuntimeExecutionMode.STREAMING);

注意:在flink中,有界与无界数据流都可以强指定为流式运行环境,但是,如果明知一个数据来源为流式数据,就必须设置环境为AUTOMATIC 或STREAMING,不可以指定为BATCH否则程序会报错!

3.加载/创建数据源

flink可以从多种场景读取加载数据,例如 各类DB 如Mysql、SQL SERVER、MongoDB、各类MQ 如Kafka、RabbitMQ、以及很多常用数据存储场景如redis、文件(本地文件/HDFS)、scoket…

1.从集合中读取数据:有界数据

    DataStream<String> elementsSource = env.fromElements("a1,a2,a3,a4", "b1,b2,b3", "c1,c2", "d1");

2.从scoket中读取数据:无界数据

    DataStreamSource<String> elementsSource= env.socketTextStream("10.50.40.131", 9999);

4.数据处理:可使用各类算子处理数据

flink官方StreamAPI文档:
ci.apache.org/projects/fl…

DataStream<String> flatMap = elementsSource.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public void flatMap(String element, Collector<String> out) throws Exception {
                String[] wordArr = element.split(",");
                for (String word : wordArr) {
                    System.out.println("flatmap\t" + word);
                    out.collect(word);
                }
            }
        });

5.数据处输出

    source.print();

6.执行程序

    env.execute("flink-batch-demo");

完整代码

import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
public class batch_demo {
    public static void test() throws Exception {

        System.out.println("flink-batch-demo \t Start!");
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment().setParallelism(1);

        env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);

        //从集合中读取数据:有界数据
        DataStream<String> elementsSource = env.fromElements("a1,a2,a3,a4", "b1,b2,b3", "c1,c2", "d1");

        //从scoket中读取数据:无界数据
//        DataStreamSource<String> elementsSource= env.socketTextStream("10.50.40.131", 9999);

        DataStream<String> flatMap = elementsSource.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public void flatMap(String element, Collector<String> out) throws Exception {
                String[] wordArr = element.split(",");
                for (String word : wordArr) {
                    System.out.println("flatmap\t" + word);
                    out.collect(word);
                }
            }
        });
        SingleOutputStreamOperator<String> source = flatMap.map(new MapFunction<String, String>() {
            @Override
            public String map(String value) throws Exception {
                System.out.println("map\t" + value);
                return value.toUpperCase();
            }
        });
        source.print();
        env.execute("flink-batch-demo");
    }

}