是否可以从spark作业中引用或更新memcache / reddis / DB数据?

时间:2017-05-13 11:08:17

标签: mongodb caching apache-spark pyspark memcached

我们在缓存/数据库中有一些业务数据。我们每天处理大量的日志数据并更新我们的数据缓存/数据库。其中一些更新几乎是实时发生的,一些是批量发生的。我们有很多改造的火花工作。我们将来自spark作业的结果存储在文本文件中,然后运行另一个顺序作业将它们放入我们的缓存/ DB中。

我考虑过使用连接器(mongoDB-spark连接器,redis-spark连接器),并将整个数据作为RDD并对其进行处理。但是,我们的业务数据大小与日志文件和我们所做的每日更新相比非常大。所以,放弃它。

问题:

  1. 我们可以从缓存/数据库中的执行程序直接更新,以避免最后一步吗?
  2. 提高绩效的其他任何建议或替代方法?
  3. 你在这里看到任何反模式吗?

1 个答案:

答案 0 :(得分:0)

如果您对数据库的写入很简单,您可以使用以下命令直接写入数据库:

myDF.write
    .mode("overwrite") // Choose the mode you want from org.apache.spark.sql.SaveMode
    .jdbc(url, "my_table", props)

如果查询不仅仅是一个简单的插入(例如我的查询中有on duplicate key update部分的查询),您需要自己完成。

您可以使用mapPartitions()在分区之间分发文字。

myDF.mapPartitions(rows => {
  val connection = DriverManager.getConnection(URL, properties)

  rows.foreach(bulk => {
      val statement = connection.prepareStatement(myQuery)
      bulk.foreach(row => {
        statement.setString(1, row.getString(0))
        statement.setInt(2, row.getInt(1))
        ...
        statement.addBatch()
      })

      statement.executeLargeBatch().iterator
    })
  rows
}).count //An action here is required, to trigger the mapPartitions()