标签: distributed-computing

如何查看 Spark 独立集群的聚合日志

当 Spark 在 Yarn 上运行时,在 Spark 作业完成后,我可以简单地使用 yarn -logs -applicationId appId 来查看聚合日志。Spark 独立集群的等效方法是什么?

logging distributed-computing apache-spark

5
推荐指数
1
解决办法
6306
查看次数

网络断开后,raft follower如何重新加入?

我在木筏上遇到了问题。

在论文《寻找一种可理解的共识算法(扩展版)》中写道:

要开始选举,追随者会增加其当前任期并过渡到候选状态。(第 5.2 节)

它还说:

AppendEntries RPC 和 RequestVot RPC 中的接收者应为“Reply false if args.term < currentTerm”

所以,让我们想象一下这个场景,raft系统中有5台机器,现在机器0是leader,机器1到4是follower,现在是term 1。突然,机器1断开网络,然后机器1超时,并且它开始选举领导者,它发送RequestVot RPC,肯定会失败(网络断开)。然后它将开始新的领导者选举......等等。机器1的项是增加很多倍。也许增加到10。当机器1'Term增加到10时,它连接了网络。领导者(机器0)向机器1发送心跳,机器1将拒绝该心跳(机器0的期限小于机器1),现在机器1将无法重新加入系统。

distributed-computing distributed-system raft

5
推荐指数
1
解决办法
777
查看次数

对于非阻塞发送和阻塞接收是否仍然需要等待

我知道如果双方都是非阻塞发送和接收,那么就需要MPI_Waitor 。MPI_Test但我想知道如果我们混合非阻塞发送和阻塞接收,MPI_Wait考虑到阻塞接收可以确保通信完成,我还需要调用吗?

communication distributed-computing mpi

5
推荐指数
1
解决办法
520
查看次数

CQRS--乱序消息

假设我们有 3 个不同的服务生成事件,每个服务都发布到自己的事件存储。

这些服务中的每一个都会消耗其他生产者服务事件。这是因为每个服务都必须处理另一个服务的事件并创建自己的投影。每个服务都在多个实例上运行。

(对我来说)最直接的方法是在每个 ES 前面放置“一些东西”,它正在挑选事件并将它们发布(发布/订阅)到每个其他服务的队列中。

这是完美的,因为每个服务都可以订阅它喜欢的每个主题,而事件发布者正在执行这项工作,并且如果服务不可用,事件仍然会传递。在我看来,这保证了高可扩展性和可用性。

我的问题是队列。我无法获得一个可轻松扩展的队列来保证消息的排序。它实际上保证了至少一次交付的“轻微失序”:需要明确的是,它是 AWS SQS。

因此,排序问题是:

  • 不保证同一事件流中的事件之间的顺序。
  • 不保证来自同一 ES 的事件之间的顺序。
  • 不保证来自不同 ES(不同服务)的事件之间的顺序。

我想我可以通过跟踪来自同一 ES 的事件的“序列号”来解决前两个问题。这可以通过跟踪我们消费事件的每个主题的最后一个序列号来完成。这应该很容易对事件做出反应并构建我们的投影。然后,当我从队列中弹出一个事件时,如果eventSequenceNumber > previousAppliedEventSequenceNumber + 1我将其重新排队(或使其在一段时间内不可见)。

但事实证明,使用这个解决方案,当事件以高速率产生时,它会破坏性能(我可以使用可见性超时或其他东西,结果应该是相同的)。

这是因为当我期待事件 10 并暂时忽略事件 11 时,我还应该忽略序列号在事件 11 之后的所有事件(来自 ES),直到事件 11 再次出现并得到有效处理。

其他困难是:

  • 在哪里跟踪事件的序列号以构建投影。
  • 如何跟踪事件的序列号以构建投影,以便在应用它时,我有一个一致的lastSequenceNumber.

我缺少什么?

PS:对于第三个问题,请考虑以下场景。我们有 aUserService和 a CartService。它CartService有一个投影,每个用户都可以跟踪购物车中的产品。UserCreated每个购物车的投影还必须包含来自.NET 发布的事件的用户名和其他信息UserService。如果UserCreated出现在ProductAddedToCart正常流程之后,则需要抛出异常,因为用户尚不存在。

distributed-computing cqrs event-sourcing microservices

5
推荐指数
1
解决办法
1789
查看次数

Dask add_done_callback 与其他参数?

我希望在未来完成后添加回调。

根据文档:

当回调完成时,调用未来的回调。

回调 fn 应该将 future 作为其唯一的参数。无论 future 是否成功完成、出错或被取消,都会调用此函数。

回调在单独的线程中执行。

这并没有为我提供我需要的东西,因为回调 fn 需要将 future 作为其唯一的参数。

这是我要做的事情的示例部分代码:

def method(cu_device_id):
    print("Hello world, I'm going to use GPU %i" % cu_device_id)

def callback_fn(cu_device_id)
    gpu_queue.put(cu_device_id)

cu_device_id = gpu_queue.get()
future = client.submit(method, cu_device_id)
#gpu_queue.put(cu_device_id) # Does not work, clients will shortly end up piled onto the slowest GPU
result.add_done_callback(callback_fn) # Crash / no way to pass in cu_device_id
Run Code Online (Sandbox Code Playgroud)

这里的想法是让客户端从队列中获取可用的 GPU,然后在使用完毕后将其放回到队列中,以便另一个客户端可以使用它。

解决这个问题的一种方法是将 gpu_queue 传递给客户端:

