結(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 所示。
安裝 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)行查詢: http://192.168.0.71:8092/words/_design/dev_words/_view/byword?connection_timeout=60000&limit=10&skip=0&key=%22breeze%22 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。 |
|