为什么 Spark 没有在多个节点上重新分配我的数据帧?

Tha*_*Guy 5 apache-spark apache-spark-sql pyspark

我有 128 个核心、8 个节点、每个节点 186Gb 内存。

我有从 jdbc 源加载的数据帧 (Df)。它有一个分区。然后我打电话:

c = Df.repartition(128*3).cache().count()
Run Code Online (Sandbox Code Playgroud)

应用程序 Web UI 显示缓存的 rdd 有 384 个分区,但全部位于一个节点(我们称之为节点 1)上,RAM 大小为 57Mb。

当我查看计数阶段时,我看到 384 个任务,全部在节点 1 上执行。

为什么 Spark 不将数据帧均匀分布在所有节点上?

我在 pycharm 中运行这个。以下是我设置的配置值:

spark = SparkSession \
        .builder \
        .master("spark://sparkmaster:7087") \
        .appName(__SPARK_APP_NAME__) \
        .config("spark.executor.memory", "80g") \
        .config("spark.eventlog.enabled", "True") \
        .config("spark.eventlog.dir", r"C:\Temp\Athena\UAT\Logs") \
        .config("spark.cores.max", 128) \
        .config("spark.sql.crossJoin.enabled", "True") \
        .config("spark.executor.extraLibraryPath","/net/share/grid/bin/spark/UAT/bin/vertica-jdbc-8.0.0-0.jar") \
        .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \
        .getOrCreate()
Run Code Online (Sandbox Code Playgroud)

这是我的火花属性

在此输入图像描述

Tha*_*Guy 0

好吧,这似乎是一个优化。简单地在数据帧上调用重新分区似乎不会导致它跨节点分布,因为 Spark 认为不需要这样做。我猜可以节省随机播放...