gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:59:57 29 4
gpt4 key购买 nike

我正在构建一个需要从 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com