意见:从Spark流或结构化流任务查询数据库

时间:2019-10-25 18:30:35

标签: apache-spark spark-streaming spark-structured-streaming spark-streaming-kafka

我们有一个Spark流用例,我们需要根据摄取的事件(在Kafka中)计算一些指标,但是计算需要事件中不存在的其他元数据。

我可以想到的显而易见的设计模式是从spark executor任务对元数据表(在主数据库上)进行点查询,并在每个事件的处理过程中使用该元数据信息。

另一个想法是在将提取的事件发送到Kafka之前,在一个单独的管道中“丰富”作为预处理程序的事件。可以通过其他服务或任务来做到这一点。

第二种情况在将运行Spark / hadoop的域/环境与存储所有元数据的主数据库的域隔离开的情况下更为有用。

对于这种类型的事件“丰富化”应该如何达成共识?我在这里还缺少其他哪些考虑因素?

1 个答案:

答案 0 :(得分:1)

通常,您考虑的第一种方法是正确的并符合您的要求。

众所周知,在Apache Spark中,您可以将动态数据与静态数据结合在一起。

换句话说,您拥有可以从Kafka连续流式传输数据的流式传输上下文。

val dfStream = spark.read.kafka(...)

同时,您可以连接到Metastore数据库(例如spark.read.jdbc)

val dfMetaDb = spark.read.jdbc(...)

您可以将他们一起加入

dsStream.join(dfMetaDB)

,然后从这一点开始继续进行。 好处是您无需接触其他组件,而仅依赖于Spark处理功能。