小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

結(jié)合使用Hadoop與Couchbase Server

 用勿龍潛 2014-01-14

結(jié)合使用Hadoop與Couchbase Server

  【IT168 技術(shù)】Hadoop 將許多重要特性結(jié)合在一起,這使 Hadoop 對(duì)于將大量數(shù)據(jù)分解為更小、實(shí)用的數(shù)據(jù)塊非常有用。

  Hadoop 的主要組件是 HDFS 文件系統(tǒng),它支持將信息分布到整個(gè)集群中。對(duì)于使用這種分布格式存儲(chǔ)的信息,可以通過(guò)一個(gè)名為 MapReduce 的系統(tǒng)在每個(gè)集群節(jié)點(diǎn)上進(jìn)行單獨(dú)處理。MapReduce 進(jìn)程將存儲(chǔ)在 HDFS 文件系統(tǒng)中的信息轉(zhuǎn)換為更小的、經(jīng)過(guò)處理的、更容易管理的數(shù)據(jù)塊。

  因?yàn)?Hadoop 可在多個(gè)節(jié)點(diǎn)上運(yùn)行,所以可以使用它來(lái)處理大量輸入數(shù)據(jù),并將這些數(shù)據(jù)簡(jiǎn)化為更實(shí)用的信息塊。此過(guò)程可使用一個(gè)簡(jiǎn)單的 MapReduce 系統(tǒng)來(lái)處理。

  MapReduce 轉(zhuǎn)換傳入信息(不一定為結(jié)構(gòu)化格式),將該信息轉(zhuǎn)換為一種可更輕松地使用、查詢和處理的結(jié)構(gòu)。

  例如,一種典型的用途是處理來(lái)自數(shù)百個(gè)不同應(yīng)用程序的日志信息,以便可以識(shí)別特定的問(wèn)題、計(jì)數(shù)或其他事件。通過(guò)使用 MapReduce 格式,您可以開(kāi)始度量并查找趨勢(shì),將平常非常多的信息轉(zhuǎn)換為更小的數(shù)據(jù)塊。舉例而言,在查看某個(gè) Web 服務(wù)器的日志時(shí),您可能希望查看特定頁(yè)面上的特定范圍中發(fā)生的錯(cuò)誤。您可以編寫一個(gè) MapReduce 函數(shù)來(lái)識(shí)別特定頁(yè)面上的特定錯(cuò)誤,并在輸出中生成該信息。使用此方法,您可從日志文件中精減多行信息,得到一個(gè)僅包含錯(cuò)誤信息的小得多的記錄集合。

  理解 MapReduce

  MapReduce 的工作方式分兩個(gè)階段。映射 (map) 過(guò)程獲取傳入信息,并將這些信息映射到某種標(biāo)準(zhǔn)化的格式。對(duì)于某些信息類型,此映射可以是直接和顯式的。例如,如果要處理 Web 日志等輸入數(shù)據(jù),那么僅從 Web 日志的文本中提取一列數(shù)據(jù)即可。對(duì)于其他數(shù)據(jù),映射可能更復(fù)雜。在處理文本信息時(shí),比如研究論文,您可能需要提取短語(yǔ)或更復(fù)雜的數(shù)據(jù)塊。

  精減 (reduce) 階段用于收集和匯總數(shù)據(jù)。精減實(shí)際上能夠以多種不同方式發(fā)生,但典型的過(guò)程是處理一個(gè)基本計(jì)數(shù)、總和或其他基于來(lái)自映射階段的個(gè)別數(shù)據(jù)的統(tǒng)計(jì)數(shù)據(jù)。

  想象一個(gè)簡(jiǎn)單的示例,比如 Hadoop 中用作示例 MapReduce 的字?jǐn)?shù),映射階段將對(duì)原始文本進(jìn)行分解,以識(shí)別各個(gè)單詞,并為每個(gè)單詞生成一個(gè)輸出數(shù)據(jù)塊。reduce 函數(shù)獲取這些映射的信息塊,對(duì)它們進(jìn)行精減,以便在所看到的每個(gè)惟一單詞上進(jìn)行遞增。給定一個(gè)包含 100 個(gè)單詞的文本文件,映射過(guò)程將生成 100 個(gè)數(shù)據(jù)塊,但精減階段可對(duì)此進(jìn)行匯總,提供惟一單詞的數(shù)量(比如 56 個(gè))和每個(gè)單詞出現(xiàn)的次數(shù)。

  借助 Web 日志,映射將獲取輸入數(shù)據(jù),為日志文件中的每個(gè)錯(cuò)誤創(chuàng)建一條記錄,然后為每個(gè)錯(cuò)誤生成一個(gè)數(shù)據(jù)塊,其中包含日期、時(shí)間和導(dǎo)致該問(wèn)題的頁(yè)面。

  在 Hadoop 內(nèi),MapReduce 階段會(huì)出現(xiàn)在存儲(chǔ)各個(gè)源信息塊的各個(gè)節(jié)點(diǎn)上。這使 Hadoop 能夠處理以下大型信息集:通過(guò)允許多個(gè)節(jié)點(diǎn)同時(shí)處理數(shù)據(jù)。例如,對(duì)于 100 個(gè)節(jié)點(diǎn),可以同時(shí)處理 100 個(gè)日志文件,比通過(guò)單個(gè)節(jié)點(diǎn)快得多地簡(jiǎn)化許多 GB(或 TB)的信息。

  Hadoop 信息

  核心 Hadoop 產(chǎn)品的一個(gè)主要限制是,無(wú)法在數(shù)據(jù)庫(kù)中存儲(chǔ)和查詢信息。數(shù)據(jù)添加到 HDFS 系統(tǒng)中,但您無(wú)法要求 Hadoop 返回與某個(gè)特定數(shù)據(jù)集匹配的所有數(shù)據(jù)的列表。主要原因是 Hadoop 不會(huì)存儲(chǔ)、結(jié)構(gòu)化或理解存儲(chǔ)在 HDFS 中的數(shù)據(jù)的結(jié)構(gòu)。這正是 MapReduce 系統(tǒng)需要將信息分析并處理為更加結(jié)構(gòu)化的格式的原因。

  但是,我們可以將 Hadoop 的處理能力與更加傳統(tǒng)的數(shù)據(jù)庫(kù)相結(jié)合,使我們可以查詢 Hadoop 通過(guò)自己的 MapReduce 系統(tǒng)生成的數(shù)據(jù)??赡艿慕鉀Q方案有許多,其中包括一些傳統(tǒng) SQL 數(shù)據(jù)庫(kù),但我們可以通過(guò)使用 Couchbase Server 來(lái)保持 MapReduce 風(fēng)格(它對(duì)大型數(shù)據(jù)集非常有效)。

  系統(tǒng)之間的數(shù)據(jù)共享的基本結(jié)構(gòu)如 圖 1 所示。

