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

如何在不平衡的执行器工作负载的流转时长重新平衡RDD

钱振
2023-03-14

假设我有一个包含1,000个元素和10个执行器的RDD。现在我用10个分区并行化RDD,并由每个执行器处理100个元素(假设每个执行器1个任务)。

我的困难是,其中一些分区任务可能比其他任务花费的时间要长得多,所以说8个执行器将很快完成,而剩下的2个执行器则将被困在执行时间更长的任务中。因此,主进程将等待2完成后再继续,8将处于空闲状态。

有什么方法可以让无所事事的执行者从忙碌的执行者那里“拿走”一些工作?不幸的是,我无法提前预测哪一个会比其他的更“忙”,所以无法提前适当地平衡RDD。

我能以某种方式让执行程序以编程方式相互通信吗?我想与执行程序共享一个DataFrame,但根据我所看到的,我无法在执行程序中操作DataFrame?

我使用的是火花 2.2.1 和 JAVA

共有1个答案

邓声
2023-03-14

尝试使用 spark 动态资源分配,该分配根据工作负荷上下缩放向应用程序注册的执行程序的数量。

您可以启用以下属性

spark.dynamicAllocation.enabled = true
spark.shuffle.service.enabled = true

您也可以考虑配置以下属性

spark.dynamicAllocation.executorIdleTimeout
spark.dynamicAllocation.maxExecutors
spark.dynamicAllocation.minExecutors

Spark提供了一种机制,可以根据工作负载动态调整应用程序占用的资源。这意味着,如果不再使用资源,应用程序可能会将资源返回集群,并在有需求时再次请求资源。如果多个应用程序共享Spark集群中的资源,此功能尤其有用。

 类似资料:
  • 我有两条溪流。一个是事件流,另一个是数据库更新流。我想用从DB更新流构建的信息丰富事件流。 事件流非常庞大,使用5个字段进行分区。这给了我很好的分配。DB流不那么喋喋不休,并且使用两个字段进行分区。我目前正在使用两个公共字段连接这两个流,并使用flapMap来丰富第一个流。flatMap运算符使用ValueState维护状态,状态由两个公共字段自动键入。 除了实现自定义逻辑来手动提取键并更新维护状

  • 在我创建了traefik守护程序集之后,我在端口80上创建了一个作为负载均衡器的服务,这是Traefik代理端口,节点自动注册到它。如果我点击elb,我得到代理404,这是可以的,因为还没有注册服务 然后,我为web-用户界面创建了一个nodeport服务。pod内的目标端口8080和blosterip上的80。我可以从集群内部卷曲traefik用户界面,它会恢复traefikUI 然后我创建了一

  • 这意味着Zookeeper将负载均衡器理解为一个客户机,并与之建立联系。但是负载均衡器只是ping TCP2181就出来了。

  • 我配置了Google Cloud load balancer和无服务器NEG来让我的app engine在静态IP中工作,但它无论如何都不起作用。下面是我用于配置的命令。 请帮我拿这个。 提前感谢!

  • 我是微服务的新手。(学习阶段)。我有一个问题。我们在云中部署微服务。(例如 AWS)。云已经提供了负载平衡和日志。我们还在Spring Boot中实现了负载平衡(功能区)和日志(Rabbit MQ和Zipkin)。这两种实现有什么区别?我们两者都需要吗?有些人可以回答这些问题吗? 提前感谢。

  • web-service预期会有很多调用,而我希望在出现故障时使该服务成为冗余,因此我希望有两个实例同时运行以处理所有请求。 1)让两个级别的Web服务同时处理请求的最佳方法是什么?使用外部负载均衡器还是使用AKKA/AKKA-HTTP中的某种魔法(我不知道)? 2)我必须调整哪些主要参数来提高性能?