apache-spark - 将 CSV 文件从 S3 读入 Spark 数据帧是否会如此缓慢?

标签 apache-spark amazon-s3

我正在构建一个需要从 S3 加载数据集的应用程序。该功能运行正常,但性能却出奇的慢。

数据集采用 CSV 格式。每个文件大约有7M条记录(行),每个文件600-700MB。

val spark = SparkSession
       .builder()
       .appName("MyApp")
       .getOrCreate()

val df = spark
     .read
    .option("header", "true") 
    .option("inferSchema", "true") 
    .csv(inFileName:_*)
    // inFileName is a list that current contains 2 file names
    // eg.  s3://mybucket/myfile1.csv

val r = df.rdd.flatMap{ row =>
      /*
       * Discard poorly formated input records 
       */
      try {
        totalRecords.add(1)

        // this extracts several columns from the dataset
        // each tuple of indexColProc specifies the index of the column to
        // select from the input row, and a function to convert
        // the value to an Int
        val coords = indexColProc.map{ case (idx, func) => func( row.get(idx).toString ) }

        List( (coords(0), coords) )
      }
      catch {
        case e: Exception => {    
          badRecords.add(1)
          List()
        }
      }
    }

println("Done, row count " + r.count )

我在 5 台机器的 AWS 集群上运行它,每台机器一个 m3.xlarge。 maximizeResourceAllocation 参数设置为 true,这是集群上运行的唯一应用程序。

我运行了两次应用程序。第一次使用 'inFileName' 指向 S3 上的文件,第二次指向 hadoop 文件系统中文件的本地副本。

当我查看 Spark 历史服务器并深入到与最终 r.count 操作相对应的作业时,我看到访问 s3 上的文件需要 2.5 分钟,而访问 hdfs 上的本地文件需要 18 分钟。当我在较小的集群上或在 master=local 配置中运行相同的实验时,我得到了成比例相似的结果。

当我使用
aws s3 cp <file>

移动一个 600-700MB 的文件只需 6.5 秒。因此,机器实例的原始 I/O 似乎对速度下降的贡献不大。

访问 s3 时是否会出现这种缓慢的性能?如果没有,请有人指出我哪里出错了。如果这是预期的,是否有其他方法可以实现更好的性能?或者我是否需要开发一些东西来在应用程序运行之前简单地将文件从 s3 复制到 hdfs?

最佳答案

经过更多的挖掘,我发现使用 S3 原生有很大的不同。我刚刚将 URI 前缀更改为 s3n://,相关作业的性能从 2.5 分钟下降到 21 秒。所以访问s3 vs hdfs只有3s的惩罚,这是非常合理的。

在搜索此主题时,有很多帖子提到 s3n 的最大文件大小限制为 5GB。然而,我遇到了this这表示最大文件大小限制在 Hadoop 2.4.0 中增加到 5TB。

“不再推荐使用 S3 块文件系统。”

关于apache-spark - 将 CSV 文件从 S3 读入 Spark 数据帧是否会如此缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39759630/

相关文章:

Java Spark-如何以多列作为参数调用 UDF

python - Pandas 无法读取在 PySpark 中创建的 Parquet 文件

c++ - 如何在 C++ 中隐藏我的 AWS S3 访问 key 和 secret ?

java - 用于引用 s3 jar 文件的 Elastic MapReduce libjars 参数

apache-spark - 将 Spark 数据帧转换为 Spark DenseMatrix 进行操作

apache-spark - Databricks Pyspark - 组相关行

scala - 映射 Spark 行中数组的每个值

scala - 在 EMR 中使用 Spark Scala 获取 S3 对象大小(文件夹、文件)

node.js - S3.getSignedUrl 接受多种内容类型

ruby-on-rails - 为 Amazon S3 编写 IAM 策略和 CORS 配置