結(jié)合使用Hadoop與Couchbase Server
▲圖 1. 系統(tǒng)之間的數(shù)據(jù)共享的基本結(jié)構(gòu)


  安裝 Hadoop

  如果您尚未安裝 Hadoop,最簡(jiǎn)單的方法是使用一個(gè) Cloudera 安裝。為了保持 Hadoop、Sqoop 和 Couchbase 之間的兼容性,最好的解決方案是使用 CDH3 安裝(參閱 參考資料)。為此,您需要使用 Ubuntu 10.10 到 11.10 版。更高的 Ubuntu 版本會(huì)引入不兼容問(wèn)題,因?yàn)樗鼈儾辉僦С?Cloudera Hadoop 安裝所需的一個(gè)包。

  在安裝之前,請(qǐng)確保已經(jīng)安裝了一個(gè) Java? 虛擬機(jī),確保在 JAVA_HOME 變量中為 JDK 配置了正確的主目錄。請(qǐng)注意,您必須擁有完整的 Java 開(kāi)發(fā)工具包,而不只是擁有 Java 運(yùn)行時(shí)環(huán)境 (JRE),因?yàn)?Sqoop 將代碼編譯為 Couchbase Server 與 Hadoop 之間的導(dǎo)出和導(dǎo)入數(shù)據(jù)。

  要在 Ubuntu 和類似的系統(tǒng)上使用 CDH3 安裝,您需要執(zhí)行以下步驟:

  1.下載 CDH3 配置包。這會(huì)將 CDH3 源文件的配置添加到 apt 存儲(chǔ)庫(kù)中。

  2.更新您的存儲(chǔ)庫(kù)緩存:$ apt-get update。

  3.安裝主要 Hadoop 包:$ apt-get install hadoop-0.20。

  4.安裝 Hadoop 組件(參見(jiàn) 清單 1)。

  清單 1. 安裝 Hadoop 組件

