你能不能帮助我 - 我正在尝试使用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个功能等等简单来说,我需要对流中的同一个单个事件应用几个完全不同的map
操作,然后将所有地图函数的结果合并到单个向量中。
所以现在我无法弄清楚如何在map
中实现最终缩减步骤和运行所有特征提取parallel
作业。我花了好几天在flink docs网站,youtube视频,谷歌搜索,阅读Flink's
来源,但似乎我真的被困在这里。
这里的简单解决方案是使用单个map
操作,并在巨大的map
正文中逐个顺序运行每个特征提取代码,然后为每个输入返回最终向量(Feature1...FeatureK)
事件。但它应该是疯狂的,非最佳的。
每两个特性的另一个解决方案使用join
,因为所有特征DataStream都具有相同的初始事件和相同的密钥,并且只应用一些转换代码,但它看起来很难看:写50个连接代码与{{1} }。而且我认为加入和组合是为了加入来自不同来源的不同流而不是用于这种地图/缩减操作。
至于我所有的window
操作,这里应该是一件我很想念的简单事。
请您指点我们如何在map
中实施此类任务,如果可能,请使用代码示例?
谢谢!
答案 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:
flatMap
into tuples: <featureId, Xi, eventId>
.keyBy(featureId, eventId)
(or maybe do random partitioning with shuffle()
?).keyBy(eventId, ...)
.