Cassandra + Spark 用于实时分析
Cassandra + Spark for Real time analytics
我正在处理 "Real Time Rendering of Big Data (Spatial data)" 的申请。
在 Spark Streaming + Spark SQL + WebSocket 的帮助下,我能够在仪表板上呈现预定义的查询。但我想通过交互式查询和临时查询来获取数据。
为此,我正在尝试使用 "Spark Streaming + Cassandra" 来实现它。这些查询需要对大量数据进行聚合和过滤。
我是 Cassandra 和 Spark 的新手,所以我对以下方法感到困惑,它们是 better\faster:
- Spark Streaming -> 过滤(Spark) -> 保存到 Cassandra -> 交互式查询 -> UI(仪表板)
- Spark Streaming -> 过滤 (Spark) -> 保存到 Cassandra ->Spark SQL -> 交互式查询 -> UI (Dashboard)
Cassandra 是否足够快以实时给出结果?或者我应该从 Cassandra 创建一个 RDD 来对其执行交互式查询。
其中一个查询是:
"SELECT * FROM PERFORMANCE.GEONAMES A INNER JOIN
(SELECT max(GEONAMEID) AS MAPINFO_ID FROM PERFORMANCE.GEONAMES
where longitude between %LL_LONG% and %UR_LONG%
and latitude between %LL_LAT% and %UR_LAT%
and %WHERE_CLAUSE% GROUP BY LEFT(QUADKEY, %QUAD_TREE_LEVEL%) )
AS B ON A.GEONAMEID = B.MAPINFO_ID"
如有任何意见或建议,我们将不胜感激。谢谢,
感谢@doanduyhai 建议使用 SASI 二级索引,它确实产生了巨大的变化。
Will Cassandra be fast enough to give result in real time ? Or should i create an RDD from Cassandra to perform interactive queries over it.
这取决于您预先进行了多少过滤以及集群中的机器数量。如果你的 Cassandra table 有 1Tb 的数据并且你查询在内存中获取 100Gb 的数据,假设有 10 台机器的集群,这意味着在内存中加载 1Gb 它是可管理的,但查询永远不会是一分钟。
现在,如果您过滤得足以从 Cassandra table 中提取总共 100Mb,这意味着每台机器 10Mb,并且可能会有秒级的延迟。
如何在 Cassandra 中尽早过滤数据?
- 使用新的SASI secondary index(等待本周发布的 Cassandra 3.5,因为已发现 2 个严重错误)
- 使用 DSE Search 使用 Solr 进行早期过滤
- 使用Stratio Lucene secondary index
which will be better\faster
一如既往,这取决于您希望能够进行何种查询 运行。 Cassandra 会根据您设置表格的方式施加一些限制;例如,您不能在 where
子句中使用非索引列。如果您使用 Spark inbetween 加载数据,您可以执行 Spark 允许的任何查询。
如果您使用 SparkSQL/DataFrames,并执行 Cassandra does
允许的查询,Spark 会将其下推,您将获得与直接使用 Cassandra 类似的性能。否则,它将不得不从 Cassandra 加载所有数据,然后应用您指定的任何过滤器,这显然效率要低得多。
总的来说,您可以使用 Spark,但它会允许用户 运行 非常慢的查询。因此,您仍然应该了解如何在 Cassandra 中构造数据以增加谓词下推的可能性以提高原始 Cassandra 性能。
我正在处理 "Real Time Rendering of Big Data (Spatial data)" 的申请。 在 Spark Streaming + Spark SQL + WebSocket 的帮助下,我能够在仪表板上呈现预定义的查询。但我想通过交互式查询和临时查询来获取数据。
为此,我正在尝试使用 "Spark Streaming + Cassandra" 来实现它。这些查询需要对大量数据进行聚合和过滤。
我是 Cassandra 和 Spark 的新手,所以我对以下方法感到困惑,它们是 better\faster:
- Spark Streaming -> 过滤(Spark) -> 保存到 Cassandra -> 交互式查询 -> UI(仪表板)
- Spark Streaming -> 过滤 (Spark) -> 保存到 Cassandra ->Spark SQL -> 交互式查询 -> UI (Dashboard)
Cassandra 是否足够快以实时给出结果?或者我应该从 Cassandra 创建一个 RDD 来对其执行交互式查询。
其中一个查询是:
"SELECT * FROM PERFORMANCE.GEONAMES A INNER JOIN
(SELECT max(GEONAMEID) AS MAPINFO_ID FROM PERFORMANCE.GEONAMES
where longitude between %LL_LONG% and %UR_LONG%
and latitude between %LL_LAT% and %UR_LAT%
and %WHERE_CLAUSE% GROUP BY LEFT(QUADKEY, %QUAD_TREE_LEVEL%) )
AS B ON A.GEONAMEID = B.MAPINFO_ID"
如有任何意见或建议,我们将不胜感激。谢谢,
感谢@doanduyhai 建议使用 SASI 二级索引,它确实产生了巨大的变化。
Will Cassandra be fast enough to give result in real time ? Or should i create an RDD from Cassandra to perform interactive queries over it.
这取决于您预先进行了多少过滤以及集群中的机器数量。如果你的 Cassandra table 有 1Tb 的数据并且你查询在内存中获取 100Gb 的数据,假设有 10 台机器的集群,这意味着在内存中加载 1Gb 它是可管理的,但查询永远不会是一分钟。
现在,如果您过滤得足以从 Cassandra table 中提取总共 100Mb,这意味着每台机器 10Mb,并且可能会有秒级的延迟。
如何在 Cassandra 中尽早过滤数据?
- 使用新的SASI secondary index(等待本周发布的 Cassandra 3.5,因为已发现 2 个严重错误)
- 使用 DSE Search 使用 Solr 进行早期过滤
- 使用Stratio Lucene secondary index
which will be better\faster
一如既往,这取决于您希望能够进行何种查询 运行。 Cassandra 会根据您设置表格的方式施加一些限制;例如,您不能在 where
子句中使用非索引列。如果您使用 Spark inbetween 加载数据,您可以执行 Spark 允许的任何查询。
如果您使用 SparkSQL/DataFrames,并执行 Cassandra does
允许的查询,Spark 会将其下推,您将获得与直接使用 Cassandra 类似的性能。否则,它将不得不从 Cassandra 加载所有数据,然后应用您指定的任何过滤器,这显然效率要低得多。
总的来说,您可以使用 Spark,但它会允许用户 运行 非常慢的查询。因此,您仍然应该了解如何在 Cassandra 中构造数据以增加谓词下推的可能性以提高原始 Cassandra 性能。