在Apache Flink中并行实现应用于同一源流的一堆转换并组合结果

时间:2017-10-08 09:39:33

标签: apache-flink flink-streaming

你能不能帮助我 - 我正在尝试使用Apache Flink与XGBoost等外部集合/树库一起进行机器学习任务,所以我的工作流程将是这样的:

  • 接收单个数据流,原子事件看起来像一个简单的向量event=(X1, X2, X3...Xn),它可以被想象为POJO字段,所以最初我们有DataStream<event> source=...
  • 许多功能提取代码应用于同一事件源: feature1 = source.map(X1...Xn) feature2 = source.map(X1...Xn)等。为简单起见,我们DataStream<int> feature(i) = source.map()了解所有功能
  • 然后我需要创建一个带有提取功能(feature1, feature2, ...featureK)的矢量,现在它将是40-50个功能,但我相信它将来会包含更多项目,并且很容易包含100-500个功能等等
  • 将这些提取的要素放在10分钟窗口的数据集/表列中,并在这样的10分钟数据上运行最终机器学习任务

简单来说,我需要对流中的同一个单个事件应用几个完全不同的map操作,然后将所有地图函数的结果合并到单个向量中。

所以现在我无法弄清楚如何在map中实现最终缩减步骤和运行所有特征提取parallel作业。我花了好几天在flink docs网站,youtube视频,谷歌搜索,阅读Flink's来源,但似乎我真的被困在这里。

这里的简单解决方案是使用单个map操作,并在巨大的map正文中逐个顺序运行每个特征提取代码,然后为每个输入返回最终向量(Feature1...FeatureK)事件。但它应该是疯狂的,非最佳的。

每两个特性的另一个解决方案使用join,因为所有特征DataStream都具有相同的初始事件和相同的密钥,并且只应用一些转换代码,但它看起来很难看:写50个连接代码与{{1} }。而且我认为加入和组合是为了加入来自不同来源的不同流而不是用于这种地图/缩减操作。

至于我所有的window操作,这里应该是一件我很想念的简单事。

请您指点我们如何在map中实施此类任务,如果可能,请使用代码示例?

谢谢!

1 个答案:

答案 0 :(得分:0)

What is the number of events per second that you wish to process? If it’s high enough (~number of machines * number of cores) you should be just fine processing more events simultaneously. Instead of scaling with number of features, scale with number of events. If you have a single data source you still could randomly shuffle events before applying your transformations.

Another solution might be to:

  1. Assign unique eventId and split the original event using flatMap into tuples: <featureId, Xi, eventId>.
  2. keyBy(featureId, eventId) (or maybe do random partitioning with shuffle()?).
  3. Perform your transformations.
  4. keyBy(eventId, ...).
  5. Window and reduce back to one record per event.