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

如何在Apache Spark中实现任务的动态负载平衡

赵高韵
2023-03-14

考虑以下Java伪代码:

BlockingQueue<Task> q = new LinkedBlockingQueue<Task>();
q.push(myInitialTask);
...
//On each thread:
while (!queue.isEmpty()) {
    Task nextTask = queue.take();
    List<Task> newTasks = process_task_and_split_to_sub_tasks(nextTask);
    queue.pushAll(newTasks);
} 

上面的Java代码将使我的100个线程都处于繁忙状态,假设方法'process_task_and_split_to_sub_tasks()'可以将任何大任务拆分为许多较小的任务。

有没有一种方法可以在Spark中实现同样的功能,可以与其他工具相结合?

    null

在这种情况下,动态负载平衡是这样的:已经收到以'a'开头的行的映射器可能想进一步拆分它的行--到以'ab'、'ac'、'ad'、······然后将它们发送到其他10台机器上,这些机器可能会决定进一步将它们的工作分解为更多的任务。
我知道标准的Apache Spark没有现成的答案,但我想知道是否有一种方法可以实现这一点。

Kafka(即队列,如上)+Spark Streaming看起来很有希望,你认为我能通过使用这些工具以相对简单的方式实现动态负载平衡吗?你能推荐其他工具吗?

共有1个答案

赫连琦
2023-03-14

现在假设我有100台机器(但只有10个字母)。接收到以“A”开头的行的映射器可能希望进一步拆分它的行--拆分到以“AB”、“AC”、“AD”等开头的行,然后将它们发送到其他10台机器。

这不是Spark的工作原理。“mapper”(任务)大多不了解所有分布式上下文。在这个级别上,没有对sparkcontext的访问,我们更多的是rdds,只是作为本地的iterator输入并在其上执行代码。它无法启动,也无法创建新任务。

同时,你的问题定义是人为的。为了找到频繁的模式,您必须聚合数据,因此需要洗牌。在这一点上,对应于给定模式的记录必须被洗牌到同一台机器上。确保数据被正确地分布是partitioner的工作,这里真的没有“拆分”的位置。

 类似资料:
  • 我正在尝试使用前端NGINX 1.6.2负载平衡器来平衡API Manager 1.9.0。我有两台服务器: 服务器A(xxx.xxx.xxx.xx1和xxx.xxx.xxx.x11)-公共和私有IP服务器B(xxx.xxx.xxx.xx2和xxx.xxx.xxx.x22)-公共和私有IP API Manager 1.9.0和所有四个组件都在服务器B上安装和启动。 我在服务器A上安装了NGINX,

  • 我目前正在从服务结构切换到Kubernetes,并想知道如何进行定制和更复杂的负载平衡。 到目前为止,我已经读到库伯内特斯提供“服务”,为隐藏在它们后面的豆荚做负载平衡,但这只能以更简单的方式提供。 我现在要在Service Fabric中重写的内容如下所示: 我有这个界面: 在我的ASP中跟踪帐户的上下文。Net应用程序,例如继承此。然后,我编写了一些代码,到目前为止,这些代码将通过服务结构集群

  • 我使用的是WSO2 470 ESB。我需要使用一个提供自定义负载平衡策略的动态负载平衡endpoint。我知道WSO2是基于apache Synapse的,在此基础上我可以找到以下内容: http://synapse.apache.org/userguide/config.html#dlbendpointconfig 真的吗?是否可以通过我自己的类自定义平衡策略?

  • 我们正在尝试在一个环境中使用nodejs构建一个微服务,其中包含用java/Spring Boot编写的其他微服务。 其他微服务使用consul.io进行服务发现,使用ribbon进行客户端负载平衡。(那将是:spring-boot、spring-cloud-starter-consul-discovery、spring-cloud-starter-feign和spring-cloud-start

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

  • 我需要在 Spring boot java 项目中调度多个任务,并通过从数据库中获取任务执行时间的值并在运行时更新程序中的计划约会来执行任务设置。 澄清用例,我有一个 Rest API,它要求我在endpoint上发出 POST 请求,该请求包含在有关此计划的必要信息正文中,例如任务的时间和要执行的作业,发出请求后,任务在我的程序中调度并在指定的时间执行 我研究了一些技术,这些技术提供了解决方案来