当前位置: 首页 > 知识库问答 >
问题:

spark正在单个执行器上运行具有多个分区的作业

洪建茗
2023-03-14

我有一个Spark 2.1.1作业,正在Mesos集群中运行。Spark UI显示32个活动执行器和RDD。getNumPartitions显示28个分区。但只有一个(随机)执行者在做任何工作,所有其他执行者都标记为已完成。我向执行器代码(stdout)添加了调试语句,只有一个执行器显示这些语句。整个管道的结构如下:获取ID列表-

stage 1: val ids=session.sparkContext.textFile(path).repartition(28) -> RDD[String]

//ids.getNumPartitions shows 28
stage 2: val json=ids.mapPartitions { keys =>
  val urlBuilder ...
  val buffer ....
  keys map { key =>
    val url=urlBuilder.createUrl(id) //java.net.URL
    val json=url.openStream() ... //download text to buffer, close stream
    (id,json.toString)
  }
} -> RDD[Tuple2[String,String]]

stage 3: val output = json flatMap { t =>
  val values = ... //parse JSON, get values from JSON or empty sequence if not found
  values map { value => (t._1, value) }
} -> RDD[Tuple2[String,String]]

stage 4: output.saveAsTextFile("s3://...")

这些是Spark二进制文件的配置设置:--drive-内存32g--confspark.driver.cores=4--execort-内存4g--confspark.cores.max=128--confspark.executor.cores=4

仅在一个执行器上运行的阶段是第二个阶段。我在第一步中明确指定了分区数(重新分区(28))。以前有人见过这种行为吗?谢谢

M

解决方案

我走了另一条路(参见Travis的建议),将分区的数量(在步骤1之后)增加到100个。这项工作奏效了,几分钟内就完成了。但是有一个副作用——现在我有100个部分文件放在S3中。

共有1个答案

邴俊民
2023-03-14

确保在“获取id列表”之后发生您的. re分区()阶段。

听起来像是先生成一个包含28个分区的空集,然后将ID列表放入一个分区中。

提供示例代码后编辑:

是否可能每个任务都很快完成(即在几秒钟内)?我见过spark在短时间内完成任务时,即使有数千个未完成的任务,也不会将任务安排给空闲的执行者。如果是这样的话,您可能需要更少的分区来让每个任务花费更长的时间。有时,这足以触发任务调度器将更多任务调度给空闲的执行者。

 类似资料:
  • 我试图设置一个独立的Spark2.0服务器来并行处理分析功能。为此,我希望有一个带有多个执行者的工作人员。 我在使用: 独立Spark 2.0 8核 24gig ram Windows server 2008 pyspark(尽管这看起来不相关)

  • 我有一个spark作业,它从数据库中读取数据,执行过滤、联合、2连接,最后将结果写回数据库。 然而,最后一个阶段仅在50个执行器中的一个执行器上运行一个任务。我试图增加分区的数量,使用哈希分区,但没有成功。 经过几个小时的谷歌搜索,似乎我的数据可能会但我不知道如何解决它。 有什么建议吗? 规格: < li >独立群集 < li>120核心 < li>400G内存 遗嘱 执行 人: 30个执行器(4

  • -第一种方法 所有的查询都可以存储在一个配置单元表中,我可以编写一个Spark驱动程序来一次读取所有查询,并使用java多线程并行运行所有查询(与HiveContext一起 优点:易于维护 缺点:可能会占用所有资源,并且对每个查询进行性能优化可能会很困难。 使用oozie spark操作单独运行每个查询 优点:可以在查询级别进行优化 缺点:难以维护。 我找不到任何关于第一种方法的文档,说明Spar

  • 一个spark有一个oracle查询。所以我必须并行运行多个作业,以便所有查询都将同时激发。 如何并行运行多个作业?

  • 一个executor在Spark中可以容纳多少个分区? 如何在执行程序之间分配分区(机制)? 如何设置分区的大小。想知道相关的config参数。 executor是否将所有分区存储在内存中?如果不是,当溢出到磁盘时,它是溢出整个分区到磁盘还是部分分区到磁盘?5当每个执行器有2个内核,但执行器中有5个分区时

  • 我正在使用loadrunner控制器11和load generator,容量为400个用户。 当在控制器中执行脚本时,我看到对于每个脚本,相应的mmdrv在任务管理器中运行,也就是说,如果有10个脚本在执行,则有10个mmdrv在运行。 协议:Web HTTP/HTML协议。