【问题标题】:Spark Databricks ultra slow read of parquet filesSpark Databricks 对镶木地板文件的超慢读取
【发布时间】:2021-08-27 03:03:22
【问题描述】:

配置:

火花 3.0.1

Cluster Databricks(Driver c5x.2xlarge, Worker (2) 同驱动)

来源:S3

格式:镶木地板

大小:50 mb

文件数:2000(太多小文件,因为它们从 kinesis 流中以 1 分钟的批次转储,因为我们不能有更多的延迟 99)

问题陈述:我有 10 个作业,它们的配置和处理的数据量与上述相似。当我单独运行它们时,它们每个需要 5-6 分钟,包括集群启动时间。

但是当我一起运行它们时,它们似乎都卡在代码中的同一点,需要 40-50 分钟才能完成。

当我检查 spark UI 时,我看到,所有作业都花费了 90% 的时间来计算源数:

df = spark.read.parquet('s3a//....') df.cache() df.count() ----- 有问题的步骤....更多代码逻辑

现在我知道在进行缓存之前进行计数对于镶木地板文件应该更快,但是如果我在计数之前不缓存数据帧,它们会花费更多时间,这可能是因为小文件数量巨大。

但我不明白的是,一次运行一项作业如何运行得更快?

S3 是我的瓶颈吗?它们都从同一个存储桶中读取,但路径不同。

** 我正在使用 privecera 令牌进行身份验证。

【问题讨论】:

    标签: apache-spark amazon-s3 databricks parquet


    【解决方案1】:
    1. 它们都将在工作节点中使用相同的 s3a 文件系统类实例,有一些关于 #of HTTP 连接的选项,fs.s3a.connection.maximum,默认为 48。如果所有工作都针对同一个存储桶,将其设置为工作线程数的 2 倍以上。对“fs.s3a.max.total.tasks”执行相同操作。

    2. 如果使用 hadoop 2.8+ 二进制文件,则将 s3a 客户端切换到随机 IO 模式,这在寻找 parquet 文件时提供最佳性能,fs.s3a.experimental.fadvise = random。

    更改 #2 应该可以提高单个工作负载的速度,所以无论如何都要这样做

    限制将显示为 503 响应,这些响应在 AWS 开发工具包中处理,不会被收集/报告。我建议至少在调试时打开 S3 存储桶日志记录,并扫描日志以查找 503 响应,这表明正在发生限制。这就是我所做的。提示:设置删除旧日志的规则,从而降低成本; 1-2 周的日志对我来说通常就足够了。

    最后,很多小文件在 HDFS 上都很糟糕,对象存储很糟糕,因为列出/打开的时间太长了。尝试在处理数据时将文件合并为步骤 #1

    【讨论】:

    • 关于第一点,您要求将其设置为 2x+工作线程数。我有 2 个工人,每个工人有 4 个核心。那么我应该将其设置为 2*48 + 2*4 = 104 吗?这些好看吗? "fs.s3a.connection.maximum":"104", "fs.s3a.max.total.tasks":"104", "fs.s3a.threads.max":"50",
    • 是的 - 或者只是将它们设置为 104。 FWIW 在 hive 部署中,我们将连接数设置为 1500。这很多,但是当我们知道所有工作人员都在同一个存储桶上时,它会消除连接数作为瓶颈
    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2019-08-04
    • 2022-06-16
    • 2020-08-15
    • 1970-01-01
    相关资源
    最近更新 更多