我有兴趣学习更多有关分布式计算的知识以及如何做 - 主要是在C++中,但我也对C#感兴趣.
有人可以推荐一些资源吗?我对这个话题知之甚少,所以我应该从哪里开始?
谢谢.
我正在寻找一个在C++分布式数字运算应用程序中使用的框架.
设置如下:
有一个主节点将问题域划分为小的独立任务.任务分配给具有不同功能的工作节点(例如,CPU类型/ GPU启用).工作节点在可用时动态添加到计算网格中.也可能发生工作节点死亡,而没有说再见.
我正在寻找一个快速的C/C++框架来完成这个设置.
总结一下,我的主要要求是:
我们需要建立一个系统,其中多个进程在同一个数据集上工作.我们的想法是拥有一组可以被我们的工作进程(异步)拉出的元素(即没有重复的值).这些进程可能分布在多个服务器上,因此我们需要一个分布式解决方案.
目前,我们正在考虑的模式是使用Redis来保存一个包含工作数据的集合.每个进程都应连接到该集,并从中弹出一个值.随机功能spop对我们来说实际上是一个加分,因为我们需要随机访问集合中的元素.必须从我们的主PostgreSQL数据库填充数据.
就像我说的,我们还有一个可供查询的PostgreSQL数据库,进程在请求元素时可以访问.但是,我们不知道是否在重载下可能成为瓶颈.我们确实希望在这个子系统上进行繁重的 - 非常繁重的并发访问(想想数百甚至数千个进程).
如果它与此有任何关联,我们使用Python rQ来处理异步任务(作业和工作者).
编辑:就大小而言,元素可能不会很大 - 顶部大小应该在500-1000字节左右.它们基本上是URL,所以除非发生奇怪的事情,否则它们应该远低于这个大小.元素的数量将取决于并发进程的数量,因此大约10-50 K元素可能是一个很好的球场.请记住,这更像是一个临时区域,因此重点应放在速度上而不是尺寸上.
总之,我的问题是:
在使用多个进程时,Redis是否为共享访问设置了一个好主意?是否有任何数据可以让我们知道该解决方案将如何扩展?如果是这样,你能提供任何指示或建议吗?
填充共享数据时,什么是一个好的更新策略?
非常感谢你!
我有一个分布式/联邦数据库,结构如下:
我正在为跨越节点联合的作业实现一个只读的节点间聚合作业系统(即,对于非节点本地的作业).这些作业只执行"获取"查询 - 它们不会修改数据库.(如果作业的结果打算进入一个或多个数据库,那么这是通过一个单独的作业完成的,该作业不是我试图优化的节点间作业系统的一部分.)我的目标是最小化这些作业所需的网络带宽(首先是最小化节点间/ WAN带宽,然后最小化节点内/ LAN带宽); 我假设每个WAN链路的统一成本,以及每个LAN链路的另一个统一成本.这些工作对时间不是特别敏感.我在节点内执行一些CPU负载平衡,但不在节点之间执行.
对于聚合作业,通过WAN/LAN传输的数据量相对于群集本地或特定数据库的数据库写入量较小,因此在联合中完全分发数据库是不切实际的.
我用来最小化网络带宽的基本算法是:
在可能的情况下,作业使用分而治之的方法来最小化所需的数据共址量.例如,如果作业需要计算联合中所有销售数字的总和,则每个节点在本地计算其销售总额,然后在管理器节点聚合(而不是将所有未处理的销售数据复制到管理器节点) .但是,有时(例如,当在位于不同节点的两个表之间执行连接时)需要数据共址.
我做的第一件事就是聚合作业,并在十分钟时间内运行聚合作业(机器都运行NTP,所以我可以合理地确定"每十分钟"在每个节点上意味着相同的事情).目标是两个作业能够共享相同的数据,这降低了传输数据的总体成本.
这导致网络带宽的改善,但我想知道是否有一个框架/库/算法可以改善这一点.我考虑的一个选项是在确定网络带宽时将结果集缓存在节点上并考虑这些缓存的结果集(即除了当前的预先安排的共址作业集之外,尝试在作业之间重用结果集,以便例如在一个10分钟的纪元中运行的作业可以使用前一个10分钟结果集中的缓存结果集,但除非作业使用完全相同的结果集(即除非他们使用相同的where子句),否则我不知道一般情况 - 填充结果集中间隙的目的算法(例如,如果结果集使用子句"其中N> 3"而另一个作业需要带有子句"where N> 0"的结果集,那么我可以使用什么算法确定我需要将原始结果集和结果集的并集与"其中N> 0和N <= 3"的子句一起使用 - 我可以尝试编写自己的算法来执行此操作,但结果将是越野车无用的混乱.我还需要确定缓存数据何时过时 - 最简单的方法是将缓存数据的时间戳与源表上最后修改的时间戳进行比较,如果时间戳已更改,则替换所有数据,但理想情况下我希望能够仅更新已按行或每块时间戳更改的值.
database algorithm optimization caching distributed-computing
我是新人
Apache ZooKeeper :ZooKeeper是一种集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务.
Apache Mesos :Apache Mesos是一个集群管理器,可以简化在共享服务器池上运行应用程序的复杂性.
Apache Helix :Apache Helix是一个通用的集群管理框架,用于自动管理托管在节点集群上的分区,复制和分布式资源.
Erlang Langauge :Erlang是一种编程语言,用于构建具有高可用性要求的大规模可扩展软实时系统.
听起来对我而言Helix,Mesos这两者对Clustering管理系统都很有用.他们是如何相关的ZooKeeper?如果有人给我一个真实世界的例子,它会更好.
我很想知道如何[BOINC][1]向客户分发任务?他们使用上述任何技术吗?(忘了Erlang).
我只需要一个简短的视图:)
在使用最终一致的分布式数据存储的服务器场中运行Web应用程序时(在我的情况下是CouchDB),我应该确保给定用户始终指向同一个数据存储区实例吗?
在我看来,替代方法,任何Web请求可以使用任何数据存储,增加了处理一致性问题(重试,检查等)的显着复杂性.另一方面,如果给定会话中的用户始终指向同一个沙发节点,那么我的一致性问题不会主要围绕"共享"用户数据进行,因此会大大简化吗?
我也对指导用户的策略感到好奇,但也许我会将其保留为另一个问题(欢迎评论).
couchdb distributed-computing eventual-consistency nosql web
我有一个基于MassTransit和RabbitMQ的现有分布式计算框架.基本上有一个经理根据请求回应工作.每个工人将根据物理机器规格采取一定数量的物品.然后,工作人员在完成后发送完成消息.它运行得相当好,并且似乎具有高度可扩展性,因为唯一的链接是服务总线.
我最近评估了Akka.Net,看看这是否是一个更简单的系统来实现相同的模式.看了之后我对它究竟用于什么感到有些困惑.似乎如果我想做类似的事情,经理必须提前知道每个工人并直接发送它的工作.
我相信我错过了一些东西,因为那个模型似乎没有很好的扩展.
我想通过脚本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=69和arg2=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) 在最近关于分布式处理和流媒体的讨论中,我遇到了"代码转移到数据"的概念.请有人帮忙解释一下.这个短语的参考是MapReduceWay.
就Hadoop而言,它是在一个问题中陈述的,但仍然无法用科技不可知的方式找出原理的解释.
architecture hadoop mapreduce distributed-computing design-principles
TLDR; 在消费者即时创建的主题交换和队列的上下文中,当没有消费者消费该消息时,如何重新传递消息/生产者被通知?
我有以下组件:
我目前只有一个RabbitMQ主题交换.
routing_key = file_category.现在 - 这个工作正常,但它仍然有一个重大问题.目前,如果发布者发送的消息带有没有绑定使用者的路由密钥,则该消息将丢失.这是因为即使消费者创建的队列是持久的,一旦消费者断开连接,它就会被销毁,因为它对这个消费者是唯一的.
消费者代码(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
c++ ×2
akka.net ×1
algorithm ×1
apache ×1
architecture ×1
asynchronous ×1
bash ×1
boinc ×1
c ×1
c# ×1
caching ×1
couchdb ×1
database ×1
erlang ×1
hadoop ×1
hpc ×1
java ×1
mapreduce ×1
masstransit ×1
nosql ×1
optimization ×1
postgresql ×1
python ×1
queue ×1
rabbitmq ×1
redis ×1
shell ×1
slurm ×1
web ×1