【问题标题】:Extremely poor performance with Tableau + Spark + CassandraTableau + Spark + Cassandra 的性能极差
【发布时间】:2016-05-21 02:33:50
【问题描述】:

目前我正在研究将 Cassandra 与 Spark 和 Tableau 结合使用进行数据分析的可能性。但是,我目前使用此设置体验到的性能非常差,以至于我无法想象将其用于生产目的。当我读到 Cassandra + Spark 组合的性能必须有多棒时,我显然做错了什么,但我不知道是什么。

我的测试数据:

  • 所有数据都存储在单个节点上
  • 在一个 50MB(间隔数据)的表上执行查询
  • 选择标准中使用的列上有索引

我的测试设置:

  • MacBook 2015、1.1 GHz、8GB 内存、SSD、OS X El Capitan
  • 虚拟盒子,4GB 内存,Ubuntu 14.04
  • 带有 Datastax Enterprise 4.8.4 的单节点:
    • Apache Cassandra 2.1.12.1046
    • Apache Spark 1.4.2.2
    • Spark 连接器 1.4.1
    • Apache Thrift 0.9.3
    • Hive 连接器 0.2.11
  • Tableau(通过 ODBC 连接)

调查结果:

  • 当 Tableau 中的更改需要从数据库加载数据时,它需要 40 秒到 1.4 分钟之间的任何时间。检索数据(这基本上是行不通的)
  • 当我将 Tableau 与 Oracle 而非 Cassandra + Spark 结合使用时,但在同一个虚拟机上,我几乎可以立即获得结果

这是用于查询的表定义:

CREATE TABLE key.activity (
    interval timestamp,
    id bigint,
    activity_name text,
    begin_ts timestamp,
    busy_ms bigint,
    container_code text,
    duration_ms bigint,
    end_location_code text,
    end_ts timestamp,
    pallet_code text,
    src_location_code text,
    start_location_code text,
    success boolean,
    tgt_location_code text,
    transporter_name text,
    PRIMARY KEY (interval, id)
) WITH CLUSTERING ORDER BY (id ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"ALL"}'
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';
CREATE INDEX activity_activity_name_idx ON key.activity (activity_name);
CREATE INDEX activity_success_idx ON key.activity (success);
CREATE INDEX activity_transporter_name_idx ON key.activity (transporter_name);

以下是 Tableau 生成的查询示例:

INFO  2016-02-10 20:22:21 org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation: Running query 'SELECT CASE WHEN 4 >= 0 THEN SUBSTRING(`activity`.`transporter_name`,1,CAST(4 AS INT)) ELSE NULL END AS `calculation_185421691185008640`,
  AVG(CAST(`activity`.`busy_ms` AS DOUBLE)) AS `avg_busy_ms_ok`,
  CAST((MONTH(`activity`.`interval`) - 1) / 3 + 1 AS BIGINT) AS `qr_interval_ok`,
  `activity`.`transporter_name` AS `transporter_name`,
  YEAR(`activity`.`interval`) AS `yr_interval_ok`
FROM `key`.`activity` `activity`
GROUP BY CASE WHEN 4 >= 0 THEN SUBSTRING(`activity`.`transporter_name`,1,CAST(4 AS INT)) ELSE NULL END,
  CAST((MONTH(`activity`.`interval`) - 1) / 3 + 1 AS BIGINT),
  `activity`.`transporter_name`,
  YEAR(`activity`.`interval`)'

这是一个关于 52s 查询的统计示例:

Spark statistics on query taken 52 secs. to complete

我尝试过使用其他帖子中提到的分区键,但没有发现显着差异。我也尝试过启用行缓存(Cassandra 配置 + 表属性),但这也没有任何效果(尽管我可能忽略了那里的一些东西)。

我本来希望开箱即用的性能至少提高 10 到 20 倍,即使不摆弄所有这些参数,我也已经不知道该做什么了。

我做错了什么?我应该期待什么性能?

【问题讨论】:

  • 您能描述一下查询吗?例如,有连接吗?
  • @ChrisGerken 感谢您查看我的问题。我刚刚添加了一个查询示例。所有查询都在单个表上执行(因此没有连接)。

标签: performance apache-spark cassandra tableau-api datastax-enterprise


【解决方案1】:

