为啥 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 没有在多个节点上重新分配我的数据帧?的主要内容,如果未能解决你的问题,请参考以下文章