假设mongodb中有这样一个“货物”集合:
{name:"A",attr:["location":"us"],"eventTime":"2018-01-01"}
{name:"B",attr:["brand":"nike"],"eventTime":"2018-01-01"}
在过去,我使用spark将其展平并保存到hive:
goodsDF.select($"name",explode($"attribute"))
但是,现在我们需要处理增量数据,例如,第三行第二天有一个新的好数据
{name:"A",attr:["location":"us"],"eventTime":"2018-01-01"}
{name:"B",attr:["brand":"nike"],"eventTime":"2018-01-01"}
{name:"C",attr:["location":"uk"],"eventTime":"2018-02-01"}
我们的一些团队认为flink在流媒体方面更好,因为flink有事件驱动程序应用程序、流媒体管道和批处理,但spark只是微批处理。
所以我们改为使用flink,但是spark已经编写了很多代码,比如上面的“explode”,所以我的问题是:是否可以使用flink获取源代码并保存到sink,但是在中间,使用spark转换数据集?
如果不可能,那么把它保存到一个临时接收器,比如说,一些json文件,然后spark读取这些文件并转换保存到hive。但是我担心这没有意义,因为对于spark来说,它也是增量数据。使用flink然后使用spark与直接使用spark structured streaming是一样的。
1条答案
按热度按时间kyvafyod1#
不可以。在flink中使用apachespark代码时必须对代码进行更改。因为这两个是不同的处理框架和两个提供的api,其语法也不同。框架的选择应该真正由用例驱动,而不是像flink比spark更好这样的泛型语句。一个框架可能对你的用例很有用,而在其他用例中它的性能可能很差。顺便说一句,spark不仅仅是微批量的。它有批、流、图、ml等功能。因为完整的用例没有被提及,所以很难建议哪一个更适合这个场景。但是,如果您的用例能够承受亚秒的延迟,那么我就不会浪费时间迁移到另一个框架。
另外,如果事情是动态的,并且预计处理框架将来可能会发生变化,那么最好使用apachebeam之类的东西,它提供了对大多数处理引擎的抽象。使用apachebeam处理api可以让您随时灵活地更改底层处理引擎。以下是阅读更多关于beam的链接-https://beam.apache.org/.