2016-06-14 87 views
3

我已经到了这个困境,我不能选择什么解决方案对我更好。我有一张非常大的桌子(几百个100GB)和几个较小的(几个GB)。为了在Spark中创建我的数据管道并使用Spark ML,我需要连接这些表并执行几个GroupBy(聚合)操作。这些操作对我来说确实很慢,因此我选择了其中一种:Parquet vs Cassandra使用Spark和DataFrame

  • 使用Cassandra并使用索引来加速GoupBy操作。
  • 根据数据的布局使用实木复合地板和分区。

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

如果开发人员推断和理解数据布局以及它将被使用的方式,使用Parquet会不会更好,因为您将拥有更多的控制权?我为什么要为卡桑德拉造成的开销付出代价?

回答

8

在附加到Hawk66 Anwers:

卡桑德拉也是分析用例,但以另一种方式一个很好的解决方案。在建模密钥之前,您必须知道如何读取数据。您也可以使用where和range查询,但要以严格限制的方式使用。有时候你会讨厌这个限制,但是这是有原因的。 Cassandra不像mysql。在MySQL中,性能不是关键特性。这更多的是灵活性和一致性。卡桑德拉是一个高性能的写/读数据库。在写作上比在阅读中更好。 Cassandra也具有线性可伸缩性。

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

  • 你聚集在真正大的,而不是分裂的数据集
  • 你的星火ML招聘听像一个计划,不是长时间运行工作的原始数据。 (一周,一天?)

这更符合Parquete的用例。 Parquete是专门分析和过滤器分析的解决方案。如果您需要每月运行一次或两次查询,Parquete非常好。如果营销人员想知道一件事情,并且响应时间不重要,Parquete也是一个不错的解决方案。简而言之:

  • 如果您知道查询,请使用Cassandra。
  • 使用卡桑德拉如果查询将在日常业务中使用
  • 使用卡桑德拉如果实时事项(一说起最多30秒的延迟,来自客户做一个动作,我可以看到的结果在我的仪表盘)

  • 使用Parquete如果实时不要紧

  • 使用Parquete如果该查询将不执行100X一天。
  • 使用Parquete如果你doint批处理东西
+0

谢谢你的完整答案。 –

2

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

另外Cassandra使得它更容易,如果你不得不处理更新,这不仅是新的数据将被摄入你的数据管道(例如日志),但你也必须关心更新(例如系统必须处理数据更正)

当您的用例需要使用Spark进行分析(并且您不关心上述主题)时,使用Parquet/HDFS应该是可行和便宜的 - 正如您所述。使用HDFS,您还可以使用Spark实现数据本地化,并且如果您正在读取大量数据块,则可能具有分析Spark应用程序更快的优势。

+1

“因为Cassandra是随机存取,而不是阅读大块进行了优化。”这不完全正确。 Cassandra针对写入进行了优化。针对您的特定订单进行优化。在读取级别上,Cassandra针对 连续读取进行了优化。 (在分区键中)在分区键之外它是一个键值存储。 –

+0

嗨菲利普,你是对的,我关于随机访问的评论是不正确的。我已删除该部分。尽管如此,如果只想读大数据中的数据,那么使用HDFS/Parquet可能会有好处,因为您的体系结构/分层被简化了。 – Marco