我们说在mongodb中有一个这样的集合“商品”:
{name:"A",attr:["location":"us"],"eventTime":"2018-01-01"}
{name:"B",attr:["brand":"nike"],"eventTime":"2018-01-01"}
过去,我使用spark将其弄平并保存为蜂巢:
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已经编写了很多代码,例如,上面的“爆炸”,所以我的问题是: 是否可以使用flink来获取源并保存到接收器,但是在中间,可以使用spark来转换数据集?
如果不可能的话,如何将其保存到一个临时接收器中,比如说,一些json文件,然后火花读取文件并转换并保存为hive。但是,这恐怕是没有意义的,因为对于spark,它也是增量数据。使用flink然后使用spark与直接使用spark结构化流相同。
答案 0 :(得分:0)
不。未经更改,不能在Flink中使用Apache Spark代码。由于这两个是不同的处理框架和两者提供的API,并且语法彼此不同。框架的选择实际上应该由用例驱动,而不是由通用语句(例如Flink)胜于Spark。框架可能适合您的用例,而在其他用例中可能表现不佳。顺便说一句,Spark不仅是微型批次。它具有批处理,流,图,ML和其他内容。由于没有提到完整的用例,因此很难建议哪种方案更适合这种情况。但是,如果您的用例可以承受亚秒级的延迟,那么我就不会在转移到另一个框架上浪费时间。
此外,如果事物是动态的,并且预计处理框架将来可能会发生变化,则最好使用诸如Apache Beam之类的东西,它可以为大多数处理引擎提供抽象。使用apache光束处理API将使您能够随时灵活地更改基础处理引擎。这是更多有关梁的链接-https://beam.apache.org/。