在Flink中广播HashMap

时间:2018-02-28 22:43:59

标签: java hashmap apache-flink

我正在使用Flink v.1.4.0

我正在使用DataSet API,我想尝试的其中一项与Apache Spark中广播变量的使用方式非常相似。

实际上,我想在DataSet上应用地图功能,浏览DataSet中的每个元素并在HashMap中搜索它;如果搜索元素出现在Map中,则检索相应的值。

HashMap非常大,我不知道(因为我甚至没有构建我的解决方案)它需要Serializable同时传输和使用所有工作人员。< / p>

一般来说,我想到的解决方案看起来像这样:

Map<String, T> hashMap = new ... ;

DataSet<Point> points = env.readCsv(...);

points
  .map(point -> hashMap.getOrDefault(point.getId, 0))
  ...

但我不知道这是否有效,或者它是否有效。在进行了一些搜索之后,我找到了一个更好的示例here,根据Broadcast我们可以Flink中的List个变量来广播DataSet<Point> points = env.readCsv(...); DataSet<Centroid> centroids = ... ; // some computation points.map(new RichMapFunction<Point, Integer>() { private List<Centroid> centroids; @Override public void open(Configuration parameters) { this.centroids = getRuntimeContext().getBroadcastVariable("centroids"); } @Override public Integer map(Point p) { return selectCentroid(centroids, p); } }).withBroadcastSet("centroids", centroids); ,如下所示:

.getBroadcastVariable()

但是,List似乎仅适用于HashMap

  • 有人可以提供mappings的替代解决方案吗?
  • 该解决方案将如何运作?
  • 解决这个问题最有效的方法是什么?
  • 是否可以使用Flink Managed State来执行与广播变量的使用方式类似的操作?怎么样?
  • 最后,我可以在管道中尝试多个[[0 0 1 1] [0 1 0 1]] 多个广播变量吗?

1 个答案:

答案 0 :(得分:1)

hashMap的值来自何处?另外两种可能的解决方案:

  1. open方法中,分别在过滤/映射运算符的每个实例中重新初始化/重新创建/重新生成hashMap。每条记录可能效率更高,但重复初始化逻辑。
  2. 使用join创建两个DataSet,一个用于hashMap值,第二个用于pointsdesired join strategy这两个DataSet。作为类比,您尝试执行的操作可以通过SQL查询SELECT * FROM points p, hashMap h WHERE h.key = p.id来表达。