1

В настоящее время я изучаю возможность использования 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 лучше, даже если вы не играли все эти параметры, и у меня кончились идеи, что делать.

Что я делаю неправильно? Какую производительность я должен ожидать?

+0

Можете ли вы описать запрос? Есть, например, соединение? –

+0

@ChrisGerken спасибо за то, что посмотрел на мою проблему. Я просто добавил пример запроса. Все запросы выполняются в одной таблице (так что нет объединений). – thedutchy

ответ

2

Ответ на ваши вопросы будет непросто из-за переменных, которые вы не определяете в своем сообщении. Вы указываете данные, которые хранятся на одном узле, что хорошо, но вы не описываете, как вы структурировали свои таблицы/столбцы. Вы также не говорите о коэффициентах попадания кэша в кассандру. Вы также должны рассмотреть Cassandra Compaction, если уплотнение работает во время тяжелых операций чтения/записи, это замедлит работу.

У вас также есть один SSD, и в этом случае у вас будут каталоги данных, а также журналы фиксации и кеширования на одном физическом диске. Несмотря на то, что он не является вращающимся диском, вы увидите ухудшенную производительность, если вы не разделите каталог данных из каталогов commitlogs/cache. Я видел 50% -ное увеличение производительности, разбивая Data dir на собственный физический SSD.

Кроме того, наконец, вы работаете в виртуальной машине на ноутбуке в Vbox, тем не менее. Ваше самое узкое место здесь - процессор с тактовой частотой 1,1 ГГц. В моих средах cassandra на VMWare во время выполнения средних заданий я вижу почти 99% использования ЦП на 4 х 2 ядра на 16 ГБ ОЗУ. Мои данные dir (ы) находятся на SSD, в то время как мои транзакционные журналы и кэш-каталоги находятся на магнитном жестком диске. Я получаю хорошую производительность, но я настроил свою среду, чтобы дойти до этой точки, и я согласен с задержкой, которую предоставляют мои производственные среды.

Взгляните на HERE и попытайтесь лучше понять, как использовать Cassandra и как добиться лучшей производительности из коробки. Распределенные системы - это просто .. распределенные и по какой-то причине. Общие ресурсы, которые не доступны на одной машине.

Надеюсь, это объясняет немного больше о том, куда вы направляетесь.

EDIT

Ваше определение таблицы выглядит хорошо. Используете ли вы штепсельную вилку Tableau? Вероятно, ваша проблема с производительностью связана с кассандрой/искрами.

Взгляните на это article, в котором описывается проблема, связанная с уплотнением, при чтении из кеша. В основном на выпуске cassandra до 2.1.2 после уплотнения теперь вы потеряли свой кеш, потому что Cassandra удалил файл (и кеш) после завершения уплотнения. После того, как вы начнете читать, вы сразу получите пропущенный кеш-хит и cassandra, а затем вернется на диск. Это фиксируется в версиях 2.1.2 и выше. Все остальное выглядит нормальным с точки зрения запуска Spark/Cassandra.

+0

Спасибо! Я просто добавил sql-запрос и определение таблицы к моему вопросу. Я выполнил сжатие вручную, прежде чем я выполнил запросы, после чего данные не были добавлены/изменены/удалены. Все работает от того же SSD, к сожалению, нет простого способа изменить это, но спасибо за подсказку. Да, я понимаю, что мое оборудование далеко не оптимальное, но я просто пытаюсь определить, возможно ли решение. Взглянув на вашу ссылку, мне все еще кажется странным, что Oracle немедленно возвращается в ту же самую настройку, пока Spark, кажется, берет навсегда. Изучит вашу ссылку еще ... – thedutchy

+0

Я отредактировал свой ответ, взгляните. особенно в связанной статье по вашей версии cassandra – apesa

0

Хотя время запроса кажется немного высоким, есть несколько вещей, которые я вижу, что может вызвать проблемы.

Я заметил, что вы используете MacBook. Красивый компьютер, но не идеальный для Spark. Я считаю, что они используют двухъядерные процессоры Intel M. Если вы перейдете к своему интерфейсу Spark Master, он покажет вам доступные ядра. Он может отображать 4 (включить vCPU). Характер, в котором вы выполняете этот запрос, не допускает много параллелизма (если есть). В этом случае вы не получаете преимуществ Spark, потому что вы работаете в чрезвычайно маленькой виртуальной машине, и вы работаете на одном узле (с ограниченными процессорами). Инструменты визуализации пока еще не догоняли Spark.

Еще одна вещь, о которой следует помнить, заключается в том, что Spark не разработан как инструмент «adhoc query».Вы можете думать о SparkSQL как о абстракции по правильной партии искры. Сравнивая это с Oracle, в этом масштабе не даст ожидаемых результатов. Существует «минимальный» порог производительности, который вы заметите с помощью Spark. Как только вы масштабируете данные и узлы достаточно далеко, вы начнете видеть, что время до завершения и размер данных не являются линейными, и по мере добавления дополнительных данных время обработки остается относительно плоским.

Предлагаю попробовать этот запрос в SparkSQL REPL dse spark-sql и посмотреть, есть ли у вас похожие времена. Если вы это сделаете, то вы знаете, что это лучшее, что вы получите с вашей текущей настройкой. Если Tableau МНОГО медленнее, чем REPL, я бы предположил, что это что-то на их конце в этот момент.

Смежные вопросы