虽然查询时间确实有点长,但我发现有一些事情可能会导致问题。

我注意到您使用的是 MacBook。漂亮的电脑,但不适合 Spark。我相信那些正在使用双核 Intel M 处理器。如果您转到 Spark Master UI,它会显示可用的内核。它可能显示 4(包括 vCPU)。 您运行此查询的性质不允许大量并行性(如果有)。在这种情况下,您基本上无法获得 Spark 的优势,因为您在一个非常小的 VM 中运行并且您在单个节点上运行(CPU 有限)。可视化工具还没有真正赶上 Spark。

要记住的另一件事是,Spark 并非设计为“即席查询”工具。您可以将 SparkSQL 视为对适当 Spark Ba​​tch 的抽象。以这种规模将其与 Oracle 进行比较,不会产生您期望的结果。 Spark 有一个“最低”性能阈值。一旦您将数据和节点扩展得足够远,您将开始看到完成时间和数据大小不是线性的,并且随着您添加更多数据,处理时间保持相对平稳。

我建议在 SparkSQL REPL dse spark-sql 中尝试该查询,看看您是否得到类似的时间。如果你这样做了,那么你就知道这是你当前设置的最佳选择。如果 Tableau 比 REPL 慢得多,我猜那是他们的结局。

【讨论】:

    【解决方案2】:

    由于您未在帖子中定义变量,因此回答您的问题并不容易。您提到了存储在一个节点上的数据,这很好,但您没有描述您如何构建表/列族。您也没有提到 cassandra 缓存命中率。您还必须考虑 Cassandra 压缩,如果压缩在繁重的读/写操作期间运行,它会减慢速度。

    您似乎还有一个 SSD,在这种情况下,您将在同一个物理驱动器上拥有 Data 目录和 commitlogs 和缓存目录。即使它不是旋转磁盘,您也会看到性能下降,除非您从 commitlogs/cache 目录中拆分数据目录。通过将数据目录拆分到自己的物理 SSD 上,我发现性能提高了 50%。

    另外,最后你还是在 Vbox 的笔记本电脑主机上的虚拟机中运行。您最大的瓶颈是 1.1 GHz CPU。在我在 VMWare 上运行中型作业的 cassandra 环境中,我发现 16GB RAM 上的 4 X 2 核心的 CPU 使用率几乎达到 99%。我的数据目录位于 SSD 上,而我的提交日志和缓存目录位于磁性 HDD 上。我获得了良好的性能,但我调整了我的环境以达到这一点,并且我接受我的非生产环境提供的延迟。

    查看HERE 并尝试更好地了解应该如何使用 Cassandra 以及如何实现开箱即用的更好性能。分布式系统就是这样......分布式的,这是有原因的。单台机器上没有的共享资源。

    希望这能更详细地说明您的目标。

    编辑

    您的表定义看起来不错。您使用的是 Tableau Spark 连接器吗?您的性能问题可能在 cassandra/Spark 方面。

    看看这个article,它描述了从缓存读取时与压缩相关的问题。基本上在 2.1.2 压缩后的 cassandra 版本上,您现在已经丢失了缓存,因为一旦压缩完成,Cassandra 就会将文件(和缓存)扔掉。一旦你开始阅读,你会立即得到一个错过的缓存命中,然后 cassandra 会回到磁盘。这在 2.1.2 以后的版本中已修复。就运行 Spark/Cassandra 而言,其他一切看起来都很正常。

    【讨论】:

    • 谢谢!我刚刚在我的问题中添加了一个 sql 查询和表定义。我在执行查询之前手动运行了压缩,之后没有添加/更改/删除任何数据。一切都在同一个 SSD 上运行,不幸的是,我没有简单的方法来改变它,但感谢您的提示。是的,我意识到我的硬件远非最佳,但我只是想确定解决方案是否可行。浏览您的链接,我仍然觉得奇怪的是,Oracle 在相同的设置中立即返回,而 Spark 似乎需要永远。将进一步研究您的链接...
    • 我编辑了我的答案,看看。尤其是在链接的文章中你的 cassandra 版本
    猜你喜欢
    • 2018-10-05
    • 2011-08-13
    • 2016-07-12
    • 2016-02-10
    • 1970-01-01
    • 2014-12-01
    • 2015-11-10
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多