首页 > 解决方案 > 在某些字段上为键和窗口聚合添加盐时,Flink 抛出 NullPointerException

问题描述

我有一个程序进行两阶段聚合来解决我工作中的数据偏差。我使用了一个简单ThreadLocalRandom的为我的原始文件生成后缀,例如:

  private class KeyByTileWithSalt implements KeySelector<Type, String> {
    @Override
    public Long getKey(Type value) {
      return value.toString() + ThreadLocalRandom.current().nextLong(1, 8);
    }
  }

但是当我在某个字段上进行窗口聚合的键添加盐时,Flink 会抛出 NullPointerException。

我在 flink-mail-list 上找到了一个类似的帖子unstable of hash value,并得到了可能发生异常的原因,但我仍然无法在我的程序中找到关于. 有任何想法吗?

标签: javaapache-flink

解决方案


Flink 依赖于keyBy整个集群的确定性结果。这是必要的,以便集群中的每个节点都具有关于哪个节点负责处理每个密钥的一致视图。通过让密钥依赖于ThreadLocalRandom你已经违反了这个假设。

您可以做的是向您在提取期间填充随机值的每条记录添加一个字段,然后使用该字段作为键。


推荐阅读