您会以何种方式尝试使用多台计算机来计算PI等数字,即?
现有的算法或解决方案是否容易实现?你如何拆分工作并让其他机器的结果生效?
我想用LSF提交一份工作:
在没有LSF的情况下,我只需在4个节点上启动mpi,例如:
mpirun -hosts host1,host2,host3,host4 -np 4 ./myprocess --numthreads = 12
但是,在LSF存在的情况下,我看不出怎么做?我确信这可能是一种非常标准的方法,但我对LSF来说还是个新手.我用Google搜索,但答案对我来说并不是很明显.我在LSF中发现了混合MPI/OpenMP,但它似乎并不完全相同,似乎一次只需要一台主机.
我正在尝试编写一个函数,它将使进程在接收循环中等待并在输入上进行模式匹配以创建更多进程.
-module(masterNode).
%% ====================================================================
%% API functions
%% ====================================================================
-export([listen/0]).
%% ====================================================================
%% Internal functions
%% ====================================================================
listen() ->
receive
{userNodeName, createNode} ->
spawn(userNode, listen, [userNodeName]),
io:format("User Node Created!~n"),
listen();
{_, createNode} ->
spawn(userNode, listen, ["Anonymous"]),
io:format("Anonymous User Node Created!~n"),
listen();
_ ->
io:format("Invalid syntax!.~n")
end.
Run Code Online (Sandbox Code Playgroud)
当我尝试从命令行将masterNode生成到变量时,我收到此错误:
5> mn = spawn(masterNode, listen, []).
** exception error: no match of right hand side value <0.44.0>
Run Code Online (Sandbox Code Playgroud)
但是,如果我不尝试将其存储到变量中,我没有问题:
6> spawn(masterNode, listen, []).
<0.47.0>
Run Code Online (Sandbox Code Playgroud)
我要做的是使用此masterNode变量运行listen命令以激活模式匹配并通过另一个模块(userNode)创建更多进程.像这样:
mn ! {userNode1, createNode}. %Create a userNode process called …Run Code Online (Sandbox Code Playgroud) 问题
最近,我一直在考虑如何抓取某个大型跨国网站的内容,以获取该公司出售的产品的具体详细信息。该网站没有 API,但您可以通过将带有产品 ID 的 GET 请求发送到特定 URL 来下载每个产品的一些 XML。所以至少是这样。
问题在于,可能存在数亿个潜在产品 ID(例如,000000001 到 500000000 之间),但实际存在的产品只有几十万个。而且不可能知道哪些产品 ID 是有效的。
方便的是,向产品 URL 发送 HEAD 请求会根据产品 ID 是否有效(即产品实际存在)产生不同的响应。一旦我们知道该产品确实存在,我们就可以下载完整的 XML 并从中获取所需的数据位。
显然,如果在单个服务器上运行,发送数亿个 HEAD 请求将花费大量时间才能完成,因此我想借此机会学习如何开发某种分布式应用程序(对于我)。在这一点上,我应该提到这个特定的网站可以轻松地每秒处理大量传入请求,而不会出现 DOS 风险。我不想透露该网站的名称,但它每天很容易获得数百万次点击。该抓取工具对网站性能的影响可以忽略不计。不过,如果公司投诉,我会立即制止。
该设计
我不知道这是否是正确的方法,但我当前的想法是启动一个“协调服务器”,以及一些与该服务器通信并执行抓取的节点,所有这些都作为 EC2 实例运行。
每个节点将启动一定数量的进程,并且每个进程将由协调服务器指定一个作业,其中包含要抓取的不同范围的潜在产品ID(例如产品ID 00001 到10000)。这些作业将存储在协调服务器上的数据库表中。每个作业将包含以下信息:
当节点启动时,查询将被发送到协调服务器,询问一些配置数据以及要处理的作业。当节点完成作业时,将发送一个查询来更新刚刚完成的作业的状态,并发送另一个查询来请求执行新作业。每个作业都有一个到期时间,因此如果进程崩溃,或者节点因任何原因发生故障,另一个节点可以接管过期的作业并重试。
为了最大限度地提高系统性能,我需要计算出应立即启动多少个节点、每个节点有多少个进程、发送 HTTP 请求的速率以及哪种 EC2 实例类型将提供最大的性价比(我猜测高网络性能、高 CPU 性能和高磁盘 I/O 将是关键因素?)。
目前,计划是用 Python 编写抓取工具,在 Ubuntu EC2 实例上运行,可能在 Docker 容器中启动,并使用某种键值存储数据库来保存协调服务器(MongoDB?)上的作业。关系数据库也应该可以工作,因为作业表的 I/O 应该相当低。
我很想知道更有经验的工程师这是否是正确的方法,或者我是否完全忽略了完成此任务的更好方法?
非常感谢,谢谢!
我正在使用Julia版本0.5.2.
julia> addprocs(4);
julia> a=rand(8,8);
julia> distribute(a,2)
Run Code Online (Sandbox Code Playgroud)
当我尝试使用此代码时,我收到错误:
错误:UndefVarError:分布未定义
我该怎么办?
提前致谢.
所以我试图了解队列解决了哪些实际问题。通过阅读谷歌上的所有信息,我得到了高水平的信息。
因此,我正在研究 A 公司的架构,他们对于作业队列有不同的用例,例如
为什么要稍后处理呢?
这是我最好的猜测...
假设这是一个有效的用例,那么添加更多服务器来处理更多“事物”难道没有意义吗?是因为添加更多服务器比使用队列成本更高并且稍微牺牲响应时间吗?
根据我的用例示例,队列还能为它们解决哪些其他问题?
这是我在我的代码中运行的for循环:
for(x<-0 to vertexArray.length-1)
{
for(y<-0 to vertexArray.length-1)
{
breakable {
if (x.equals(y)) {
break
}
else {
var d1 = vertexArray(x)._2._2
var d2 = vertexArray(y)._2._2
val ps = new Period(d1, d2)
if (ps.getMonths() == 0 && ps.getYears() == 0 && Math.abs(ps.toStandardHours().getHours()) <= 5) {
edgeArray += Edge(vertexArray(x)._1, vertexArray(y)._1, Math.abs(ps.toStandardHours().getHours()))
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望通过在群集中的多台计算机上分发此代码来加快此代码的运行时间.我在Spark上使用Scala on intelliJ-idea.我如何实现这种类型的代码在多台机器上工作?
我在我的N fronend机器上收到http请求,并希望由我的K后端机器处理它们,具体取决于数据中的某个键.键控必须稳定和一致.我还想根据负载不间断地扩展前端和后端机器.当缩放时丢失很少的数据时,我很好.
我想我可以用kafka或apache flink实现我的目标.也许也可以使用hazelcast,因为它们看起来都很重,而且对我来说太多了.
是否有一个库只是以分布式方式解决了键控/分区/分片的问题?
rx集成库的加分点.
amazon-sqs ×1
amazon-swf ×1
apache-kafka ×1
apache-spark ×1
cloud ×1
erlang ×1
hazelcast ×1
java ×1
julia ×1
lsf ×1
mpi ×1
openmp ×1
pi ×1
rabbitmq ×1
redis ×1
scala ×1
sharding ×1