在 Couchbase Server 中编写 MapReduce
在 Hadoop 中,MapReduce 函数是使用 Java 编写的。在 Couchbase Server 中,MapReduce 函数是使用 Javascript 编写的。作为一种已解释的语言,这意味着您不需要编译视图,它会支持您编辑和细化 MapReduce 结构。
要在 Couchbase Server 中创建一个视图,请打开管理控制台(在 :8091 上),然后单击 View 按钮。视图收集在一个设计文档中。您可以在单个设计文档中创建多个视图,也可以创建多个设计文档。要提升服务器的总体性能,系统还支持一种可编辑的开发视图以及一个无法编辑的生产视图。生产视图无法编辑是因为这么做会使视图索引无效,并会导致需要重新构建索引。
单击 Create Development View 按钮并命名您的设计文档和视图。
在 Couchbase Server 内,有两个相同的函数:map 和 reduce。map 函数用于将输入数据(JSON 文档)映射到某个表。然后使用 reduce 函数汇总和精减该表。reduce 函数是可选的,不是索引功能所必需的,所以,出于本文的目的,我们将忽略 reduce 函数。
对于 map 函数,函数的格式如 清单 6 所示。
清单 6. map 函数的格式
map(doc) { }参数 doc 是每个存储的 JSON 文档。Couchbase Server 的存储格式是一种 JSON 文档,视图是使用 Javascript 语言编写的,所以我们可使用以下语句访问 JSON 中一个名为 count 的字段:doc.count。
要从 map 函数发出信息,可以调用 emit() 函数。emit() 函数接受两个参数,第一个是键(用于选择和查询信息),第二个参数是相应的值。因此,我们可以创建一个 map 函数来使用来输出单词和计数,如 清单 7 中的代码所示。
清单 7. 输出单词和计数的 map 函数
function (doc) { if (doc.word) { emit(doc.word,doc.count); } }这将为每个输出文档输出一行数据,其中包含文档 ID(实际上是我们的单词)、用作键的单词和该单词在源文本中出现的次数。可在 清单 8 中看到原始的 JSON 输出。
清单 8. 原始的 JSON 输出
{"total_rows":113,"rows":[ {"id":"acceptance","key":"acceptance","value":2}, {"id":"accompagner","key":"accompagner","value":1}, {"id":"achieve","key":"achieve","value":1}, {"id":"adulteration","key":"adulteration","value":1}, {"id":"arsenic","key":"arsenic","value":2}, {"id":"attainder","key":"attainder","value":1}, {"id":"beerpull","key":"beerpull","value":2}, {"id":"beware","key":"beware","value":5}, {"id":"breeze","key":"breeze","value":2}, {"id":"brighteyed","key":"brighteyed","value":1} ] }在输出中,id 是文档 ID,key 是您在 emit 语句中指定的键,value 是在 emit 语句中指定的值。
获取实时数据
现在我们已在 Hadoop 中处理了信息,请将它导入 Couchbase Server 中,然后在 Couchbase Server 中为该数据创建了一个视图,我们可以开始查询已处理和存储的信息了。视图可使用一个 REST 样式的 API 来访问,或者在使用一个 Couchbase Server SDK 时,通过相应的视图查询函数来访问它。
查询可通过 3 种主要选择来执行:
单独的键。例如,显示与某个特定键(比如 'unkind')匹配的信息。
键列表。您可提供一个键值数组,这将返回其键值与一个提供的值匹配的所有记录。例如,['unkind','kind'] 将返回与其中一个单词匹配的记录。
键范围。您可指定一个开始和结束键。
例如,要找到一个指定的单词的数量,可使用 key 参数进行查询:
:8092/words/_design/dev_words/_view/byword?connection_timeout= 60000&limit=10&skip=0&key=%22breeze%22Couchbase Server 会很自然地采用 UTF-8 排序方式输出一个 MapReduce 的按指定的键排序的结果。这意味着您可以通过指定开始值和结束值来获取一个值范围。例如,要获取 'breeze' 与 'kind' 之间的所有单词,可使用:
:8092/words/_design/dev_words/_view/byword?connection_timeout= 60000&limit=10&skip=0&startkey=%22breeze%22&endkey=%22kind%22该查询很简单,但非常强大,尤其是在您认识到可以将它与灵活的视图系统结合使用,生成具有您想要的格式的数据的时候。
结束语
Hadoop 本身提供了一个强大的处理平台,但没有提供从已处理的数据中实际提取有用信息的方法。通过将 Hadoop 连接到另一个系统,可使用该系统来查询和提取信息。因为 Hadoop 使用 MapReduce 进行相关处理,所以您可以通过 Couchbase Server 中的 MapReduce 系统,利用 MapReduce 的知识来提供查询平台。使用此方法,您可以在 Hadoop 中处理数据,以 JSON 文档格式将数据从 Hadoop 导出到 Couchbase Server 中,然后在 Couchbase Server 中使用 MapReduce 查询已处理的信息。