Events 连续查询的Cassandra(+;Spark?)的最佳方法?

Events 连续查询的Cassandra(+;Spark?)的最佳方法?,events,cassandra,apache-spark,cassandra-2.0,Events,Cassandra,Apache Spark,Cassandra 2.0,我们目前正在使用Hazelcast()作为分布式内存数据网格。这对我们来说工作得很好,但是在我们的用例中,只在内存中运行已经耗尽了它的路径,我们正在考虑将我们的应用程序移植到NoSQL持久存储。在通常的比较和评估之后,我们接近于选择卡桑德拉,并最终选择Spark进行分析 尽管如此,在我们的体系结构需求中仍然存在一个缺口,我们还没有掌握如何在Cassandra中解决这个缺口(有或没有Spark):Hazelcast允许我们创建一个连续查询,无论何时从子句的resultset中添加/删除/修改一行,

我们目前正在使用Hazelcast()作为分布式内存数据网格。这对我们来说工作得很好,但是在我们的用例中,只在内存中运行已经耗尽了它的路径,我们正在考虑将我们的应用程序移植到NoSQL持久存储。在通常的比较和评估之后,我们接近于选择卡桑德拉,并最终选择Spark进行分析

尽管如此,在我们的体系结构需求中仍然存在一个缺口,我们还没有掌握如何在Cassandra中解决这个缺口(有或没有Spark):Hazelcast允许我们创建一个连续查询,无论何时从子句的resultset中添加/删除/修改一行,Hazelcast都会调用相应的通知。我们使用它通过AJAX流不断地更新客户机,使其具有新的/更改的行

这可能是我们正在进行的概念上的不匹配,所以-如何在Cassandra中最好地解决这个用例(有或没有Spark的帮助)?API中是否有允许对键/子句更改进行连续查询的内容(尚未找到)?是否有其他方法获取密钥/子句更新流?某种事件

我知道,我们最终可以定期轮询Cassandra,但在我们的用例中,客户可能对大量的表子句通知感兴趣(想想“加利福尼亚海岸线上船舶位置的所有变化”),在商店外迭代会破坏拖缆的可伸缩性

因此,一个神奇的问题是:我们错过了什么?卡桑德拉是做这项工作的错误工具吗?我们是否不知道apache领域内外的API或外部库的特定部分允许这样做

非常感谢您的帮助


Hugo

我不是spark方面的专家,所以对此持保留态度,但也许你可以使用这样的方法:

val notifications = ssc.whateverSourceYouHaveThatGivesADstream(...)
notifications.foreachRDD(x => {
    x.foreachPartition(x => {
      cassandraConnector.withSessionDo(session => {
          x.foreach(y => {
              //use session to update cassandra
              // broadcast via AJAX or send to proxy to broadcast
          })
      })
    })
})
  • 使用spark streaming对传入数据流进行实时分析,并实时向客户端推送位置更新

  • 使用Cassandra进行持久存储、缓存视图和数据汇总,客户机可以从中提取数据

  • 因此,您将编写一个spark流应用程序,该应用程序连接到传入的数据流,可能是一个定期报告船舶位置的应用程序。当它收到一个船舶位置时,它将在Cassandra中查找船舶的最后一个已知位置(以前存储在该船舶id的位置聚集时间序列中,按时间戳反向排序,以便最近的位置是第一行)。如果船舶位置已更改,spark应用程序将在Cassandra中插入新的时间序列行,并将新位置推送到实时客户端

    《星火》还将为卡萨德拉写一些其他更新,以供客户们想知道的东西,比如在旧金山湾有多少艘船的桌子。当客户机单击托架时,将查询汇总表以提取数据进行显示。客户机上需要快速响应时间的任何内容都应该由spark预先计算并存储在Cassandra中,以便快速检索


    当新客户端启动时,他们将首先查询(从)Cassandra以获取所有船只的当前位置,然后从spark应用程序推送对该数据的实时更新。

    使用spark streaming。需要更新时,执行两个操作:

  • 做一个saveToCassandra,它将更新cassandra数据以备将来查询
  • 使用您正在使用的任何东西将更改向下推给客户机。如果可以将AJAX推送放入流式客户端代码中,则可以从Spark Streaming执行AJAX通知。否则,您可以向某个代理发送消息,该代理将转发到Ajax客户端 您的代码可能如下所示:

    val notifications = ssc.whateverSourceYouHaveThatGivesADstream(...)
    notifications.foreachRDD(x => {
        x.foreachPartition(x => {
          cassandraConnector.withSessionDo(session => {
              x.foreach(y => {
                  //use session to update cassandra
                  // broadcast via AJAX or send to proxy to broadcast
              })
          })
        })
    })
    
    希望有帮助。

    查看Spark作业服务器 你可能想看看

    它允许您在不同的工作之间共享spark上下文,从而兑现RDD

    并为spark提供了一个restful API,用于近实时(基于刷新缓存的频率)查询。

    可能会有所帮助。它支持从cassandra表进行流式处理:

    import com.datastax.spark.connector.streaming._
    
    val ssc = new StreamingContext(sparkConf, Seconds(1))
    
    val rdd = ssc.cassandraTable("streaming_test", "key_value").select("key", "value").where("fu = ?", 3)
    

    你检查过卡桑德拉触发器()了吗?嗨。谢谢是的,我有-问题是触发器在Cassandra的写入路径中,在那里放置通知/进一步写入可能会严重阻碍Cassandra众所周知的写入性能-我试图避免这些:)