我们有一个Spark流用例,我们需要根据摄取的事件(在Kafka中)计算一些指标,但是计算需要事件中不存在的其他元数据。
我可以想到的显而易见的设计模式是从spark executor任务对元数据表(在主数据库上)进行点查询,并在每个事件的处理过程中使用该元数据信息。
另一个想法是在将提取的事件发送到Kafka之前,在一个单独的管道中“丰富”作为预处理程序的事件。可以通过其他服务或任务来做到这一点。
第二种情况在将运行Spark / hadoop的域/环境与存储所有元数据的主数据库的域隔离开的情况下更为有用。
对于这种类型的事件“丰富化”应该如何达成共识?我在这里还缺少其他哪些考虑因素?
答案 0 :(得分:1)
通常,您考虑的第一种方法是正确的并符合您的要求。
众所周知,在Apache Spark中,您可以将动态数据与静态数据结合在一起。
换句话说,您拥有可以从Kafka连续流式传输数据的流式传输上下文。
val dfStream = spark.read.kafka(...)
同时,您可以连接到Metastore数据库(例如spark.read.jdbc)
val dfMetaDb = spark.read.jdbc(...)
您可以将他们一起加入
dsStream.join(dfMetaDB)
,然后从这一点开始继续进行。 好处是您无需接触其他组件,而仅依赖于Spark处理功能。