我刚接触couch db,在阅读Couch DB1.6的文档时,我了解到它是单服务器DB,所以我想知道map reduce如何利用它。如果我需要扩展这个数据库,那么我是否需要添加更多的RAID硬件,或者它是否可以在HDFS等商用硬件上运行?
我开始了解到couch db 2.0计划引入集群功能,但无法获得有关这方面的适当文档。
你能帮助我了解文件是如何在内部存储和访问的吗?非常感谢你的帮助。
发布于 2016-05-24 06:49:47
我认为你的问题是这样的:
这是一个合理的问题。
历史上使用"MapReduce“作为described by Google in this paper使用该样式化术语,implemented in Hadoop也使用相同的样式意味着对数据集进行并行处理,这对于单个机器来说可能太大了。
但这不是CouchDB 1.x的工作方式。视图索引"map“和"reduce”处理不仅在单机上进行,甚至在单线程上进行!正如dch (核心CouchDB项目的长期贡献者)在他对https://stackoverflow.com/a/12725497/179583的回答中所解释的那样
问题是,最终,某些东西必须串行操作,才能以这样一种方式构建B~树,即跨索引视图的范围查询是有效的。…但是当你第一次意识到高度可并行化的map-reduce算法是按顺序运行的时候,这看起来确实是完全古怪的!
那么: map/reduce给单服务器CouchDB带来了什么好处呢?为什么CouchDB 1.x视图索引是围绕它构建的?
好处是开发人员可以为每个索引"map“和可选的"reduce”提供两个函数,形成非常简单的构建块,这很容易理解,至少在索引设计之后是这样。
我的意思是:
例如,使用SQL查询语言,您将重点放在需要什么数据上-而不是需要多少工作才能找到它。因此,您可能会遇到意想不到的性能问题,这些问题可能会通过找出要添加索引的正确列来解决,也可能无法解决。
在CouchDB中,所谓的NoSQL方法走到了极端。您必须明确地考虑如何“找到”每个文档或文档集。您可以说,我希望能够找到"supervisor“字段与某个标识符匹配的所有"employee”文档。因此,现在您必须编写一个map函数:
function (doc) {
if (doc.isEmployeeRecord) emit(doc.supervisor.identifier);
}然后你必须像这样查询它:
GET http://couchdb.local:5984/personnel/_design/my_indexes/_view/by_supervisor?key=SOME_UUID在SQL中,您可以简单地这样说:
SELECT * FROM personnel WHERE supervisor == ?那么CouchDB方式的优势是什么呢?在SQL中,如果没有supervisor列上的索引,那么这个查询可能会很慢。在使用CouchDB的情况下,您不能真的意外地执行未优化的查询--您总是必须首先确定一个自定义视图!
(您提供给CouchDB视图的“aggregate functions”函数通常用于缩减目的,比如对多个文档进行计数或求平均值。)
如果你认为这是一个可疑的优势,you are not alone。就我个人而言,我发现通过自定义的“映射函数”(有时是"reduce函数“)设计我自己的索引是一项有趣的挑战,而且它确实带来了回报,至少知道了查询的伸缩成本(对于复制…来说就不是那么多了)。。
因此,不要把CouchDB视图看作是"MapReduce“(在风格化的意义上),而只是为在一组数据上运行[].map(…).reduce(…)的结果提供高效可访问的存储。因为"map“函数一次只应用于一个文档,所以总的数据集可能会一次超过内存容量。因为"reduce“函数的大小是limited的,所以它进一步鼓励将大量数据高效地处理为高效访问的索引。
如果您想了解更多关于如何存储CouchDB中生成的索引的信息,您可能会发现这些文章很有趣:
您可能已经注意到了,很抱歉,我实际上没有一个明确/可靠的答案来说明它的实际优势和原因是什么!我没有设计或实现CouchDB,多年来只是一个狂热的用户。
也许更大的优势是,在Couchbase和CouchDB 2.x这样的系统中,map/reduce思想的“并行友好性”可能会发挥更大的作用。因此,如果你已经设计了一个在CouchDB 1.x下工作的应用程序,那么它就可以在新版本中扩展,而不需要你的进一步干预。
https://stackoverflow.com/questions/37364458
复制相似问题