2015-09-08 2 views
2

Я новичок в Spark и Cassandra.Задачи искры с Cassandra

Мы используем Spark на вершине Кассандры для чтения данных, так как у нас есть требование читать данные, используя столбцы непервичного ключа.

Одно наблюдение - количество задач для искровой работы, увеличивающей рост данных w.r.t. Из-за этого мы сталкиваемся со многими задержками в получении данных.

Каковы будут причины увеличения числа заданий искры?

Что следует учитывать для повышения производительности в Spark с Cassandra?

Пожалуйста, предложите мне.

Благодаря,
Mallikarjun

+0

Какие версии Spark & ​​Cassandra вы используете? – Gillespie

+0

Мы используем Cassandra 2.1.5 и Spark 1.4.0 –

ответ

3

Разделение размер входного контролируется конфигурацией spark.cassandra.input.split.size_in_mb. Каждый раскол будет генерировать задачу в Spark, поэтому чем больше данных в Cassandra, тем больше времени потребуется для обработки (что и следовало ожидать)

Чтобы повысить производительность, убедитесь, что вы выравниваете разделы с помощью joinWithCassandraTable. Не используйте context.cassandraTable(...), если вам абсолютно не нужны все данные в таблице и оптимизируйте полученные данные с помощью select, чтобы проецировать только те столбцы, которые вам нужны.

Если вам нужны данные из ряда строк, имеет смысл построить вторичную таблицу, в которой хранится идентификатор этих строк.

Вторичные индексы также могут помочь выбрать подмножества данных, но я видел сообщения о том, что они не очень эффективны.

1

Каковы были бы причины увеличения количества заданий искры?

Исходя из maasgs ответа, а не устанавливая spark.cassandra.input.split.size_in_mb. на SparkConf, это может быть полезно использовать конфигурации ReadConf при чтении из различных keyspaces/центров обработки данных в одном месте:

val readConf = ReadConf(
     splitCount = Option(500), 
      splitSizeInMB = 64, 
      fetchSizeInRows = 1000, 
      consistencyLevel = ConsistencyLevel.LOCAL_ONE, 
      taskMetricsEnabled = true 
     ) 

    val rows = sc.cassandraTable(cassandraKeyspace, cassandraTable).withReadConf(readConf) 

Что следует учитывать для повышения производительности в Spark с помощью Cassandra?

Что касается увеличения производительности, это будет зависеть от выполняемых вами заданий и требуемых типов преобразований. Ниже приводятся некоторые общие рекомендации по максимизации производительности Spark-Cassandra (как можно найти here).

Ваш выбор операций и порядок их применения имеют решающее значение для производительности.

Необходимо организовать процессы с распределением задач и памятью.

Прежде всего, необходимо определить, правильно ли распределены данные. Раздел в этом контексте является всего лишь блоком данных. Если возможно, разделите свои данные до того, как Spark даже поглотит его.Если это нецелесообразно или возможно, вы можете переделать данные сразу после загрузки. Вы можете перераспределить, чтобы увеличить количество разделов или объединиться, чтобы уменьшить количество разделов.

Число разделов должно, как нижняя граница, быть не менее 2x количества ядер, которые будут работать с данными. Сказав это, вы также захотите убедиться, что любая выполняемая вами задача занимает не менее 100 мс, чтобы оправдать распределение по сети. Обратите внимание, что перераспределение всегда вызывает перетасовку, где coalesce обычно не будет. Если вы работали с MapReduce, вы знаете, что перетасовка - это то, что занимает большую часть времени в реальной работе.

Фильтровать рано и часто. Предполагая, что источник данных не предварительно обработан для восстановления, самое раннее и лучшее место, чтобы уменьшить количество искрообразования данных, необходимо обработать в исходном запросе данных. Это часто достигается добавлением предложения where. Не приносите никаких данных, необходимых для получения целевого результата. Привлечение любых дополнительных данных повлияет на то, сколько данных можно перетасовать по сети и записать на диск. Без необходимости перемещать данные - это реальный убийца, и его следует избегать любой ценой

На каждом шаге вы должны искать возможности для фильтрации, различения, уменьшения или суммирования данных как можно больше до начала операции.

Используйте трубопроводы как можно больше. Трубопроводы представляют собой серию преобразований, которые представляют собой независимые операции над куском данных и не требуют реорганизации данных в целом (перетасовка). Например: карта из строки -> длина строки независима, где сортировка по значению требует сравнения с другими элементами данных и реорганизации данных по сети (перетасовка).

В заданиях, требующих перетасовки, посмотрите, можете ли вы использовать частичную агрегацию или сокращение до шага в случайном порядке (аналогично объединителю в MapReduce). Это уменьшит перемещение данных во время фазы перетасовки.

Некоторые общие задачи, которые являются дорогостоящими и требуют перетасовки, - это сортировка, группировка по ключу и уменьшение по ключу. Эти операции требуют сравнения данных с другими элементами данных, которые являются дорогостоящими. Важно хорошо изучить Spark API, чтобы выбрать наилучшую комбинацию преобразований и разместить их в своей работе. Создайте самый простой и эффективный алгоритм, необходимый для ответа на вопрос.

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