我正在使用下面的pyspark代码从s3存储桶中读取数千个JSON文件
sc = SparkContext()
sqlContext = SQLContext(sc)
sqlContext.read.json("s3://bucknet_name/*/*/*.json")
这需要花费大量时间来读取和解析JSON文件(约16分钟)。如何并行化或加速该过程?
答案 0 :(得分:2)
至少有两种方法可以加快此过程:
schema
参数以避免架构推断。答案 1 :(得分:1)
简短的答案是:它取决于(取决于基础的基础结构)和数据中的分布(称为歪斜,仅在执行任何会引起随机播放的操作时才适用)。
如果正在运行您发布的代码,例如:AWS的EMR或MapR,则最好优化每个集群节点上的执行器数量,以使每个执行器的核心数量从三到五个。从对S3的读写角度来看,这个数字很重要。
速度缓慢背后的另一个可能原因可能是可怕的公司代理人。如果您对S3服务的所有请求都通过公司代理路由,则后者将成为巨大的瓶颈。最好通过EMR集群上的NO_PROXY
JVM参数绕过代理到S3服务。
此talk from Cloudera及其出色的博客one和two是调优群集的出色介绍。由于我们使用的是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上的许多基础架构优化整合到一个博客中。完成后,将使用链接更新答案。