Flink 在为键添加盐和某些字段上的 window 聚合时抛出 NullPointerException

Flink throws NullPointerException when adding salt for the key and window aggregation on some field

我有一个程序执行 2 阶段聚合来解决我工作中的数据倾斜问题。我使用一个简单的 ThreadLocalRandom 为我的原始文件生成一个后缀,例如:

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

但是 Flink 在为我正在对某些字段进行 window 聚合的键添加盐时抛出 NullPointerException。

我在flink-mail-list上找到了一个similar post,得到了可能出现异常的原因,但是我的程序中还是找不到关于unstable of hash value的bug。有什么想法吗?

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

您可以做的是在摄取过程中为您使用随机值填充的每条记录添加一个字段,然后将该字段用作键。