为什么在本地模式下在Spark上加入如此慢



我在本地模式下使用火花,而一个简单的联接花费太长。我获取了两个数据范围:A(8列和230万行)和B(8列和120万行),并使用A.join(B,condition,'left')加入它们,并终于打了一个操作。它创建一个具有三个阶段的作业,每个作业都用于两个数据范围提取,一个用于加入。出乎意料的是,提取数据框架A的阶段大约需要8分钟,而数据框架B的时间为1分钟。加入发生在几秒钟内。我重要的配置设置是:

  1. spark.master local [*]
  2. Spark.Driver.Cores 8
  3. spark.executor.memory 30g
  4. Spark.Driver.Memory 30G
  5. spark.serializer org.apache.spark.serializer.kryoserializer
  6. spark.sql.shuffle.partitions 16

唯一的执行人是驱动程序本身。在提取数据框架时,我将其划分为32个(也尝试过16,64,50,100,200)零件。我已经看到Shuffle写入内存为100 MB,用于dataframe a提取。因此,为避免洗牌,我为数据范围和广播的数据框架B(较小)进行了16个初始分区,但这无济于事。仍然有洗牌写入记忆。我为此使用了broadcast(B)语法。我做错了吗?为什么还在那里进行改组?尽管我有2台处理器*4处理器机。为什么这样?

简而言之," join"< =>改组,这里的最大问题是您的数据在分区上分配了多么均匀(例如,请参见https://0x0fff.com/spark-com/spark-----Architecture-shuffle/,https://www.slideshare.net/sparksummit/handling-data-skew-aptaptimed-in-spark-spark-spark-s----------------------提高效率的可能性很少:

  • 明智地考虑您的数据(A和B)和分区数据;
  • 分析,您的数据是否偏向?;
  • 进入UI并查看任务计时;
  • 为分区选择此类键,这些键在"加入"数据集中只有很少的ban shuffle中,几乎没有b的分区;

相关内容

  • 没有找到相关文章

最新更新