$ for comp in namenode datanode secondarynamenode jobtracker tasktracker
do
apt-get install hadoop-0.20-$comp
done

  5.編輯配置文件,以確保您設(shè)置了核心組件。

  6.編輯 /etc/hadoop/conf/core-site.xml,使其如 清單 2 所示。

  清單 2. 編輯后的 /etc/hadoop/conf/core-site.xml 文件

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

  這將配置存儲(chǔ)數(shù)據(jù)的默認(rèn) hdfs 位置。

  編輯 /etc/hadoop/conf/hdfs-site.xml(參見(jiàn) 清單 3)。

  清單 3. 編輯后的 /etc/hadoop/conf/hdfs-site.xml 文件

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

  這支持復(fù)制存儲(chǔ)的數(shù)據(jù)。

  編輯 /etc/hadoop/conf/mapred-site.xml(參見(jiàn) 清單 4)。

  清單 4. 編輯后的 /etc/hadoop/conf/mapred-site.xml 文件

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>

  這實(shí)現(xiàn)了 MapReduce 的作業(yè)跟蹤器。

  7.最后,編輯 Hadoop 環(huán)境,使其正確地指向 /usr/lib/hadoop/conf/hadoop-env.sh 中您的 JDK 安裝目錄。其中會(huì)有一個(gè)注釋掉的 JAVA_HOME 變量行。您應(yīng)該取消注釋它,并將它設(shè)置為您的 JDK 位置。例如:export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk。

  8.現(xiàn)在,在您的系統(tǒng)上啟動(dòng) Hadoop。最簡(jiǎn)單的方法是使用 start-all.sh 腳本:$ /usr/lib/hadoop/bin/start-all.sh。

  假設(shè)所有設(shè)置均已正確配置,您現(xiàn)在應(yīng)有一個(gè)正在運(yùn)行的 Hadoop 系統(tǒng)。

  Couchbase Server 概述

  Couchbase Server 是一個(gè)集群化的、基于文檔的數(shù)據(jù)庫(kù)系統(tǒng),它使用一個(gè)緩存層來(lái)提供非常快的數(shù)據(jù)訪問(wèn),將大部分?jǐn)?shù)據(jù)都存儲(chǔ)在 RAM 中。該系統(tǒng)使用多個(gè)節(jié)點(diǎn)和一個(gè)自動(dòng)分散在整個(gè)集群上的緩存層。這實(shí)現(xiàn)了一種彈性,您可擴(kuò)大和緊縮集群,以便利用更多 RAM 或磁盤 I/O 來(lái)幫助提升性能。

  Couchbase Server 中的所有數(shù)據(jù)最終會(huì)持久存儲(chǔ)在磁盤中,但最初會(huì)通過(guò)緩存層執(zhí)行寫入和更新操作,這正是提供高性能的源泉,是我們通過(guò)處理 Hadoop 數(shù)據(jù)來(lái)獲得實(shí)時(shí)信息和查詢內(nèi)容時(shí)可利用的優(yōu)勢(shì)。

  Couchbase Server 的基本形式是一個(gè)基本文檔和基于鍵/值的存儲(chǔ)。只有在您知道文檔 ID 時(shí),才能檢索集群提供的信息。在 Couchbase Server 2.0 中,您可以將文檔存儲(chǔ)為 JSON 格式,然后使用視圖系統(tǒng)在存儲(chǔ)的 JSON 文檔上創(chuàng)建一個(gè)視圖。視圖是在存儲(chǔ)在數(shù)據(jù)庫(kù)中的文檔上執(zhí)行的一個(gè) MapReduce 組合。來(lái)自視圖的輸出是一個(gè)索引,它通過(guò) MapReduce 函數(shù)來(lái)匹配您定義的結(jié)構(gòu)。索引的存在為您提供了查詢底層的文檔數(shù)據(jù)的能力。

  我們可以使用此功能從 Hadoop 獲取已處理的信息,將該信息存儲(chǔ)在 Couchbase Server 中,然后使用它作為查詢?cè)摂?shù)據(jù)的基礎(chǔ)。Couchbase Server 可以方便地使用一個(gè) MapReduce 系統(tǒng)來(lái)處理文檔和創(chuàng)建索引。這在用于處理數(shù)據(jù)的方法之間提供了一定的兼容性和一致性水平。

  安裝 Couchbase Server

  安裝 Couchbase Server 很容易。從 Couchbase 網(wǎng)站下載適合您平臺(tái)的 Couchbase Server 2.0 版本(參見(jiàn) 參考資料),使用 dpkg 或 RPM(具體依賴于您的平臺(tái))安裝該包。

  安裝之后,Couchbase Server 會(huì)自動(dòng)啟動(dòng)。要配置它,請(qǐng)打開(kāi)一個(gè) Web 瀏覽器,并將它指向您的機(jī)器的 localhost:8091(或使用該機(jī)器的 IP 地址遠(yuǎn)程訪問(wèn)它)。

  按照屏幕上的配置說(shuō)明進(jìn)行操作。您可使用在安裝期間提供的大部分默認(rèn)設(shè)置,但最重要的設(shè)置是寫入數(shù)據(jù)庫(kù)中的數(shù)據(jù)的數(shù)據(jù)文件的位置,以及您分配給 Couchbase Server 的 RAM 量。

  使 Couchbase Server 能夠與 Hadoop 連接器通信

  Couchbase Server 使用 Sqoop 連接器與您的 Hadoop 集群通信。Sqoop 提供了一個(gè)連接在 Hadoop 與 Couchbase Server 之間批量傳輸數(shù)據(jù)。

  從技術(shù)上講,Sqoop 是一個(gè)設(shè)計(jì)用于在結(jié)構(gòu)化數(shù)據(jù)庫(kù)與 Hadoop 之間轉(zhuǎn)換信息的應(yīng)用程序。Sqoop 這個(gè)名稱實(shí)際上來(lái)源于 SQL 和 Hadoop。

  安裝 Sqoop

  如果使用 CDH3 安裝,您可使用報(bào)管理器來(lái)安裝 Sqoop:$ sudo apt-get install sqoop。

  這將把 Sqoop 安裝在 /usr/lib/sqoop 中。

  注意:Sqoop 中一個(gè)最新的 bug 表明它有時(shí)會(huì)嘗試傳輸uowu的數(shù)據(jù)集。修補(bǔ)程序包含在 Sqoop 1.4.2 版中。如果遇到問(wèn)題,請(qǐng)嘗試使用 V1.4.2 或更高的版本。

  安裝 Couchbase Hadoop Connector

  Couchbase Hadoop Connector 是一個(gè)支持 Sqoop 與 Couchbase 之間的連接的 Java jar 文件集合。從 Couchbase 網(wǎng)站下載 Hadoop 連接器(參閱 參考資料)。該文件封裝為一個(gè) zip 文件。解壓它,然后運(yùn)行其中的 install.sh 腳本,提供 Sqoop 系統(tǒng)的位置。例如:$ sudo bash install.sh /usr/lib/sqoop。

  這將安裝所有必要的庫(kù)和配置文件?,F(xiàn)在我們可以開(kāi)始在兩個(gè)系統(tǒng)之間交換信息了。


  將數(shù)據(jù)從 Couchbase Server 導(dǎo)入 Hadoop

  盡管該場(chǎng)景不是我們這里將直接處理的場(chǎng)景,但需要注意我們可從 Couchbase Server 將數(shù)據(jù)導(dǎo)入 Hadoop。如果您在 Couchbase Server 中加載了大量數(shù)據(jù),并希望利用 Hadoop 來(lái)處理和簡(jiǎn)化它,這可能很有用。為此,您可以使用以下命令,從 Couchbase Server 將整個(gè)數(shù)據(jù)集加載到 HDFS 中的一個(gè) Hadoop 文件中:$ sqoop import --connect http://192.168.0.71:8091/pools --table cbdata。

  這里提供的 URL 是 Couchbase Server 桶池 (bucket pool) 的位置。這里指定的表實(shí)際上是 HDFS 中將存儲(chǔ)數(shù)據(jù)的目錄的名稱。

  數(shù)據(jù)本身被存儲(chǔ)為來(lái)自 Couchbase Server 的信息的一種鍵/值轉(zhuǎn)儲(chǔ)形式。在 Couchbase Server 2.0 中,這意味著數(shù)據(jù)是使用惟一文檔 ID 寫出的,包含記錄的 JSON 值。

  將 JSON 數(shù)據(jù)寫入 Hadoop MapReduce

  要在 Hadoop 與 Couchbase Server 之間交換信息,需要使用一種通用語(yǔ)言來(lái)表達(dá)這些信息,在本例中使用的是 JSON(參見(jiàn) 清單 5)。

  清單 5. 在 Hadoop MapReduce 中輸出 JSON

