В настоящее время я изучаю возможность использования Cassandra в сочетании с Spark и Tableau для анализа данных. Тем не менее, производительность, которую я в настоящее время испытываю при такой настройке, настолько плоха, что я не могу представить ее для использования в производственных целях. Поскольку я читаю о том, насколько велика производительность комбинации Cassandra + Spark, я, очевидно, что-то делаю неправильно, но я не могу понять, что.Чрезвычайно плохая производительность с Tableau + Spark + Cassandra
Мои тестовые данные:
- Все данные хранятся на одном узле
- Запросы выполняются на одном столе с 50Мб (данные интервала)
- Столбцы, используемые в критериях выбора имеют индекс на это
Моя установка теста:
-
444 +42760359211350144688888 MacBook 2015, 1,1 ГГц, 8 Гб памяти, SSD, OS X El Capitan
- Virtual Box, 4 Гб памяти, Ubuntu 14,0
- Single остроумие узел Datastax Enterprise 4.8.4:
- Apache Cassandra 2.1.12.1046
- Apache Spark 1.4.2.2
- Спарк Connector 1.4.1
- Apache Бережливость 0.9.3
- Hive Connector 0.2.11
- Tableau (подключен через ODBC)
Результаты:
- Когда изменение в Tableau требует загрузки данных из базы данных, она занимает где-то между 40 и 1,4 мин. для получения данных (которая в основном неосуществимым)
- Когда я использую Tableau в сочетании с Oracle вместо Cassandra + Спарк, но на том же виртуальном поле, я получаю результаты почти мгновенно
Вот таблица определение, используемое для запросов:
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 config + table), но это также не имело никакого эффекта (хотя, возможно, я что-то упустил).
Я бы предпочел получить хотя бы коэффициент 10x-20x лучше, даже если вы не играли все эти параметры, и у меня кончились идеи, что делать.
Что я делаю неправильно? Какую производительность я должен ожидать?
Можете ли вы описать запрос? Есть, например, соединение? –
@ChrisGerken спасибо за то, что посмотрел на мою проблему. Я просто добавил пример запроса. Все запросы выполняются в одной таблице (так что нет объединений). – thedutchy