def method(gpu_queue):
    cu_device_id = gpu_queue.get()
    print("Hello world, I'm going to use …
Run Code Online (Sandbox Code Playgroud)

python distributed-computing dask

5
推荐指数
1
解决办法
2488
查看次数

PAXOS 或 RAFT 中重新上线的副本如何赶上?

在 PAXOS 和 RAFT 等共识算法中,会提出一个值,如果法定人数同意,则会将其持久写入数据存储。在法定人数达到时无法参加的参与者会怎样?他们最终如何赶上?无论我看什么,这似乎都是留给读者的练习。

distributed-computing consensus paxos raft

5
推荐指数
1
解决办法
488
查看次数

如何响应多个 gRPC 客户端?

我正在构建一个可以拥有多个 gRPC 服务器并且肯定会有多个 gRPC 客户端的应用程序,我想知道如何在服务器端识别这是我正在交谈的客户端,并且只向该客户端发送数据。我正在使用双向流 RPC,现在数据被广播到每个客户端,但我不希望这样。go gRPC 中的哪些功能使其成为可能,或者我该如何实现它?

distributed-computing go grpc grpc-go

5
推荐指数
1
解决办法
8141
查看次数

分布式深度学习中局部排名意味着什么?

https://github.com/huggingface/transformers/blob/master/examples/run_glue.py

我想调整这个脚本来对我的数据进行文本分类。用于此任务的计算机是一台带有两个显卡的单机。local_rank因此,这涉及到对上面脚本中的术语进行某种“分布式”训练,尤其是当local_rank等于 0 或 -1 时,如第 83 行所示。

在阅读了一些分布式计算的材料后,我想这local_rank就像机器的 ID。0 可能意味着该机器是计算中的“主要”或“头”。但-1是什么?

distributed-computing deep-learning pytorch

5
推荐指数
1
解决办法
1万
查看次数

使用分布式训练(例如DDP)时如何修复pytorch中的SIGSEGV?

在 pytorch 中运行 DDP 时,我不断遇到此问题:

\n
Traceback (most recent call last):\n  File "ml4coq-proj/embeddings_zoo/tree_nns/main_brando.py", line 330, in <module>\n    main_distributed()\n  File "ml4coq-proj/embeddings_zoo/tree_nns/main_brando.py", line 230, in main_distributed\n    mp.spawn(fn=train, args=(opts,), nprocs=opts.world_size)\n  File "/home/miranda9/miniconda3/envs/automl-meta-learning/lib/python3.8/site-packages/torch/multiprocessing/spawn.py", line 199, in spawn\n    return start_processes(fn, args, nprocs, join, daemon, start_method=\'spawn\')\n  File "/home/miranda9/miniconda3/envs/automl-meta-learning/lib/python3.8/site-packages/torch/multiprocessing/spawn.py", line 157, in start_processes\n    while not context.join():\n  File "/home/miranda9/miniconda3/envs/automl-meta-learning/lib/python3.8/site-packages/torch/multiprocessing/spawn.py", line 105, in join\n    raise Exception(\nException: process 1 terminated with signal SIGSEGV\n
Run Code Online (Sandbox Code Playgroud)\n

但这个错误的信息量相当小(例如,它没有告诉我什么进程或它试图访问什么),所以我不确定我需要做什么来解决它。

\n

一些研究告诉你:

\n
\n

SIGSEGV:在 Linux 等 Unix 操作系统上,“分段违规”(也称为“信号 11”、“SIGSEGV”、“分段错误”或缩写为“sig11”或“segfault”)是由当系统检测到某个进程正在尝试访问不属于它的内存地址时,内核会向该进程发出通知。通常,这会导致违规进程被终止。

\n
\n

是的,我确实有通常mp.spawn(fn=train, …

python distributed-computing multiprocessing neural-network pytorch

5
推荐指数
0
解决办法
2096
查看次数

在Spark中,是有很多小worker好还是有几个大worker好?

Spark 集群由一个驱动程序组成,该驱动程序将任务分配给多个工作节点。每个工作线程可以承担与可用核心数量相等的任务数量。所以我认为任务完成的速度取决于可用核心总数。

考虑以下集群配置,以 AWS EC2 为例:

  • 2 个m5.4xlarge(16 个 vCPU/核心,64GB RAM)工作线程,总共 32 个核心/128GB RAM

或者

  • 8 个m5.xlarge(4 个 vCPU/核心,16GB RAM)工作线程,总共 32 个核心/128GB RAM

我使用这些实例作为示例;这与这些实例无关,而是与一般想法有关,即您可以使用不同的配置拥有相同数量的内核+ RAM。这两种集群配置的性能有什么区别吗?两者都具有相同的内核和 RAM 总量,以及相同的 RAM/内核比率。您会选择其中一项做什么工作,另一项又是什么?我自己对此有一些想法:

  • 具有 8 个较小实例的配置可能具有更高的总网络带宽,因为每个工作线程都有自己的连接
  • 具有 2 个较大实例的配置在洗牌时可能会更有效,因为更多核心可以共享工作线程上的内存,而不必在网络上洗牌,因此网络开销更低
  • 具有 8 个较小实例的配置具有更好的弹性,因为如果一个工作线程发生故障,则只有八分之一发生故障,而不是二分之一。

您同意以上说法吗?在总 RAM/内核数量相同的不同配置之间进行选择时,您还会考虑哪些其他因素?

distributed-computing apache-spark

5
推荐指数
0
解决办法
1203
查看次数