我有兴趣学习更多有关分布式计算的知识以及如何做 - 主要是在C++中,但我也对C#感兴趣.
有人可以推荐一些资源吗?我对这个话题知之甚少,所以我应该从哪里开始?
谢谢.
我们有一个计算密集型服务,用于进行大量转换.它在很大程度上受计算限制(CPU绑定)进程.基本上发生的是我们有一个消息代理,它通过Thrift将消息发送到处理服务.
现在我们有多个不同的处理服务,它们运行不同的算法来处理消息 - 这些消息被路由到一个或多个处理算法.我们的消息量是可变的,处理算法的需求也是可变的(即我们可以获得包含XYZ的许多消息然后发送到算法1,否则发送到算法2).
我们希望将其扩展为可横向扩展的内容.所以我们有多个节点正在运行处理算法.现在,根据消息传递负载,我们的Thrift请求应该发送到不同的服务器(假设所有服务都运行每个处理Algo1到3的实例).比如我们想要在Algo 1上获取大量消息,然后我们有两台运行algo 1的服务器,第三台服务器负责处理其他两个algos(Algo 2和3)的请求.
所以系统看起来像这样:
Client ----Request-------|
-----------|--------------------
| Coord & Load Balancer Service | ... like zookeeper
--------------------------------
<--|-->
| Route messages to servers...
Server1: Server2: Server 3:
Algo1 instance Algo1 instance Algo2 instance
Algo3 instance
Run Code Online (Sandbox Code Playgroud)
所有进程都是用Java编写的.
因此,使用Zookeeper进行设置是多么容易.我知道,当我们添加或更改algos时,我们可以轻松地使用Zookeeper来处理事物的配置方面(即服务器侦听算法更新或添加并按配置提供服务)但我们如何管理负载平衡方面?
干杯!
java load-balancing thrift distributed-computing apache-zookeeper
我是java的新手,非常喜欢学习它.我已经制作了一个运行良好的程序,但是当我添加更多数据进行处理时需要一些时间.我把它做了线程,它确实加速了很多,但现在我正在考虑加快速度(显然它需要处理的数据越多,所需的时间越长).只是一个fyi,我的程序不会在线程之间共享任何数据,它会获取列表中的一项并进行一些数学运算并将结果上传到数据库.理想情况下,一些工作计算机会获得列表中的一些项目然后完成其工作,然后在完成之前获得更多工作
我做了一些研究并找到了队列,我不确定它是否是我需要的东西,或者是否有其他的东西(我也在考虑保持工人的诚信/监督对我来说可能对于作为新手来说太多了).我家里有4台电脑(一些Linux,Mac和Windows ..但我可以在所有非Linux系统上安装linux vm,如果这些解决方案特定于操作系统)并且想要让他们也开始处理这项任务.我想创建Java队列,其他客户端采取一个部分和过程,但我也看到了库(rabbitmq).我也简要介绍过网格计算.
这是要走的路还是有更好的方法?我不需要任何代码或任何东西只是想知道分发线程的解决方案是什么,或者在评估时使用哪些因素.
我有一个分布式/联邦数据库,结构如下:
我正在为跨越节点联合的作业实现一个只读的节点间聚合作业系统(即,对于非节点本地的作业).这些作业只执行"获取"查询 - 它们不会修改数据库.(如果作业的结果打算进入一个或多个数据库,那么这是通过一个单独的作业完成的,该作业不是我试图优化的节点间作业系统的一部分.)我的目标是最小化这些作业所需的网络带宽(首先是最小化节点间/ 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).
我只需要一个简短的视图:)
我有一个基于MassTransit和RabbitMQ的现有分布式计算框架.基本上有一个经理根据请求回应工作.每个工人将根据物理机器规格采取一定数量的物品.然后,工作人员在完成后发送完成消息.它运行得相当好,并且似乎具有高度可扩展性,因为唯一的链接是服务总线.
我最近评估了Akka.Net,看看这是否是一个更简单的系统来实现相同的模式.看了之后我对它究竟用于什么感到有些困惑.似乎如果我想做类似的事情,经理必须提前知道每个工人并直接发送它的工作.
我相信我错过了一些东西,因为那个模型似乎没有很好的扩展.
我正在学习COMPS.到目前为止,一切都运行良好,但我只执行了手册中给出的示例.
现在我想运行自己的测试应用程序,我无法让它工作.我一定错过了什么,但我看不出我做错了什么.
我的应用程序称为App,并且具有主类App,以及另一个名为AppItf的类中的接口.当我尝试使用runcompss运行它时:
runcompss -d --classpath = $ PWD/App.jar App
我收到以下消息:
使用项目文件的默认位置:/opt/COMPSs/Runtime/scripts/user/../../configuration/xml/projects/project.xml使用资源文件的默认位置:/ opt/COMPSs/Runtime/scripts/user /../../configuration/xml/resources/resources.xml
-----------------执行App --------------------------
[Loader] - 加载或执行应用程序时出错.Sun.reflect.DeativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)的java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Method.java:606)位于integratedtoolkit.loader.ITAppLoader.load(ITAppLoader.java:54)的integratedtoolkit.loader.ITAppLoader.main(ITAppLoader.java:84)引起:java .lang.ClassNotFoundException:java.net.URLClassLoader $ 1.run(URLClassLoader.java:366)的javaI.URLClassLoader $ 1.run(URLClassLoader.java:355)java.security.AccessController.doPrivileged(Native Method)的AppItf java.net.URLClassLoader.findClass(URLClassLoader.java:354)at java.lang.ClassLoader.loadClass(ClassLoader.java:425)at at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308)at java. lang.ClassLoader.loadClass(ClassLoader.java:358)在integratedtoolkit.loader.CustomLoader.loadClass(CustomLoader.java :56)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:195)at integratedtoolkit.loader.total.ITAppModifier.modify(ITAppModifier.java:46)...还有6个
运行应用程序出错
有人可以帮我找到我做错的事吗?
先感谢您!
我想通过脚本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) 这真是愚蠢,但动物园管理员做的那个木筏没有 - 不是说zab而是动物园管理员本身.
我得到筏子领导选举等服务器,但动物园管理员的意义何在?是否有任何人有类比
我们如何在Dask分布式中为每个工作人员选择--nthreads和--nprocs?我有3个工作线程,每个工作线程有2个线程,每个内核有4个内核,每个内核有1个线程(根据每个工作线程上'lscpu'Linux命令的输出)