标签: distributed-computing

在分布式应用程序中同步数据库访问

我发现自己经常实现的常见编程逻辑就像下面的伪代码:

Let X = some value
Let Database = some external Database handle

if !Database.contains(X):
   SomeCalculation()
   Database.insert(X)
Run Code Online (Sandbox Code Playgroud)

但是,在多线程程序中,我们在这里有竞争条件.线程A可能会检查是否X存在Database,发现它不存在,然后继续调用SomeCalculation().同时,线程B还将检查是否X存在Database,发现它不存在,并插入重复的条目.

所以当然,这需要同步,如:

Let X = some value
Let Database = some external Database handle

LockMutex()
if !Database.contains(X):
   SomeCalculation()
   Database.insert(X)
UnlockMutex()
Run Code Online (Sandbox Code Playgroud)

这很好,除非应用程序是一个分布式应用程序,运行在多台计算机上,所有这些都与同一个后端数据库机器通信?在这种情况下,Mutex是无用的,因为它只将应用程序的单个实例与其他本地线程同步.为了实现这一目标,我们需要某种"全局"分布式同步技术.(假设简单地禁止重复Database是不可行的策略.)

一般来说,这个问题的一些实际解决方案是什么?

我意识到这个问题非常通用,但我不想让这个问题成为特定于语言的问题,因为这是跨多种语言和多种数据库技术的问题.

我有意避免说明我是在谈论RDBMS还是SQL数据库,而不是NoSQL数据库,因为我再次 - 我正在寻找基于行业惯例的广义答案.例如,这种情况是原子存储过程可能解决的吗?还是原子交易?或者这是否需要像"分布式互斥体"这样的东西?或者更一般地说,这个问题通常是由数据库系统解决的,还是应用程序本身应该处理的?

如果事实证明这个问题在没有进一步信息的情况下根本无法回答,请告诉我,以便我可以对其进行修改.

database language-agnostic mutex distributed-computing

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

对加权有向图进行分区(在键/值数据库上)

我们想对加权有向图进行分片,

用户可以动态添加节点和边,首先DB/Graph为空.

我们将节点和边缘保存在一个键/值数据库(可能是Redis)中:对于每个节点,我们将nodeId作为键,并将引用节点的键的一组排序,sortedSet中每个nodeId的得分是边缘.

(请参阅此处的问题:Redis:实施加权有向图)

我们没有平衡约束,图中最常见的操作是Dijkstra,我们希望最小化I/O(在我们的例子中是网络)

可能的解决方案:每个数据库服务器都包含其他具有IP的服务器列表:

key:server1,value:.... 250.1

key:server2,value:.... 250.2

key:server3,value:.... 250.3

每个nodeId都是serverX.originalNodeId

什么算法决定哪个节点在哪里?我们应该支持重新定位节点吗?

我猜这个天真的方法是,将节点A添加到serverX,其中argmax(服务器X中具有节点A的边缘的节点数),只要serverX没有被完全占用.

database-design graph distributed-computing nosql redis

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

分布式多播中"接收"和"传递"有什么区别?

在多播的上下文中,接收消息的进程和传递消息的进程之间有什么区别?

multicast definition distributed-computing difference

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

实时分析处理系统设计

我正在设计一个系统,该系统应分析大量用户事务并生成汇总度量(如趋势等).系统应该快速,稳健和可扩展.System是基于java的(在Linux上).

数据从生成用户事务的日志文件(基于CSV)的系统到达.系统每分钟生成一个文件,每个文件包含不同用户的事务(按时间排序),每个文件可能包含数千个用户.

CSV文件的示例数据结构:

10:30:01,用户1,...
10:30:01,用户1,...
10:30:02,用户78,...
10:30:02,用户2,......
10: 30:03,用户1,...
10:30:04,用户2,...
...

我计划的系统应该处理文件并实时执行一些分析.它必须收集输入,将其发送到多个算法和其他系统,并将计算结果存储在数据库中.数据库不保存实际输入记录,而只保留有关事务的高级聚合分析.例如趋势等

我计划使用的第一个算法要求最佳操作至少10个用户记录,如果5分钟后找不到10条记录,它应该使用可用的数据.

我想使用Storm来实现,但我更愿意尽可能地将这个讨论留在设计层面.

系统组件列表:

  1. 每分钟监视传入文件的任务.

  2. 读取文件,解析文件并使其可用于其他系统组件和算法的任务.

  3. 用于缓冲用户的10条记录的组件(不超过5分钟),当收集10条记录或5分钟时,是时候将数据发送到算法进行进一步处理.由于要求为算法提供至少10条记录,我想到使用Storm Field Grouping(这意味着为同一个用户调用相同的任务)并跟踪任务中10个用户记录的集合,当然我计划有几个这样的任务,每个任务处理一部分用户.

  4. 还有其他组件可以处理单个事务,对于它们,我计划创建其他任务,在解析每个事务时(与其他任务并行).

我需要你的帮助#3.

