apache-spark - PySpark:如何加速 sqlContext.read.json?
问题描述
我正在使用下面的 pyspark 代码从 s3 存储桶中读取数千个 JSON 文件
sc = SparkContext()
sqlContext = SQLContext(sc)
sqlContext.read.json("s3://bucknet_name/*/*/*.json")
这需要花费大量时间来读取和解析 JSON 文件(约 16 分钟)。如何并行化或加速该过程?
解决方案
简短的回答是:它取决于(取决于底层基础设施)和数据内的分布(称为偏斜,仅当您执行任何导致洗牌的事情时才适用)。
如果您发布的代码是在 AWS 的 EMR 或 MapR 上运行的,那么最好优化每个集群节点上的执行器数量,使每个执行器的核心数从三到五个。从读写 S3 的角度来看,这个数字很重要。
缓慢背后的另一个可能原因可能是可怕的公司代理。如果您对 S3 服务的所有请求都通过公司代理进行路由,那么后者将成为巨大的瓶颈。最好通过NO_PROXY
EMR 集群上的 JVM 参数绕过代理到 S3 服务。
Cloudera的这篇演讲以及他们出色的博客1和2 是对集群调优的绝佳介绍。由于我们使用sql.read.json
的是底层Dataframe
将被拆分为由sql.shuffle.paritions
这里描述的纱线参数给出的分区数量。最好将其设置为2 * Number of Executors * Cores per Executor
。在计算值超过200的集群上,这肯定会加快读取速度
另外,如上面的答案中所述,如果您知道 json 的架构,则设置inferSchema
为true
.
我还恳请您查看Spark UI并深入研究 DAG 以了解慢速工作。它是 Spark 性能调优的宝贵工具。
我计划将尽可能多的 AWS EMR基础设施优化整合到一个博客中。完成后将使用链接更新答案。
推荐阅读
- javascript - 我正在尝试 HTML5 教程中的 sessionStorage 示例,但它不起作用,并且“右框”部分没有任何变化
- angular - onclick is supposed to open a webpage in angular ionic but it doesnot works
- batch-file - (Batch) 如何检测 Windows 使用的是深色主题还是白色主题?
- c# - System.NullReferenceException:“对象引用未设置为对象的实例。” 这里的问题是什么?
- javascript - 使用 javascript 创建动态列表
- amazon-web-services - 如何从位于 Terraform 中不同模块的另一个 main.tf 文件中引用 id 值
- java - Kotlin:从方法返回泛型类型?
- java - 哪个更适合创建 JAVA Springboot Rest Endpoint 以上传文件 - 多部分文件与 POST 正文中的 base 64 编码字节数组
- android - 是否可以以编程方式预加载共享库?
- ios - AudioToolBox AudioConverterFillComplexBuffer 实现文件不存在