PySpark:如何加快sqlContext.read.json的速度?

时间:2018-06-20 22:32:21

标签: apache-spark amazon-s3 pyspark

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

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

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

2 个答案:

答案 0 :(得分:2)

至少有两种方法可以加快此过程:

  • 如果可以,请避免在路径中使用通配符。如果可能,请提供要加载的路径的完整列表。
  • 提供schema参数以避免架构推断。

答案 1 :(得分:1)

简短的答案是:它取决于(取决于基础的基础结构)和数据中的分布(称为歪斜,仅在执行任何会引起随机播放的操作时才适用)。

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

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

talk from Cloudera及其出色的博客onetwo是调优群集的出色介绍。由于我们使用的是sql.read.json,因此下面的Dataframe将被划分为纱线参数sql.shuffle.paritions described here给定的分区数。最好将其设置为2 * Number of Executors * Cores per Executor。在计算值超过 200

的群集上,这肯定会加快读取速度

此外,如上面的答案中所述,如果您知道json的架构,则当inferSchema设置为true时,它可以加快处理速度。

我也恳请您查看Spark UI,并深入研究DAG中的慢速工作。这是在Spark上进行性能调整的宝贵工具。

我计划将AWS的EMR上的许多基础架构优化整合到一个博客中。完成后,将使用链接更新答案。