Spark on Cluster: чтение большого количества маленьких файлов avro занимает слишком много времени для отображения - PullRequest
0 голосов
/ 10 июля 2019

Я знаю, что эта проблема чтения большого количества маленьких файлов в HDFS всегда была проблемой и широко обсуждалась, но терпите меня.Большинство проблем переполнения стека, связанных с этим типом проблем, связано с чтением большого количества txt-файлов. Я пытаюсь прочитать большое количество небольших avro-файлов

Кроме того, в этих решениях для чтения txt-файлов рассказывается об использовании WholeTextFileInputFormatили CombineInputFormat (https://stackoverflow.com/a/43898733/11013878), которые являются реализациями RDD, я использую Spark 2.4 (HDFS 3.0.0), и реализации RDD, как правило, не приветствуются, и предпочтительны кадры данных. Я бы предпочел использовать кадры данных, но я также открыт для реализаций RDD.

Я попытался объединить кадры данных, как предложено Муртазой, но на большом количестве файлов я получаю ошибку OOM (https://stackoverflow.com/a/32117661/11013878)

Я использую следующий код

val filePaths = avroConsolidator.getFilesInDateRangeWithExtension //pattern:filePaths: Array[String] 
//I do need to create a list of file paths as I need to filter files based on file names. Need this logic for some upstream process
//example : Array("hdfs://server123:8020/source/Avro/weblog/2019/06/03/20190603_1530.avro","hdfs://server123:8020/source/Avro/weblog/2019/06/03/20190603_1531.avro","hdfs://server123:8020/source/Avro/weblog/2019/06/03/20190603_1532.avro")
val df_mid = sc.read.format("com.databricks.spark.avro").load(filePaths: _*)
      val df = df_mid
        .withColumn("dt", date_format(df_mid.col("timeStamp"), "yyyy-MM-dd"))
        .filter("dt != 'null'")

      df
        .repartition(partitionColumns(inputs.logSubType).map(new org.apache.spark.sql.Column(_)):_*)
        .write.partitionBy(partitionColumns(inputs.logSubType): _*)
        .mode(SaveMode.Append)
        .option("compression","snappy")
        .parquet(avroConsolidator.parquetFilePath.toString)

Потребовалось 1,6 минуты, чтобы перечислить 183 небольших файла на уровне задания Jobs UI

Как ни странно, на моей странице пользовательского интерфейса только 3 с (не понимаю, почему) Stage UI

Файлы avro хранятся в разделах гггг / мм / дд: hdfs: // server123: 8020 / source / Avro / weblog / 2019/06/03

Можно ли как-нибудь ускорить вывод списка листовых файлов, как вы можете из скриншота, только 6 секунд, чтобы собрать файлы паркетных файлов, но 1,3 минуты, чтобы перечислить файлы

...