Каковы были бы причины увеличения количества заданий искры?
Исходя из 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, чтобы выбрать наилучшую комбинацию преобразований и разместить их в своей работе. Создайте самый простой и эффективный алгоритм, необходимый для ответа на вопрос.
Какие версии Spark & Cassandra вы используете? – Gillespie
Мы используем Cassandra 2.1.5 и Spark 1.4.0 –