Контекст
Spark 2.0.1, spark-submit в режиме кластера. Я читаю паркетный файл из hdfs:
val spark = SparkSession.builder
.appName("myApp")
.config("hive.metastore.uris", "thrift://XXX.XXX.net:9083")
.config("spark.sql.sources.bucketing.enabled", true)
.enableHiveSupport()
.getOrCreate()
val df = spark.read
.format("parquet")
.load("hdfs://XXX.XX.X.XX/myParquetFile")
Я сохраняю df
в таблице кустов с 50 сегментами, сгруппированными по userid
:
df0.write
.bucketBy(50, "userid")
.saveAsTable("myHiveTable")
Теперь, когда я смотрю на склад ульев в моих hdfs /user/hive/warehouse
, появляется папка с именем myHiveTable
. Внутри него находится куча файлов part-*.parquet
. Я ожидаю, что там будет 50 файлов. Но нет, есть 3201 файлов !!!! Есть 64 файла на раздел, почему? Существует разное количество файлов на разделы для разных файлов, которые я сохранил как таблицу кустов. Все файлы очень маленькие, всего десятки килобайт каждый!
Позвольте мне добавить, что количество различных userid
составляет около 1 000 000
в myParquetFile
.
Вопрос
Почему в папке 3201 файла, а не 50! Кто они такие?
Когда я читаю эту таблицу обратно в DataFrame и печатаю количество разделов:
val df2 = spark.sql("SELECT * FROM myHiveTable")
println(df2.rdd.getNumPartitions)
Количество разделов - это правильно 50, и я подтвердил, что данные правильно разделены userid
.
Для одного из моих больших наборов данных 3Tb я создаю таблицу с 1000 разделами, которая создала буквально ~ миллион файлов! Который превышает ограничение элемента каталога 1048576 и дает org.apache.hadoop.hdfs.protocol.FSLimitException$MaxDirectoryItemsExceededException
Вопрос
От чего зависит количество создаваемых файлов?
Вопрос
Есть ли способ ограничить количество создаваемых файлов?
Вопрос
Должен ли я беспокоиться об этих файлах? Влияет ли это на производительность df2
, имея все эти файлы? Всегда говорят, что мы не должны создавать слишком много разделов, потому что это проблематично.
Вопрос
Я нашел эту информацию Советы по динамическому разделению HIVE, что число файлов может быть связано с количеством картографов. Рекомендуется использовать distribute by
при вставке в таблицу улья. Как я мог сделать это в Spark?
Вопрос
Если проблема действительно такая, как в приведенной выше ссылке, здесь Как управлять номерами файлов таблицы кустов после вставки данных в MapR-FS, они предлагают использовать такие опции, как hive.merge.mapfiles
или hive.merge.mapredfiles
, чтобы объединить все маленькие файлы после карты уменьшают работу. Есть ли варианты для этого в Spark?