【问题标题】:Spark runs only one executor for large jobsSpark 只为大型作业运行一个执行器
【发布时间】:2017-04-17 06:16:07
【问题描述】:

我有一个四节点 hadoop 集群(mapr),每个集群有 40GB 内存。我的spark启动参数如下:

MASTER="yarn-client" /opt/mapr/spark/spark-1.6.1/bin/pyspark --num-executors 8 --executor-memory 10g --executor-cores 5 --driver-memory 20g --driver-cores 10 --conf spark.driver.maxResultSize="0" --conf spark.default.parallelism="100"

现在,当我使用 10 万条记录运行我的 spark 作业并运行 results.count() 或 result.saveTable() 时,它会在所有 8 个执行程序上运行。但是,如果我使用 1M 条记录运行作业,则作业将分为 3 个阶段,最后阶段仅在一个执行器上运行。它与分区有关吗?

【问题讨论】:

  • 最后阶段是计数,还是 saveTable,还是别的什么?
  • result.count()情况下Count,result.SaveTable()情况下SaveTable
  • 看起来像数据倾斜问题,您是否使用任何键/值对?

标签: apache-spark pyspark


【解决方案1】:

我通过将我的数据框转换为 rdd 并将其重新分区为大于 500 的大值来解决此问题,而不是使用 df.withColumn()

伪代码:

df_rdd = df.rdd
df_rdd_partioned = df_rdd.repartition(1000)
df_rdd_partioned.cache().count()
result = df_rdd_partioned.map(lambda r: (r, transform(r)), preservesPartitioning=True).toDF()
result.cache()

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多