Как установить количество разделов/узлов при импорте данных в Spark

Проблема: Я хочу импортировать данные в Spark EMR из S3, используя:

data = sqlContext.read.json("s3n://.....")

Есть ли способ установить количество узлов, которые Spark использует для загрузки и обработки данных? Это пример того, как я обрабатываю данные:

data.registerTempTable("table")
SqlData = sqlContext.sql("SELECT * FROM table")

Контекст. Данные не слишком большие, требуется много времени для загрузки в Spark, а также для запроса. Я думаю, что Spark разбивает данные на слишком много узлов. Я хочу иметь возможность установить это вручную. Я знаю, имея дело с RDD и sc.parallelize, я могу передать количество разделов в качестве ввода. Кроме того, я видел repartition(), но я не уверен, может ли он решить мою проблему. Переменная data - это DataFrame в моем примере.

Позвольте мне определить раздел более точно. Определение одно: обычно называемое "ключ раздела", где столбцы выбираются и индексируются для ускорения запроса (это не то, что я хочу). Определение два: (вот где моя проблема), предположим, что у вас есть набор данных, Spark решает, что он собирается распространять его на многих узлах, чтобы он мог выполнять операции над данными параллельно. Если размер данных слишком мал, это может еще больше замедлить процесс. Как я могу установить это значение

Ответ 1

По умолчанию он разбивается на 200 наборов. Вы можете изменить его, используя команду set в sql context sqlContext.sql("set spark.sql.shuffle.partitions=10");. Однако вам необходимо установить его с осторожностью, основываясь на ваших данных.

Ответ 2

Вы можете вызвать repartition() на фрейме данных для установки разделов. Вы можете даже установить spark.sql.shuffle.partitions это свойство после создания контекста куста или перехода к jar:

spark-submit .... --conf spark.sql.shuffle.partitions=100

или же

dataframe.repartition(100)

Ответ 3

Количество "входных" разделов фиксируется конфигурацией файловой системы.

1 файл 1Go с размером блока 128M даст вам 10 задач. Я не уверен, что вы можете изменить его.

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

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