【发布时间】: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