设计这样一个组件的最佳实践是什么?很明显,它需要为每个用户维护10条记录的数据.键值映射可能会有所帮助,是否可以在任务本身或使用分布式缓存中管理映射?例如Redis是一个键值存储(之前从未使用过它).

谢谢你的帮助

distributed-computing distributed-caching batch-processing redis apache-storm

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

不同主机上的OpenMP程序

我想知道是否可以在多个主机上运行OpenMP程序.到目前为止,我只听说过可以在多个线程上执行的程序,但都在同一个物理计算机中.是否可以在两个(或更多)客户端上执行程序?我不想使用MPI.

parallel-processing distributed-computing openmp

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

后端自动完成

这是一个面试问题:为自动完成设计一个分布式后端.

我会回答如下:

自动完成是通过给定后缀在字典中搜索.字典应该可以组织成一个特里.字典是根据最常见的查询构建的,但它是另一个故事.

现在我假设字典没有经常更改(例如每天一次而不是每毫秒一次).因此,我们可以在多个处理自动完成查询的服务器上复制字典(例如,使用负载均衡器和循环策略).

我们也应该考虑字典,但这也是另一个故事.

是否有意义?我错过了什么吗?

language-agnostic architecture algorithm autocomplete distributed-computing

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

Hadoop不是一个网格而不是一个集群吗?

我听过"Hadoop集群"一词,但它似乎与我对"网格"和"集群"的理解相反.

我的理解网格是一个由2个以上的计算机(节点)组成的分布式系统,它们彼此共享计算资源以解决同样的问题.因此,如果你正在尝试进行某种重型科学计算,数字运算,你会创建一个机器网格,以便在同一个问题上进行协作.

认识一个的集群是,它是由计算机2+这都是一个分布式系统独立工作,以解决不同的,较小的问题.因此,您通常将一个集群置于负载均衡器后面,并让每个节点在负载均衡器为其分配一个小问题.

因此,如果我的理解是正确的,那么你使用网格来解决少量巨大的(计算量很大的)作业,并使用集群来解决大量的小(计算轻)工作.

首先,如果我对网格和群集的理解不正确,请首先纠正我!

假设我或多或少是正确的,那为什么我们有Hadoop 集群?如果Hadoop的目的是解决大数据问题(一些计算密集的问题)并使用大量商品硬件来创建大量能够与其他人协作以解决相同问题的节点,那么这不是一个网格吗?

说我们有Hadoop 网格更正确吗?为什么或者为什么不?提前致谢!

grid hadoop distributed-computing cluster-computing bigdata

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

通过计算集群加载python模块

我有一个使用Scientific Linux的计算集群的帐户。当然,我只有用户访问权限。我正在使用python,我需要运行python脚本,因此我需要导入一些python模块。由于我没有超级用户访问权限,因此在$ HOME上安装了带有所有必需模块的本地python副本。当我在帐户(托管节点)上运行脚本时,它们可以正常运行。但是为了将作业提交到计算队列(以便在速度更快的计算机上进行处理),我需要提交一个bash脚本,该脚本的一行执行脚本。计算群集使用SunGrid Engine。但是,当我提交bash脚本时,出现一个错误,即找不到我安装的模块!我不知道怎么了。希望您能帮忙。

python linux distributed-computing

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

Akka集群冲突

Akka doc讨论了各种看似相互关联的Akka技术,但没有区分它们:

  • 阿卡网络
  • Akka Remoting
  • Akka聚类
  • Akka ZeroMQ模块

我的理解是"Akka Networking"只是一个模块/ lib,它使Akka能够通过TCP与远程actor系统通信.Akka Remoting是另一个模块/ lib(未包含在核心Akka JAR中),它为Akka提供了Gossip协议的使用.而Akka Clustering是另一个模块/ lib,然后使用这些Gossip协议允许远程actor系统聚集在一起,并以病毒式/"服务发现"的方式来改变变化.我 Akka ZeroMQ的理解是它完成了与Akka Clustering相同的功能,除了使用ZeroMQ作为网络连接和协议(而不是Gossip)的基础.

首先,如果我对这些不同模块/库的理解不正确,请首先纠正我!

假设我或多或少在这里目标,那么我主要担心的是我可能有远程演员系统1(RAS1)使用Akka Clustering(因此Gossip)试图与使用Akka ZeroMQ的远程演员系统2(RAS2)进行通信.在这种情况下,我们使用两种完全不同的群集技术和协议,这是否意味着这两个远程系统无法相互通信,或者是否需要特别注意使它们彼此兼容?

distributed-computing zeromq akka

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

使用Gradle进行分布式构建

我想知道是否有任何方法可以使用gradle进行分布式编译(因为编译不是在您的计算机上本地执行,而是使用计算机云甚至一台其他功能更强大的计算机进行,编译速度更快)。使用gradle缓存,可以清楚地定义输入和输出,因此似乎可行。我很好奇这是否已经完成,或者是否有人对此有任何信息。我为在线获得的信息很少而感到惊讶。

android distributed-computing gradle android-gradle-plugin

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