gpt4 book ai didi

apache-spark - 为什么在本地模式下加入 spark 这么慢?

转载 作者:行者123 更新时间:2023-12-04 04:12:13 25 4
gpt4 key购买 nike

我在本地模式下使用 spark,一个简单的连接花费的时间太长。我获取了两个数据帧:A(8 列和 230 万行)和 B(8 列和 120 万行)并使用 A.join(B,condition,'left') 加入它们。并最终调用了一个 Action 。它创建了一个具有三个阶段的单个作业,每个阶段用于两个数据帧提取,一个用于加入。令人惊讶的是,提取数据帧 A 的阶段大约需要 8 分钟,而数据帧 B 的提取阶段需要 1 分钟。加入在几秒钟内发生。我的重要配置设置是:

  • spark.master 本地[*]
  • spark.driver.cores 8
  • spark.executor.memory 30g
  • spark.driver.memory 30g
  • spark.serializer org.apache.spark.serializer.KryoSerializer
  • spark.sql.shuffle.partitions 16

  • 唯一的执行者是驱动程序本身。在提取数据帧时,我将其划分为 32 个(也尝试了 16,64,50,100,200)个部分。我已经看到使用数据帧 A 提取的 Stage 的 shuffle 写入内存为 100 MB。所以为了避免洗牌,我为数据帧和广播数据帧 B(较小)做了 16 个初始分区,但这没有帮助。仍然有shuffle write memory。我用过 broadcast(B)为此的语法。 难道我做错了什么?为什么洗牌还在? 此外,当我看到事件时间线时,它显示在任何时间点都只有四个核心正在处理。虽然我有一台 2core*4 处理器的机器。 为什么呢?

    最佳答案

    简而言之,“加入”<=>洗牌,这里的大问题是您的数据在分区上的分布有多均匀(参见例如 https://0x0fff.com/spark-architecture-shuffle/https://www.slideshare.net/SparkSummit/handling-data-skew-adaptively-in-spark-using-dynamic-repartitioning 和谷歌这个问题)。
    提高效率的几种可能性:

  • 多考虑您的数据(A 和 B)并明智地对数据进行分区;
  • 分析,您的数据是否有偏差?
  • 进入 UI 并查看任务计时;
  • 为分区选择这样的键,即在“加入”数据集 A 中只有少数分区与 B 的少数分区混洗时;
  • 关于apache-spark - 为什么在本地模式下加入 spark 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41319295/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com