标签: distributed-computing

更多地了解分布式计算

我有兴趣学习更多有关分布式计算的知识以及如何做 - 主要是在C++中,但我也对C#感兴趣.

有人可以推荐一些资源吗?我对这个话题知之甚少,所以我应该从哪里开始?

谢谢.

c# c++ distributed-computing

8
推荐指数
1
解决办法
2269
查看次数

用于动态集群中的分布式计算的C/C++框架

我正在寻找一个在C++分布式数字运算应用程序中使用的框架.

设置如下:

有一个主节点将问题域划分为小的独立任务.任务分配给具有不同功能的工作节点(例如,CPU类型/ GPU启用).工作节点在可用时动态添加到计算网格中.也可能发生工作节点死亡,而没有说再见.

我正在寻找一个快速的C/C++框架来完成这个设置.

总结一下,我的主要要求是:

  • 工人/任务调度范例
  • 动态添加/删除节点
  • 目标网络:1G - 10G以太网(企业网络,不需要互联网的良好性能)
  • 可选:加密和验证通信

c c++ hpc distributed-computing scheduled-tasks

8
推荐指数
1
解决办法
3030
查看次数

如何在多个进程之间共享一组数据?

我们需要建立一个系统,其中多个进程在同一个数据集上工作.我们的想法是拥有一组可以被我们的工作进程(异步)拉出的元素(即没有重复的值).这些进程可能分布在多个服务器上,因此我们需要一个分布式解决方案.

目前,我们正在考虑的模式是使用Redis来保存一个包含工作数据的集合.每个进程都应连接到该集,并从中弹出一个值.随机功能spop对我们来说实际上是一个加分,因为我们需要随机访问集合中的元素.必须从我们的主PostgreSQL数据库填充数据.

就像我说的,我们还有一个可供查询的PostgreSQL数据库,进程在请求元素时可以访问.但是,我们不知道是否在重载下可能成为瓶颈.我们确实希望在这个子系统上进行繁重的 - 非常繁重的并发访问(想想数百甚至数千个进程).

如果它与此有任何关联,我们使用Python rQ来处理异步任务(作业和工作者).

编辑:就大小而言,元素可能不会很大 - 顶部大小应该在500-1000字节左右.它们基本上是URL,所以除非发生奇怪的事情,否则它们应该远低于这个大小.元素的数量将取决于并发进程的数量,因此大约10-50 K元素可能是一个很好的球场.请记住,这更像是一个临时区域,因此重点应放在速度上而不是尺寸上.

总之,我的问题是:

  1. 在使用多个进程时,Redis是否为共享访问设置了一个好主意?是否有任何数据可以让我们知道该解决方案将如何扩展?如果是这样,你能提供任何指示或建议吗?

  2. 填充共享数据时,什么是一个好的更新策略?

非常感谢你!

postgresql queue asynchronous distributed-computing redis

8
推荐指数
1
解决办法
209
查看次数

优化分布式数据库聚合作业的网络带宽

我有一个分布式/联邦数据库,结构如下:

  1. 数据库分布在三个地理位置("节点")
  2. 每个节点都聚集了多个数据库
  3. 关系数据库是PostgreSQL,MySQL,Oracle和MS SQL Server的混合体; 非关系数据库是MongoDB或Cassandra
  4. 通过RabbitMQ实现每个节点内和节点联合内的松散耦合,每个节点运行RabbitMQ代理

我正在为跨越节点联合的作业实现一个只读的节点间聚合作业系统(即,对于非节点本地的作业).这些作业只执行"获取"查询 - 它们不会修改数据库.(如果作业的结果打算进入一个或多个数据库,那么这是通过一个单独的作业完成的,该作业不是我试图优化的节点间作业系统的一部分.)我的目标是最小化这些作业所需的网络带宽(首先是最小化节点间/ WAN带宽,然后最小化节点内/ LAN带宽); 我假设每个WAN链路的统一成本,以及每个LAN链路的另一个统一成本.这些工作对时间不是特别敏感.我在节点内执行一些CPU负载平衡,但不在节​​点之间执行.

对于聚合作业,通过WAN/LAN传输的数据量相对于群集本地或特定数据库的数据库写入量较小,因此在联合中完全分发数据库是不切实际的.

我用来最小化网络带宽的基本算法是:

  1. 如果作业运行在遍布联合的一组数据上,则管理器节点会向包含相关数据库查询的其他每个节点发送一条消息.
  2. 每个节点运行其查询集,使用gzip压缩它们,缓存它们,并将它们的压缩大小发送到管理器节点.
  3. 管理器移动到包含多个数据的节点(具体地说,移动到群集中具有最多数据且具有空闲核心的机器); 它从其他两个节点和集群中的其他机器请求其余数据,然后运行该作业.

