首页 > 解决方案 > PySpark:如何加速 sqlContext.read.json?

问题描述

我正在使用下面的 pyspark 代码从 s3 存储桶中读取数千个 JSON 文件

sc = SparkContext()
sqlContext = SQLContext(sc)
sqlContext.read.json("s3://bucknet_name/*/*/*.json")

这需要花费大量时间来读取和解析 JSON 文件(约 16 分钟)。如何并行化或加速该过程?

标签: apache-sparkamazon-s3pyspark

解决方案


简短的回答是:它取决于(取决于底层基础设施)和数据内的分布(称为偏斜,仅当您执行任何导致洗牌的事情时才适用)。

如果您发布的代码是在 AWS 的 EMR 或 MapR 上运行的,那么最好优化每个集群节点上的执行器数量,使每个执行器的核心数从三到五个。从读写 S3 的角度来看,这个数字很重要。

缓慢背后的另一个可能原因可能是可怕的公司代理。如果您对 S3 服务的所有请求都通过公司代理进行路由,那么后者将成为巨大的瓶颈。最好通过NO_PROXYEMR 集群上的 JVM 参数绕过代理到 S3 服务。

Cloudera的这篇演讲以及他们出色的博客12 是对集群调优的绝佳介绍。由于我们使用sql.read.json的是底层Dataframe将被拆分为由sql.shuffle.paritions 这里描述的纱线参数给出的分区数量。最好将其设置为2 * Number of Executors * Cores per Executor在计算值超过200的集群上,这肯定会加快读取速度

另外,如上面的答案中所述,如果您知道 json 的架构,则设置inferSchematrue.

我还恳请您查看Spark UI并深入研究 DAG 以了解慢速工作。它是 Spark 性能调优的宝贵工具。

我计划将尽可能多的 AWS EMR基础设施优化整合到一个博客中。完成后将使用链接更新答案。


推荐阅读