flink source算子并行度问题

source算子并行度问题

source算子比较特殊,在普通算子和实现了source funtion接口的并行度只能被设置为1
如果想要改变source的算子则会抛出异常,此时如果想要能够设置source的算子并行度,需要实现ParallelSourceFunction接口

以下为flink 1.15版本的源码

public DataStreamSource(StreamExecutionEnvironment environment, TypeInformation<T> outTypeInfo, StreamSource<T, ?> operator, boolean isParallel, String sourceName, Boundedness boundedness) {
    super(environment, new LegacySourceTransformation(sourceName, operator, outTypeInfo, environment.getParallelism(), boundedness));
    this.isParallel = isParallel;
    if (!isParallel) {
        this.setParallelism(1);  // 设置默认并行度为1
    }

}

public DataStreamSource<T> setParallelism(int parallelism) {
	// 会根据该方法校验并行度是否合法
    OperatorValidationUtils.validateParallelism(parallelism, this.isParallel);
    super.setParallelism(parallelism);  
    return this;
}

public static void validateParallelism(int parallelism, boolean canBeParallel) {
	// 该语句判断当前是否能设置大于1的并行度
    Preconditions.checkArgument(canBeParallel || parallelism == 1, "The parallelism of non parallel operator must be 1.");
    Preconditions.checkArgument(parallelism > 0 || parallelism == -1, "The parallelism of an operator must be at least 1, or ExecutionConfig.PARALLELISM_DEFAULT (use system default).");
}

而这里可以看出一切都决定于参数canBeParallel,这个参数是在我们调用addSource方法的时候实现的

private <OUT> DataStreamSource<OUT> addSource(SourceFunction<OUT> function, String sourceName, @Nullable TypeInformation<OUT> typeInfo, Boundedness boundedness) {
    Preconditions.checkNotNull(function);
    Preconditions.checkNotNull(sourceName);
    Preconditions.checkNotNull(boundedness);
    TypeInformation<OUT> resolvedTypeInfo = this.getTypeInfo(function, sourceName, SourceFunction.class, typeInfo);
    boolean isParallel = function instanceof ParallelSourceFunction;
    this.clean(function);
    StreamSource<OUT, ?> sourceOperator = new StreamSource(function);
    return new DataStreamSource(this, resolvedTypeInfo, sourceOperator, isParallel, sourceName, boundedness);
}

从代码第六行可以看出,此处判断是否属于ParallelSourceFunction类,如果不属于则只能设置并行度为1

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值