在可能的情况下,作业使用分而治之的方法来最小化所需的数据共址量.例如,如果作业需要计算联合中所有销售数字的总和,则每个节点在本地计算其销售总额,然后在管理器节点聚合(而不是将所有未处理的销售数据复制到管理器节点) .但是,有时(例如,当在位于不同节点的两个表之间执行连接时)需要数据共址.

我做的第一件事就是聚合作业,并在十分钟时间内运行聚合作业(机器都运行NTP,所以我可以合理地确定"每十分钟"在每个节点上意味着相同的事情).目标是两个作业能够共享相同的数据,这降低了传输数据的总体成本.

  1. 给定两个查询同一个表的作业,我生成每个作业的结果集,然后我取两个结果集的交集.
  2. 如果两个作业都安排在同一节点上运行,则网络传输成本计算为两个结果集之和减去两个结果集的交集.
  3. 两个结果集存储到PostgreSQL临时表(在关系数据的情况下),或者存储在选择运行作业的节点上的临时Cassandra columnfamilies/MongoDB集合(在nosql数据的情况下); 然后,针对组合的结果集执行原始查询,并且传递的数据是针对各个作业的.(此步骤仅在组合结果集上执行;单个结果集数据只是传递到其作业,而不首先存储在临时表/列族/集合中.)