package org.mcslp;
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;
import com.google.gson.*;
public class WordCount {
public static class Map extends MapReduceBase implements Mapper 
Text, Text, IntWritable
> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, OutputCollector 
IntWritable
> output, Reporter reporter) throws IOException {
String line 
= value.toString();
StringTokenizer tokenizer 
= new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
}
public static class Reduce extends MapReduceBase implements Reducer 
IntWritable, Text, Text
> {
class wordRecord {
private String word;
private int count;
wordRecord() {
}
}
public void reduce(Text key,
Iterator values,
OutputCollector output,
Reporter reporter) 
throws IOException {
int sum = 0;
while (values.hasNext()) {
sum 
+= values.next().get();
}
wordRecord word 
= new wordRecord();
word.word 
= key.toString();;
word.count 
= sum;
Gson json 
= new Gson();
System.out.println(json.toJson(word));
output.collect(key, 
new Text(json.toJson(word)));
}
}
public static void main(String[] args) throws Exception {
JobConf conf 
= new JobConf(WordCount.class);
conf.setJobName(
"wordcount");
conf.setOutputKeyClass(Text.
class);
conf.setOutputValueClass(IntWritable.
class);
conf.setMapperClass(Map.
class);
conf.setReducerClass(Reduce.
class);
conf.setInputFormat(TextInputFormat.
class);
conf.setOutputFormat(TextOutputFormat.
class);
FileInputFormat.setInputPaths(conf, 
new Path(args[0]));
FileOutputFormat.setOutputPath(conf, 
new Path(args[1]));
JobClient.runJob(conf);
}
}

  該代碼是 Hadoop 發(fā)行版所提供的字?jǐn)?shù)示例的修改版。

  此版本使用 Google Gson 庫(kù)從處理過(guò)程的精減階段寫入 JSON 信息。為了方便起見(jiàn),我們使用了一個(gè)新類 (wordRecord),它由 Gson 轉(zhuǎn)換為一條 JSON 記錄,這種記錄是 Couchbase Server 逐個(gè)文檔地處理和解析內(nèi)容所需的格式。

  請(qǐng)注意,我們沒(méi)有為 Hadoop 定義一個(gè) Combiner 類。這將阻止 Hadoop 嘗試重新精減該信息,該操作在當(dāng)前的代碼中會(huì)失敗,因?yàn)槲覀兊木珳p階段僅接收該單詞和一位數(shù),并輸出一個(gè) JSON 值。對(duì)于輔助的精減/組合階段,我們需要解析 JSON 輸入或定義一個(gè)新 Combiner 類,以便輸出信息的 JSON 版本。這稍微簡(jiǎn)化了定義。

  要在 Hadoop 中使用此代碼,首先需要將 Google Gson 庫(kù)復(fù)制到 Hadoop 目錄中 (/usr/lib/hadoop/lib)。然后重新啟動(dòng) Hadoop,以確保 Hadoop 已經(jīng)正確識(shí)別出該庫(kù)。

  接下來(lái),將您的代碼編譯到一個(gè)目錄中: $ javac -classpath ${HADOOP_HOME}/hadoop-${HADOOP_VERSION}-core.jar:./google-gson-2.2.1/gson-2.2.1.jar -d wordcount_classes WordCount.java 。

  現(xiàn)在為您的庫(kù)創(chuàng)建一個(gè) jar 文件: $ jar -cvf wordcount.jar -C wordcount_classes/。

  完成此過(guò)程后,您可以將一些文本文件復(fù)制到某個(gè)目錄中,然后使用此 jar 文件將這些文本文件處理為許多獨(dú)立的單詞,創(chuàng)建一條 JSON 記錄來(lái)包含每個(gè)單詞和計(jì)數(shù)。例如,要在一些 Project Gutenberg 文本上處理此數(shù)據(jù): $ hadoop jar wordcount.jar org.mcslp.WordCount /user/mc/gutenberg /user/mc/gutenberg-output。

  這將在我們的目錄中生成已由 Hadoop 內(nèi)的 MapReduce 函數(shù)統(tǒng)計(jì)的單詞列表。

  將數(shù)據(jù)從 Hadoop 導(dǎo)出到 Couchbase Server

  要從 Hadoop 取回?cái)?shù)據(jù)并導(dǎo)入 Couchbase Server 中,則需要使用 Sqoop 導(dǎo)出該數(shù)據(jù): $ sqoop export --connect http://10.2.1.55:8091/pools --table ignored --export-dir gutenberg-output。

  此示例中忽略了 --table 參數(shù),但 --export-dir 是要導(dǎo)出的信息所在的目錄的名稱。


  在 Couchbase Server 中編寫 MapReduce

  在 Hadoop 中,MapReduce 函數(shù)是使用 Java 編寫的。在 Couchbase Server 中,MapReduce 函數(shù)是使用 Javascript 編寫的。作為一種已解釋的語(yǔ)言,這意味著您不需要編譯視圖,它會(huì)支持您編輯和細(xì)化 MapReduce 結(jié)構(gòu)。

  要在 Couchbase Server 中創(chuàng)建一個(gè)視圖,請(qǐng)打開(kāi)管理控制臺(tái)(在 http://localhost:8091 上),然后單擊 View 按鈕。視圖收集在一個(gè)設(shè)計(jì)文檔中。您可以在單個(gè)設(shè)計(jì)文檔中創(chuàng)建多個(gè)視圖,也可以創(chuàng)建多個(gè)設(shè)計(jì)文檔。要提升服務(wù)器的總體性能,系統(tǒng)還支持一種可編輯的開(kāi)發(fā)視圖以及一個(gè)無(wú)法編輯的生產(chǎn)視圖。生產(chǎn)視圖無(wú)法編輯是因?yàn)檫@么做會(huì)使視圖索引無(wú)效,并會(huì)導(dǎo)致需要重新構(gòu)建索引。

  單擊 Create Development View 按鈕并命名您的設(shè)計(jì)文檔和視圖。

  在 Couchbase Server 內(nèi),有兩個(gè)相同的函數(shù):map 和 reduce。map 函數(shù)用于將輸入數(shù)據(jù)(JSON 文檔)映射到某個(gè)表。然后使用 reduce 函數(shù)匯總和精減該表。reduce 函數(shù)是可選的,不是索引功能所必需的,所以,出于本文的目的,我們將忽略 reduce 函數(shù)。

  對(duì)于 map 函數(shù),函數(shù)的格式如 清單 6 所示。

  清單 6. map 函數(shù)的格式

map(doc) {
}

  參數(shù) doc 是每個(gè)存儲(chǔ)的 JSON 文檔。Couchbase Server 的存儲(chǔ)格式是一種 JSON 文檔,視圖是使用 Javascript 語(yǔ)言編寫的,所以我們可使用以下語(yǔ)句訪問(wèn) JSON 中一個(gè)名為 count 的字段:doc.count。

  要從 map 函數(shù)發(fā)出信息,可以調(diào)用 emit() 函數(shù)。emit() 函數(shù)接受兩個(gè)參數(shù),第一個(gè)是鍵(用于選擇和查詢信息),第二個(gè)參數(shù)是相應(yīng)的值。因此,我們可以創(chuàng)建一個(gè) map 函數(shù)來(lái)使用來(lái)輸出單詞和計(jì)數(shù),如 清單 7 中的代碼所示。

  清單 7. 輸出單詞和計(jì)數(shù)的 map 函數(shù)

function (doc) {
if (doc.word) {
emit(doc.word,doc.count);
}
}

  這將為每個(gè)輸出文檔輸出一行數(shù)據(jù),其中包含文檔 ID(實(shí)際上是我們的單詞)、用作鍵的單詞和該單詞在源文本中出現(xiàn)的次數(shù)??稍?清單 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 語(yǔ)句中指定的鍵,value 是在 emit 語(yǔ)句中指定的值。

  獲取實(shí)時(shí)數(shù)據(jù)

  現(xiàn)在我們已在 Hadoop 中處理了信息,請(qǐng)將它導(dǎo)入 Couchbase Server 中,然后在 Couchbase Server 中為該數(shù)據(jù)創(chuàng)建了一個(gè)視圖,我們可以開(kāi)始查詢已處理和存儲(chǔ)的信息了。視圖可使用一個(gè) REST 樣式的 API 來(lái)訪問(wèn),或者在使用一個(gè) Couchbase Server SDK 時(shí),通過(guò)相應(yīng)的視圖查詢函數(shù)來(lái)訪問(wèn)它。

  查詢可通過(guò) 3 種主要選擇來(lái)執(zhí)行:

  單獨(dú)的鍵。例如,顯示與某個(gè)特定鍵(比如 'unkind')匹配的信息。

  鍵列表。您可提供一個(gè)鍵值數(shù)組,這將返回其鍵值與一個(gè)提供的值匹配的所有記錄。例如,['unkind','kind'] 將返回與其中一個(gè)單詞匹配的記錄。

  鍵范圍。您可指定一個(gè)開(kāi)始和結(jié)束鍵。

  例如,要找到一個(gè)指定的單詞的數(shù)量,可使用 key 參數(shù)進(jìn)行查詢:

  Couchbase Server 會(huì)很自然地采用 UTF-8 排序方式輸出一個(gè) MapReduce 的按指定的鍵排序的結(jié)果。這意味著您可以通過(guò)指定開(kāi)始值和結(jié)束值來(lái)獲取一個(gè)值范圍。例如,要獲取 'breeze' 與 'kind' 之間的所有單詞,可使用:

http://192.168.0.71:8092/words/_design/dev_words/_view/byword?connection_timeout=60000&limit=10&skip=0&startkey=%22breeze%22&endkey=%22kind%22

  該查詢很簡(jiǎn)單,但非常強(qiáng)大,尤其是在您認(rèn)識(shí)到可以將它與靈活的視圖系統(tǒng)結(jié)合使用,生成具有您想要的格式的數(shù)據(jù)的時(shí)候。

  結(jié)束語(yǔ)

  Hadoop 本身提供了一個(gè)強(qiáng)大的處理平臺(tái),但沒(méi)有提供從已處理的數(shù)據(jù)中實(shí)際提取有用信息的方法。通過(guò)將 Hadoop 連接到另一個(gè)系統(tǒng),可使用該系統(tǒng)來(lái)查詢和提取信息。因?yàn)?Hadoop 使用 MapReduce 進(jìn)行相關(guān)處理,所以您可以通過(guò) Couchbase Server 中的 MapReduce 系統(tǒng),利用 MapReduce 的知識(shí)來(lái)提供查詢平臺(tái)。使用此方法,您可以在 Hadoop 中處理數(shù)據(jù),以 JSON 文檔格式將數(shù)據(jù)從 Hadoop 導(dǎo)出到 Couchbase Server 中,然后在 Couchbase Server 中使用 MapReduce 查詢已處理的信息。

  關(guān)于作者:Martin 'MC' Brown 擔(dān)任了 15 年的專業(yè)撰稿人,是超過(guò) 26 本涉及各種主題的圖書的作者和撰稿人,其中包括最近出版的 Getting Started with CouchDB。他的專長(zhǎng)領(lǐng)域涉及很多開(kāi)發(fā)語(yǔ)言和平臺(tái),包括 Perl、Python、Java、JavaScript、Basic、Pascal、Modula-2、C、C++、Rebol、Gawk、Shellscript、Windows、Solaris、Linux、BeOS、Microsoft? WP、Mac OS 等。他是 LAMP Technologies Editor for LinuxWorld 期刊的創(chuàng)始人,定期在 ServerWatch.com、LinuxPlanet、ComputerWorld 和 IBM developerWorks 上發(fā)表文章。他擁有豐富且多樣化的職業(yè)經(jīng)歷,是著名的 UK ISP 的創(chuàng)始人之一、一家廣告機(jī)構(gòu)和 Internet 解決方案集團(tuán)的系統(tǒng)經(jīng)理和 IT 顧問(wèn)、一家跨國(guó) ISP 網(wǎng)絡(luò)公司的技術(shù)專家,以及數(shù)據(jù)庫(kù)設(shè)計(jì)師和程序員,還自稱是計(jì)算硬件和軟件的發(fā)燒級(jí)用戶。MC 目前是 Technical Publications and Education for Couchbase 的副總裁,負(fù)責(zé)所有出版的文檔、培訓(xùn)計(jì)劃、培訓(xùn)內(nèi)容和 Couchbase Techzone。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多