【问题标题】:Parquet vs Cassandra using Spark and DataFramesParquet vs Cassandra 使用 Spark 和 DataFrames
【发布时间】:2016-10-14 20:02:24
【问题描述】:

我陷入了这样一个困境,即我无法选择哪种解决方案对我更好。我有一个非常大的表(几个 100GB)和几个更小的表(几个 GB)。为了在 Spark 中创建我的数据管道并使用 spark ML,我需要加入这些表并执行几个 GroupBy(聚合)操作。这些操作对我来说真的很慢,所以我选择了以下两种操作之一:

  • 使用 Cassandra 并使用索引来加速 GoupBy 操作。
  • 根据数据布局使用 Parquet 和 Partitioning。

我可以说 Parquet 分区的工作速度更快,可扩展性更高,而且 Cassandra 使用的内存开销更少。所以问题是这样的:

如果开发人员推断并理解数据布局及其使用方式,那么仅使用 Parquet 不是更好吗,因为您将拥有更多控制权?我为什么要为 Cassandra 造成的开销付出代价?

【问题讨论】:

    标签: apache-spark cassandra spark-dataframe parquet


    【解决方案1】:

    这取决于您的用例。 Cassandra 使使用(有限的)伪 SQL 访问数据变得更加容易(也在 Spark 之外)。这使得它非常适合在其上构建在线应用程序(例如,在 UI 中显示数据)。

    此外,如果您必须处理更新,Cassandra 会变得更容易,这不仅是要在数据管道中摄取的新数据(例如日志),而且您还必须注意更新(例如系统必须处理数据更正)

    当您的用例是使用 Spark 进行分析时(并且您不关心上面提到的主题),使用 Parquet/HDFS 应该是可行的并且相当便宜 - 正如您所说的那样。借助 HDFS,您还可以通过 Spark 实现数据本地化,并且如果您正在读取大块数据,您的分析 Spark 应用程序可能会更快。

    【讨论】:

    • “因为 Cassandra 针对随机访问进行了优化,而不是针对读取大块进行了优化。”这并不完全正确。 Cassandra 针对写入进行了优化。为按您的特定顺序编写而优化。在读取级别上,Cassandra 针对顺序读取进行了优化。 (在分区键内)在分区键之外,它是键值存储。
    • 嗨菲利普,你说得对,我关于随机访问的评论不正确。我已经删除了该部分。尽管如此,如果只是想读取大垃圾中的数据,那么使用 HDFS/Parquet 可能会有优势,因为您的架构/分层得到了简化。
    【解决方案2】:

    Cassandra 也是分析用例的一个很好的解决方案,但以另一种方式。在对键空间进行建模之前,您必须知道如何读取数据。您还可以使用 where 和 range 查询,但要严格限制。有时你会讨厌这种限制,但这些限制是有原因的。 Cassandra 不像 Mysql。在 MySQL 中,性能不是关键特性。它更多的是关于灵活性和一致性。 Cassandra 是一个高性能的写/读数据库。写比读好。 Cassandra 还具有线性可扩展性。

    好的,关于您的用例:Parquet 对您来说是更好的选择。这就是为什么:

    • 您在非常大且未拆分的数据集上聚合原始数据
    • 您的 Spark ML 作业听起来像是一个计划的、非长时间运行的作业。 (一周一次,一天一次?)

    这更适合 Parquet 的用例。 Parquet 是一种用于临时分析、过滤器分析的解决方案。如果您需要每月运行 1 或 2 次查询,Parquet 非常好。如果营销人员想知道一件事并且响应时间并不那么重要,Parquet 也是一个不错的解决方案。简单明了:

    • 如果您知道查询,请使用 Cassandra。
    • 如果查询将用于日常业务,请使用 Cassandra
    • 如果实时很重要,请使用 Cassandra(我谈到最多 30 秒的延迟,从客户执行操作开始,我可以在仪表板中看到结果)

    • 如果实时无关紧要,请使用 Parquet

    • 如果查询不会每天执行 100 次,请使用 Parquet。
    • 如果要进行批处理,请使用 Parquet

    【讨论】:

    • 感谢您的完整回答。
    • 我有同样的情况,不知道为什么要部署 NoSQL 数据库而不是简单地将数据存储为 Parquet。我们正在处理时间序列数据,用户最终可能会得到 100s TB 的数据。我想将数据摄取到 azure 数据湖存储中,并使用 azure databricks 对其进行处理,然后将数据传递给 Power BI。有同事建议使用时间序列nosql数据库,因为2010年到2018年我们可能有海量数据,查询数据可能需要很长时间。来自平面文件和其他来源的实时和批处理模式的数据
    • @AminMohebi 抱歉我的回复晚了。到目前为止还没有看到它。如果你有钱购买 Azure:去吧。会减轻很多痛苦。如果您需要省钱或有其他不使用 Azure 的充分理由:取决于您要执行的查询。 Cassandra 还可以处理 100s 的 TB,具有良好的主键(分区键 + 列键)和正确的查询。但是您在访问数据的方式上受到高度限制。您还可以在 Cassandra 中复制数据集。这有时是推荐的方式。
    • 但一般来说:如果您之前不知道如何访问数据并且延迟并不那么重要:请使用 Parquet 或 Apache ORC。 (或 HDFS 上的其他内容)。或者,如果您可以支付:一些无服务器解决方案。 Azure、谷歌云、AWS 等
    猜你喜欢
    • 2015-12-11
    • 2018-08-23
    • 2015-12-25
    • 2018-07-08
    • 2016-01-06
    • 2017-06-04
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多