Я запускаю пакетное задание 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
Может ли кто-нибудь объяснить это мне? Почему размер разделения файла не меняется при изменении количества разделов?
coalesce(30)
вместоrepartition(30)
.repartition
создаст перемешивание. - person zsxwing   schedule 29.04.2017