如何在Spark Streaming中执行高效的缓存JDBC查找

时间:2015-10-23 08:19:24

标签: apache-spark

我们需要使用JDBC查找来丰富传入的Kafka DStream数据。对于每个Kafka消息,我们需要通过JDBC在一些查找表中查找信息。

只要查找表很小或查找数据是静态的(或随着时间的推移缓慢变化),这在Spark Streaming中就相当简单了。在这种情况下,脚本可以将整个查找表加载到Spark中。在一些到期时间之后,只需要刷新查找数据再进行一次完全重新加载。

问题是我们的查找表很大(例如我们不能每10秒完全重新加载)并且随着时间的推移而变化(例如,每小时刷新一次查找数据会导致过时的查找数据),上述方法不再的工作原理。

我在考虑以下高级逻辑(受到一些关于Storm流的线程的启发):

  1. 对于每个Spark Streaming微批,我们提取所有查找键
  2. 对于所有查找键,我们检查查找数据是否已经可用(缓存)以及此缓存信息是否尚未过期(例如60秒到期时间)。
  3. 对于在缓存(或已过期)中找不到的任何查找键,我们将批处理的准备好的JDBC语句发送到数据库以获取丢失的查找数据:  SELECT c1,c2,c3 FROM ... WHERE k1 in(?,?,?,...)  最小化JDBC往返次数。
  4. 此时,我们拥有所有查找键的最新查找数据,并可执行查找操作
  5. 如何在Spark Streaming上完成? Spark State DStreams会是正确的方式吗?还是其他设计方法?

    由于

1 个答案:

答案 0 :(得分:0)

您是否考虑过从源SQL服务器到更简单的密钥/值存储区进行增量更新?

e.g。对于每个INSERT或UPDATE到SQL,是否可以对Redis实例进行更新,然后可以查询?

根据来自数据库的事务日志,可以执行此操作的各种工具,例如BottledWater用于Postgres到Kafka的复制