这导致网络带宽的改善,但我想知道是否有一个框架/库/算法可以改善这一点.我考虑的一个选项是在确定网络带宽时将结果集缓存在节点上并考虑这些缓存的结果集(即除了当前的预先安排的共址作业集之外,尝试在作业之间重用结果集,以便例如在一个10分钟的纪元中运行的作业可以使用前一个10分钟结果集中的缓存结果集,但除非作业使用完全相同的结果集(即除非他们使用相同的where子句),否则我不知道一般情况 - 填充结果集中间隙的目的算法(例如,如果结果集使用子句"其中N> 3"而另一个作业需要带有子句"where N> 0"的结果集,那么我可以使用什么算法确定我需要将原始结果集和结果集的并集与"其中N> 0和N <= 3"的子句一起使用 - 我可以尝试编写自己的算法来执行此操作,但结果将是越野车无用的混乱.我还需要确定缓存数据何时过时 - 最简单的方法是将缓存数据的时间戳与源表上最后修改的时间戳进行比较,如果时间戳已更改,则替换所有数据,但理想情况下我希望能够仅更新已按行或每块时间戳更改的值.

database algorithm optimization caching distributed-computing

8
推荐指数
1
解决办法
774
查看次数

Apache Helix,Zookeeper,Mesos和Erlang的真实例子?

我是新人

  • Apache ZooKeeper :ZooKeeper是一种集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务.

  • Apache Mesos :Apache Mesos是一个集群管理器,可以简化在共享服务器池上运行应用程序的复杂性.

  • Apache Helix :Apache Helix是一个通用的集群管理框架,用于自动管理托管在节点集群上的分区,复制和分布式资源.

  • Erlang Langauge :Erlang是一种编程语言,用于构建具有高可用性要求的大规模可扩展软实时系统.

听起来对我而言Helix,Mesos这两者对Clustering管理系统都很有用.他们是如何相关的ZooKeeper?如果有人给我一个真实世界的例子,它会更好.

我很想知道如何[BOINC][1]向客户分发任务?他们使用上述任何技术吗?(忘了Erlang).

我只需要一个简短的视图:)

apache erlang distributed-computing boinc apache-zookeeper

8
推荐指数
1
解决办法
1882
查看次数

在使用最终一致的数据存储区时,是否应将用户定向到特定数据节点?

在使用最终一致的分布式数据存储的服务器场中运行Web应用程序时(在我的情况下是CouchDB),我应该确保给定用户始终指向同一个数据存储区实例吗?

在我看来,替代方法,任何Web请求可以使用任何数据存储,增加了处理一致性问题(重试,检查等)的显着复杂性.另一方面,如果给定会话中的用户始终指向同一个沙发节点,那么我的一致性问题不会主要围绕"共享"用户数据进行,因此会大大简化吗?

我也对指导用户的策略感到好奇,但也许我会将其保留为另一个问题(欢迎评论).

couchdb distributed-computing eventual-consistency nosql web

8
推荐指数
1
解决办法
100
查看次数

Akka.Net工作队列

我有一个基于MassTransit和RabbitMQ的现有分布式计算框架.基本上有一个经理根据请求回应工作.每个工人将根据物理机器规格采取一定数量的物品.然后,工作人员在完成后发送完成消息.它运行得相当好,并且似乎具有高度可扩展性,因为唯一的链接是服务总线.

我最近评估了Akka.Net,看看这是否是一个更简单的系统来实现相同的模式.看了之后我对它究竟用于什么感到有些困惑.似乎如果我想做类似的事情,经理必须提前知道每个工人并直接发送它的工作.

我相信我错过了一些东西,因为那个模型似乎没有很好的扩展.

masstransit distributed-computing akka.net

8
推荐指数
2
解决办法
2317
查看次数

在运行期间更改发送到slbm中的sbatch的bash脚本是个坏主意?

我想通过脚本main.py多次使用不同的参数运行python脚本sbatch_run.sh,如下所示:

#!/bin/bash
#SBATCH --job-name=sbatch_run
#SBATCH --array=1-1000
#SBATCH --exclude=node047

arg1=10 #arg to be change during runs
arg2=12 #arg to be change during runs
python main.py $arg1 $arg2
Run Code Online (Sandbox Code Playgroud)

参数在sbatch运行的bash文件中编码.我担心如果我一个接一个地运行sbatch_run.sh多次但是在每次运行期间更改arg1和arg2的值,那么它可能会导致我的运行中出错.例如,如果我这样做:

sbatch sbatch_run.sh # with arg1=10 and arg2=12
Run Code Online (Sandbox Code Playgroud)

然后我立即更改后sbatch_run.sh再次运行该文件,如下所示:

sbatch sbatch_run.sh # with arg1=69 and arg2=666
Run Code Online (Sandbox Code Playgroud)

将我的运行全部运行到最后一个(即arg1=69arg2=666)而不是每个运行与自己的参数.

我确信如果我在main.py中对参数进行硬编码然后运行相同的sbatch脚本但是更改main.py它将运行最后一个.我想知道如果我改变sbatch_run.sh脚本也是如此.


只是你知道,我确实尝试过这个实验,运行1000个脚本,然后有些人排队并发出一个睡眠命令然后更改sbatch_run.sh.它似乎并没有改变我的跑步,但是,如果我错了,这太重要了,不会出错,并且想确保我也问过.

为了记录,我跑了:

#!/bin/bash
#SBATCH --job-name=ECHO
#SBATCH --array=1-1000
#SBATCH --exclude=node047

sleep 15
echo helloworld
echo …
Run Code Online (Sandbox Code Playgroud)

bash shell distributed-computing slurm

8
推荐指数
1
解决办法
1922
查看次数

"代码转移到数据"而不是代码数据的原理是什么?

在最近关于分布式处理和流媒体的讨论中,我遇到了"代码转移到数据"的概念.请有人帮忙解释一下.这个短语的参考是MapReduceWay.

就Hadoop而言,它是在一个问题中陈述的,但仍然无法用科技不可知的方式找出原理的解释.

architecture hadoop mapreduce distributed-computing design-principles

8
推荐指数
1
解决办法
3496
查看次数

确保至少一个消费者接收在主题交换上发布的消息

TLDR; 在消费者即时创建的主题交换和队列的上下文中,当没有消费者消费该消息时,如何重新传递消息/生产者被通知?

我有以下组件:

  • 主要服务,生成文件.每个文件都有一定的类别(例如pictures.profile,pictures.gallery)
  • 一组工人,使用文件并从中生成文本输出(例如文件的大小)

我目前只有一个RabbitMQ主题交换.

  • 制作人向交易所发送消息routing_key = file_category.
  • 每个消费者创建一个队列并将交换绑定到该队列以获得一组路由键(例如图片.*videos.trending).
  • 当使用者处理了文件时,它会将结果推送到processing_results队列中.

现在 - 这个工作正常,但它仍然有一个重大问题.目前,如果发布者发送的消息带有没有绑定使用者的路由密钥,则该消息将丢失.这是因为即使消费者创建的队列是持久的,一旦消费者断开连接,它就会被销毁,因为它对这个消费者是唯一的.

消费者代码(python):

channel.exchange_declare(exchange=exchange_name, type='topic', durable=True)
result = channel.queue_declare(exclusive = True, durable=True)
queue_name = result.method.queue

topics = [ "pictures.*", "videos.trending" ]
for topic in topics:
    channel.queue_bind(exchange=exchange_name, queue=queue_name, routing_key=topic)

channel.basic_consume(my_handler, queue=queue_name)
channel.start_consuming()
Run Code Online (Sandbox Code Playgroud)

在我的用例中,在这种情况下丢失消息是不可接受的.

试图解决方案

但是,如果通知生产者没有消费者收到消息(在这种情况下它可以稍后重新发送),则"丢失"消息变得可以接受.我发现强制性字段可能有所帮助,因为AMQP的规范规定:

如果消息无法路由到队列,此标志告诉服务器如何做出反应.如果设置了此标志,则服务器将返回带有Return方法的unroutable消息.

这确实有效 - 在制片人中,我能够注册ReturnListener:

rabbitMq.confirmSelect();  

rabbitMq.addReturnListener( (int replyCode, String replyText, String exchange, String routingKey, …
Run Code Online (Sandbox Code Playgroud)

python java distributed-computing rabbitmq rabbitmq-exchange

8
推荐指数
1
解决办法
950
查看次数