Использование Spark Scala в EMR для получения размера объекта S3 (папка, файлы) - PullRequest
2 голосов
/ 29 мая 2019

Я пытаюсь получить размер папки для некоторых папок S3 с scala из командной строки EMR.

У меня есть данные JSON, хранящиеся в виде файлов GZ в S3. Я считаю, что могу подсчитать количество записей JSON в моих файлах:

spark.read.json("s3://mybucket/subfolder/subsubfolder/").count

Но теперь мне нужно знать, сколько ГБ составляют эти данные.

Я нахожу варианты, чтобы получить размер для отдельных файлов, но не для всей папки.

1 Ответ

3 голосов
/ 29 мая 2019

Я нахожу варианты, чтобы получить размер для отдельных файлов, но не для всей папки.

Решение:


Option1:

Получение доступа к s3 через FileSystem

    val fs = FileSystem.get(new URI(ipPath), spark.sparkContext.hadoopConfiguration)

Примечание:

1) new URI важнов противном случае он подключится к инстаду пути к файловой системе hadoop пути к файловой системе s3 (хранилище объектов :-)).используя новый URI, вы задаете здесь схему s3://.

2) org.apache.commons.io.FileUtils.byteCountToDisplaySize даст размеры файловой системы в гигабайтах и ​​т. д. ...

      /**
    * recursively print file sizes
    *
    * @param filePath
    * @param fs
    * @return
    */
@throws[FileNotFoundException]
@throws[IOException]
  def getDisplaysizesOfS3Files(filePath: org.apache.hadoop.fs.Path, fs: org.apache.hadoop.fs.FileSystem): scala.collection.mutable.ListBuffer[String] = {
    val fileList = new scala.collection.mutable.ListBuffer[String]
    val fileStatus = fs.listStatus(filePath)
    for (fileStat <- fileStatus) {
      println(s"file path Name : ${fileStat.getPath.toString} length is  ${fileStat.getLen}")
      if (fileStat.isDirectory) fileList ++= (getDisplaysizesOfS3Files(fileStat.getPath, fs))
      else if (fileStat.getLen > 0 && !fileStat.getPath.toString.isEmpty) {
        println("fileStat.getPath.toString" + fileStat.getPath.toString)
        fileList += fileStat.getPath.toString
        val size = fileStat.getLen
        val display = org.apache.commons.io.FileUtils.byteCountToDisplaySize(size)
        println(" length zero files \n " + fileStat)
        println("Name    = " + fileStat.getPath().getName());
        println("Size    = " + size);
        println("Display = " + display);
      } else if (fileStat.getLen == 0) {
        println(" length zero files \n " + fileStat)

      }
    }
    fileList
  }

на основепо вашему требованию вы можете изменить код ... вы можете суммировать все файлы округов.

Опция 2 : просто и четко, используя getContentSummary

implicit val spark = SparkSession.builder().appName("ObjectSummary").getOrCreate()
  /**
    * getDisplaysizesOfS3Files 
    * @param path
    * @param spark [[org.apache.spark.sql.SparkSession]]
    */
  def getDisplaysizesOfS3Files(path: String)( implicit spark: org.apache.spark.sql.SparkSession): Unit = {
    val filePath = new org.apache.hadoop.fs.Path(path)
    val fileSystem = filePath.getFileSystem(spark.sparkContext.hadoopConfiguration)
    val size = fileSystem.getContentSummary(filePath).getLength
    val display = org.apache.commons.io.FileUtils.byteCountToDisplaySize(size)
    println("path    = " + path);
    println("Size    = " + size);
    println("Display = " + display);
  } 

Примечание: любая опция, показанная выше, будет работать и для локальных или hdfs или s3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...