Почему размеры разделенных файлов не уменьшаются при перераспределении данных?

Я запускаю пакетное задание Spark, которое обрабатывает большой (51 ГБ) XML-файл с использованием spark-xml источника данных. Я запускаю локально на своей машине.

Я хочу использовать все свои ядра (8), но я хочу, чтобы размер каждой задачи был небольшим, чтобы общий объем оперативной памяти, используемой всеми задачами, не превышал доступный объем.

Итак, я использовал repartition следующим образом:

val df: DataFrame = spark.sqlContext.read
  .option("mode", "FAILFAST")
  .format("com.databricks.spark.xml")
  .schema(customSchema)
  .option("rowTag", "row")
  .load(s"$pathToInputXML")
  .repartition(30)

Поэтому я подумал, что каждая задача будет обрабатывать около (51 ГБ / 30 разделов / 8 ядер) == 212 МБ на задачу.

Дело в том, что размер каждой задачи составляет всего 33 МБ, как видно из вывода:

17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:0+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:134217728+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:33554432+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:234881024+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:201326592+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:100663296+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:167772160+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:67108864+33554432

Может ли кто-нибудь объяснить это мне? Почему размер разделения файла не меняется при изменении количества разделов?


person Felipe    schedule 28.04.2017    source источник
comment
Попробуйте coalesce(30) вместо repartition(30). repartition создаст перемешивание.   -  person zsxwing    schedule 29.04.2017
comment
Кстати, я думаю, что разделение входных данных всегда будет одинаковым. Вы должны проверить номер задачи.   -  person zsxwing    schedule 29.04.2017
comment
@zsxwing Понятно. Пожалуйста, добавьте ответ тогда.   -  person Felipe    schedule 29.04.2017


Ответы (1)


Почему размер разделения файла не меняется при изменении количества разделов?

Потому что repartitioning не влияет на разделение ввода. Ваш код перемешивает данные после их загрузки в Spark.

Если вы хотите изменить количество разделенных входных данных, вам следует настроить параметр spark.sql.files.maxPartitionBytes.

person zero323    schedule 29.04.2017