Flink笔记(七):Lambda 表达式编写 Flink 实时任务

1.Lambda表达式编写 WordCount

       接前文:Java 编写Flink实时任务(WordCount 示例)。当我们使用 Lambda表达式编写 Flink 实时 WordCount 时,你会发现编译能够通过,但是运行时却会报错。报错信息继续向下看↓↓↓

/**
 * TODO Lambda表达式,实现实时WordCount
 * (如下Lambda表达式还可以继续精简,为方便错误描述,此处不再继续精简。精简代码见文末)
 * 
 * @author liuzebiao
 * @Date 2020-2-4 15:49
 */
public class LambdaStreamWordCount {

    public static void main(String[] args) throws Exception {
        //1.创建一个 flink steam 程序的执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //2.获取 DataSource 数据来源
        DataStreamSource<String> lines = env.socketTextStream("localhost", 8888);

        //3.Transformations 过程
        SingleOutputStreamOperator<Tuple2<String, Integer>> words = lines.flatMap((String line, Collector<Tuple2<String, Integer>> out) -> Arrays.stream(line.split(" ")).forEach(word -> out.collect(Tuple2.of(word, 1))));

        SingleOutputStreamOperator<Tuple2<String, Integer>> sumed = words.keyBy(0).sum(1);

        //4.sink过程
        sumed.print();
        //5.任务执行过程
        env.execute("LambdaStreamWordCount");
    }
}

1.1错误信息

       当我们使用 Java Lambda 表达式来编写 Flink 任务时,语法没有保错。但是当我们执行任务时,则会报如下错误:Exception in thread “main” org.apache.flink.api.common.functions.InvalidTypesException: The return type of function ‘main(LambdaStreamWordCount.java:26)’ could not be determined automatically, due to type erasure. You can give type information hints by using the returns(…) method on the result of the transformation call, or by letting your function implement the ‘ResultTypeQueryable’ interface.这是为什么呢?

1.2.错误原因

       当使用 Lambda 表达式时,main()方法返回的类型,并不能被自动的推断出来。但是你可以通过调用 returns()方法提供给它更多的信息,retuns()方法会告诉 Lambda 表达式返回的类型。

       就是我们缺一个 returns()方法的原因,接下来我们对该实例进行修改,请继续往下看↓↓↓

1.3.修改后的WordCunt

/**
 * TODO Lambda表达式,使用 returns() 方法修改后的 WordCount
 *
 * @author liuzebiao
 * @Date 2020-2-4 15:49
 */
public class LambdaStreamWordCount {

    public static void main(String[] args) throws Exception {
        //1.创建一个 flink steam 程序的执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //2.获取 DataSource 数据来源
        DataStreamSource<String> lines = env.socketTextStream("localhost", 8888);

        //3.Transformations 过程(注意此处:最后添加了 returns()方法,返回具体的类型,这样就不会报错了)
        SingleOutputStreamOperator<Tuple2<String, Integer>> words = lines.flatMap((String line, Collector<Tuple2<String, Integer>> out) -> 
                Arrays.stream(line.split(" "))
                        .forEach(word -> out.collect(Tuple2.of(word, 1))))
                .returns(Types.TUPLE(Types.STRING,Types.INT));

        SingleOutputStreamOperator<Tuple2<String, Integer>> sumed = words.keyBy(0).sum(1);

        //4.sink过程
        sumed.print();
        //5.任务执行过程
        env.execute("LambdaStreamWordCount");
    }
}

1.4.精简后的WordCount

/**
 * TODO Lambda表达式,精简后的 WordCount
 *
 * @author liuzebiao
 * @Date 2020-2-4 15:49
 */
public class LambdaStreamWordCount {

    public static void main(String[] args) throws Exception {
        //1.创建一个 flink steam 程序的执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //2.获取 DataSource 数据来源
        DataStreamSource<String> lines = env.socketTextStream("localhost", 8888);

        //3.Transformations 过程(处理数据过程一行搞定)
        // 虽然参数(String line, Collector<Tuple2<String, Integer>> out) 部分还可以精简成 (line,out)
        // 但是就会报错了。所以说并不是说越精简越好,也不方便后期的维护
        SingleOutputStreamOperator<Tuple2<String, Integer>> sumed = lines.flatMap((String line, Collector<Tuple2<String, Integer>> out) -> Arrays.stream(line.split(" ")).forEach(word -> out.collect(Tuple2.of(word, 1)))).returns(Types.TUPLE(Types.STRING,Types.INT)).keyBy(0).sum(1);

        //4.sink过程
        sumed.print();
        //5.任务执行过程
        env.execute("LambdaStreamWordCount");
    }
}

1.5 建议

       当我们在使用 Lambda 表达式开发 Flink 时,最好在每次使用 Lambda 表达式结尾部分时用returns()方法来指明具体要返回的类型


Lambda 表达式编写实时 WordCount,介绍到此为止

如果本文对你有所帮助,那就给我点个赞呗 O(∩_∩)O

End

发布了247 篇原创文章 · 获赞 44 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/lzb348110175/article/details/104171771