请容忍我,这是我第一次尝试“大数据”项目时的一个基本架构问题,但我相信你的答案对任何一个在这个领域起步的人都会有普遍的兴趣。
我已经在google上搜索并阅读了kafka、storm、memcached、mongodb等的高层描述,但是现在我已经准备好开始设计我的应用程序了,我仍然需要进一步了解数据实际上应该如何分发和共享。
我的应用程序的性能是至关重要的,所以一个目标是以某种方式最大化执行分布式计算的机器的ram中的数据的局部性。我需要这部分设计的建议。
如果我的应用程序有一些明确的标准来预先划分数据并分发计算结果(比如地理区域或公司部门),那么解决方案将是显而易见的。但不幸的是,我的应用程序的数据访问模式是动态的,依赖于以前的计算结果。
我的应用程序是一个具有不同阶段的分析程序。在第一阶段中,所有数据都被访问一次,并为每个数据对象计算一个度量。在第二阶段中,可以访问数据对象的子集,访问的概率与在前一阶段中计算的每个数据对象的度量成比例。在最后阶段,相对较小的数据对象子集将被多次访问以进行多次计算。
在所有阶段,都需要将计算分布在多个服务器上。计算是令人尴尬的并行,每个分布式计算只需要访问几个数据对象。还需要在应用程序运行之前指定服务器的数量(例如,在一台服务器上运行,或在五十台服务器上运行)。
在我看来,我需要某种机制将适当的数据对象分发到适当的计算服务器,而不是盲目地从某个数据库服务(无论是集中式的还是分布式的)获取数据。另外,在我看来,某种智能缓存系统可能是合适的,因为数据访问模式取决于之前的计算,并且无法预先预测。但据我所知,memcached并不是这样一个系统,因为分片是先验决定的。
我已经读过很多遍了,操作系统缓存的性能比我们可能尝试的任何一种伪装都要好。我认为理想的解决方案是,每个计算服务器的ram缓存以某种方式捕获数据对象的动态访问模式,但我不清楚如何使用nosql或memcached服务。
谢谢你这么远地和我在一起。我意识到这是一个基本的问题,但到目前为止我还没有找到答案。我无法用nosql/memcached包的先验切分来解析我的应用程序的动态访问模式。任何建议都将不胜感激。
1条答案
按热度按时间42fyovps1#
我建议你看看http://tarantool.org. shard为最常见的数据访问模式最大化局部性,使用lua进行本地计算,net.box在需要在另一个节点上继续计算时发出远程rpc。所有数据都存储在ram中,如果您仔细编写计算代码,它可以利用实时编译器的优势。