Apache spark 相同大小但行长度不同的Spark读取性能差异
我使用spark sql读取S3中ORC格式的两个不同数据集。但是,对于几乎相同大小的数据集,读取的性能差异是巨大的 数据集1:包含212000000条记录,每条记录50列,总计达15GB,采用s3存储桶中的orc格式 数据集2:包含29000000条记录,每条记录150列,在同一个s3存储桶中以orc格式总计达15GB 使用spark sql读取数据集1需要2分钟。在相同的基础结构中,使用相同的spark读取/计数作业读取数据集2需要12分钟Apache spark 相同大小但行长度不同的Spark读取性能差异,apache-spark,amazon-s3,apache-spark-sql,performance-testing,Apache Spark,Amazon S3,Apache Spark Sql,Performance Testing,我使用spark sql读取S3中ORC格式的两个不同数据集。但是,对于几乎相同大小的数据集,读取的性能差异是巨大的 数据集1:包含212000000条记录,每条记录50列,总计达15GB,采用s3存储桶中的orc格式 数据集2:包含29000000条记录,每条记录150列,在同一个s3存储桶中以orc格式总计达15GB 使用spark sql读取数据集1需要2分钟。在相同的基础结构中,使用相同的spark读取/计数作业读取数据集2需要12分钟 每行的长度可能会造成如此大的差异。有谁能帮我理解在
每行的长度可能会造成如此大的差异。有谁能帮我理解在读取这些数据集时产生巨大性能差异的原因吗 假设您使用的是s3a:client(而不是amazonemr&它是s3://client) 这关系到seek()的工作量,以及客户机是否对随机IO很在行。本质上:如果您必须关闭HTTP连接并创建一个新连接,seek()比HTTP1.1 GETs要昂贵得多。Hadoop2.8+为此添加了两个特性::Lazy seek和。高性能随机IO 如果您的classopath上有Hadoop 2.8.+JAR,请执行以下操作:
spark.hadoop.fs.s3a.experimental.input.fadvise random
这将影响非随机IO(读取.gz文件等)的性能,但对ORC/Parquet IO性能至关重要
如果您使用的是Amazon EMR,他们的s3客户端是封闭源代码的,恐怕请咨询他们的支持团队。我使用的是Amazon EMR和他们的s3客户端。。我可以试着测试性能吗?注意:数据集1中的文件数量较多(数据集2中的文件数量为220个,数据集1中的文件数量为300个)。我怀疑跳过的数量多于文件数量,尽管您可以尝试更多地拆分文件。测试性能,可能从本地安装Hadoop2.8和spark开始,使用“用户提供的JAR”。。。将其粘贴到VM中,并针对第二个数据集打开和关闭搜索。其他战略。在本地下载并比较文件中的性能:/。。这可能是一个基准测试我认为上面的配置键包含了一个输入错误:我认为这应该是
spark.hadoop.fs.s3a.experiential.input.fadvise
(缺少.input
)。Josh:很好,这对我来说有点尴尬,因为这是我的常数。固定的。