Flink学习(三) -- Java版流处理工程运行问题记录

StreamExecutionEnvironment提示ClassNotFoundException问题

根据Flink官网提供的Maven命令搭建工程

$ mvn archetype:generate \
    -DarchetypeGroupId=org.apache.flink \
    -DarchetypeArtifactId=flink-walkthrough-datastream-java \
    -DarchetypeVersion=1.11.2 \
    -DgroupId=frauddetection \
    -DartifactId=frauddetection \
    -Dversion=0.1 \
    -Dpackage=spendreport \
    -DinteractiveMode=false

问题描述

导入IDE后运行提示ClassNotFoundException: org.apache.flink.streaming.api.environment.StreamExecutionEnvironment
在这里插入图片描述

解决方法:

注释掉pom文件中maven配置<scope>provided</scope>
在这里插入图片描述

flink中使用lambda表达式提示InvalidTypesException

问题描述

在运行以下任务

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStream<String> textStream = env.socketTextStream("localhost", 9000, "\n");
        SingleOutputStreamOperator<Object> streamOperator = textStream.flatMap((s, collector) -> {
            String[] strings = s.split("\\s");
            Arrays.stream(strings).map(m -> Tuple2.of(m, 1)).forEach(collector::collect);
        }).keyBy(0).timeWindow(Time.seconds(5)).sum(1);
        streamOperator.print().setParallelism(1);
        env.execute("Socket Window WordCount");
    }

提示InvalidTypesException: The generic type parameters of 'Collector' are missing异常:
在这里插入图片描述

解决方式

  1. 使用 匿名函数 来替代lambda表达式
  2. 使用 returns方法来明确的指定返回类型
    修改后代码如下:
 public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStream<String> textStream = env.socketTextStream("localhost", 9000, "\n");
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = textStream.flatMap((String s, Collector<Tuple2<String, Integer>> collector) -> {
            String[] strings = s.split("\\s");
            Arrays.stream(strings).map(m -> Tuple2.of(m, 1)).forEach(collector::collect);
        })
                //明确指定返回类型
                .returns(Types.TUPLE(Types.STRING, Types.INT))
                .keyBy(0).timeWindow(Time.seconds(5)).sum(1);
        sum.print().setParallelism(1);
        env.execute("Socket Window WordCount");
    }

原因分析

void flatMap(IN value, Collector<OUT> out) 由javac编译后,变成 void flatMap(IN value, Collector out),导致泛型丢失,导致flink无法自动推断出类型,flink会认为是Object类型,从而导致无效的序列化类型。
参考文章:
flink中使用lambda表达式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值