为啥 spark 没有在多个节点上重新分配我的数据帧?

Posted

技术标签:

【中文标题】为啥 spark 没有在多个节点上重新分配我的数据帧?【英文标题】:Why is spark not repartioning my dataframe over multiple nodes?为什么 spark 没有在多个节点上重新分配我的数据帧? 【发布时间】:2016-11-14 12:04:21 【问题描述】:

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

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

c = Df.repartition(128*3).cache().count()

应用程序 Web UI 显示缓存的 rdd 具有 384 个分区,但所有分区都位于一个节点(我们称之为节点 1)上,内存大小为 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()

这是我的火花属性

【问题讨论】:

如何提交/执行 Spark 应用程序?你是独立使用纱线还是火花? Spark 独立集群。我的驱动程序位于开发人员工作站上。它具有合理的规格(12 核,64Gb 内存) 你能提供你的 spark-submit 命令吗? 很遗憾,我的公司不喜欢员工发布代码... :-( 你有什么特别想检查的吗? 重新分区后还需要指定执行器的数量、每个执行器的核心数和每个执行器的内存,以将分区/任务分配到不同的节点。 【参考方案1】:

这里我们指定资源和应用程序的详细信息 提交申请时的详细信息

./bin/spark-submit \
      --class org.apache.spark.examples.SparkPi \
      --master spark://207.184.161.138:7077 \
      --deploy-mode cluster \
      --supervise \
      --executor-memory 20G \
      --total-executor-cores 100 \
      /path/to/examples.jar \

【讨论】:

【参考方案2】:

好的,所以这似乎是一个优化。简单地在数据帧上调用 repartition 似乎不会导致它在节点之间分布,因为 spark 决定不需要它。我猜会保存随机播放...

【讨论】:

以上是关于为啥 spark 没有在多个节点上重新分配我的数据帧?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Spark2 只在一个节点上运行?

Spark的shuffle剖析!

为啥文件拆分的大小不会随着我重新分区数据而减少?

Spark设备上没有剩余空间

为啥 C++ 分配器中没有重新分配功能?

从Spark limit()函数重新分区数据帧