Hadoop和Couchbase结合使用的技巧(5)

在 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%22

Couchbase 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 查询已处理的信息。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/46d1805b0843d2593122f7e8650be7f3.html