結合使用 Hadoop 和 Couchbase

發表於2013-03-16

來源:IBM Developerworks

簡介: Hadoop 非常適合處理大量資料並將該資訊解析為您可查詢的較小的資訊集。但是,通過與 Couchbase Server 整合,您可以對資訊執行實時查詢和報告,同時繼續使用 Hadoop 處理大型資料集和資料集的繁重處理工作。Couchbase Server 還使用了一個 MapReduce 查詢系統,這使您能夠輕鬆地遷移和整合索引和查詢系統,從而有效地提取和操作資訊。

Hadoop 和資料處理

Hadoop 將許多重要特性結合在一起,這使 Hadoop 對於將大量資料分解為更小、實用的資料塊非常有用。

Hadoop 的主要元件是 HDFS 檔案系統,它支援將資訊分佈到整個叢集中。對於使用這種分佈格式儲存的資訊,可以通過一個名為 MapReduce 的系統在每個叢集節點上進行單獨處理。MapReduce 程式將儲存在 HDFS 檔案系統中的資訊轉換為更小的、經過處理的、更容易管理的資料塊。

因為 Hadoop 可在多個節點上執行,所以可以使用它來處理大量輸入資料,並將這些資料簡化為更實用的資訊塊。此過程可使用一個簡單的 MapReduce 系統來處理。

MapReduce 轉換傳入資訊(不一定為結構化格式),將該資訊轉換為一種可更輕鬆地使用、查詢和處理的結構。

例如,一種典型的用途是處理來自數百個不同應用程式的日誌資訊,以便可以識別特定的問題、計數或其他事件。通過使用 MapReduce 格式,您可以開始度量並查詢趨勢,將平常非常多的資訊轉換為更小的資料塊。舉例而言,在檢視某個 Web 伺服器的日誌時,您可能希望檢視特定頁面上的特定範圍中發生的錯誤。您可以編寫一個 MapReduce 函式來識別特定頁面上的特定錯誤,並在輸出中生成該資訊。使用此方法,您可從日誌檔案中精減多行資訊,得到一個僅包含錯誤資訊的小得多的記錄集合。

理解 MapReduce

MapReduce 的工作方式分兩個階段。對映 (map) 過程獲取傳入資訊,並將這些資訊對映到某種標準化的格式。對於某些資訊型別,此對映可以是直接和顯式的。例如,如果要處理 Web 日誌等輸入資料,那麼僅從 Web 日誌的文字中提取一列資料即可。對於其他資料,對映可能更復雜。在處理文字資訊時,比如研究論文,您可能需要提取短語或更復雜的資料塊。

精減 (reduce) 階段用於收集和彙總資料。精減實際上能夠以多種不同方式發生,但典型的過程是處理一個基本計數、總和或其他基於來自對映階段的個別資料的統計資料。

想象一個簡單的示例,比如 Hadoop 中用作示例 MapReduce 的字數,對映階段將對原始文字進行分解,以識別各個單詞,併為每個單詞生成一個輸出資料塊。reduce 函式獲取這些對映的資訊塊,對它們進行精減,以便在所看到的每個惟一單詞上進行遞增。給定一個包含 100 個單詞的文字檔案,對映過程將生成 100 個資料塊,但精減階段可對此進行彙總,提供惟一單詞的數量(比如 56 個)和每個單詞出現的次數。

藉助 Web 日誌,對映將獲取輸入資料,為日誌檔案中的每個錯誤建立一條記錄,然後為每個錯誤生成一個資料塊,其中包含日期、時間和導致該問題的頁面。

在 Hadoop 內,MapReduce 階段會出現在儲存各個源資訊塊的各個節點上。這使 Hadoop 能夠處理以下大型資訊集:通過允許多個節點同時處理資料。例如,對於 100 個節點,可以同時處理 100 個日誌檔案,比通過單個節點快得多地簡化許多 GB(或 TB)的資訊。

Hadoop 資訊

核心 Hadoop 產品的一個主要限制是,無法在資料庫中儲存和查詢資訊。資料新增到 HDFS 系統中,但您無法要求 Hadoop 返回與某個特定資料集匹配的所有資料的列表。主要原因是 Hadoop 不會儲存、結構化或理解儲存在 HDFS 中的資料的結構。這正是 MapReduce 系統需要將資訊分析並處理為更加結構化的格式的原因。

但是,我們可以將 Hadoop 的處理能力與更加傳統的資料庫相結合,使我們可以查詢 Hadoop 通過自己的 MapReduce 系統生成的資料。可能的解決方案有許多,其中包括一些傳統 SQL 資料庫,但我們可以通過使用 Couchbase Server 來保持 MapReduce 風格(它對大型資料集非常有效)。

系統之間的資料共享的基本結構如 圖 1 所示。

圖 1. 系統之間的資料共享的基本結構
結合使用 Hadoop 和 Couchbase

安裝 Hadoop

如果您尚未安裝 Hadoop,最簡單的方法是使用一個 Cloudera 安裝。為了保持 Hadoop、Sqoop 和 Couchbase 之間的相容性,最好的解決方案是使用 CDH3 安裝(參閱 參考資料)。為此,您需要使用 Ubuntu 10.10 到 11.10 版。更高的 Ubuntu 版本會引入不相容問題,因為它們不再支援 Cloudera Hadoop 安裝所需的一個包。

在安裝之前,請確保已經安裝了一個 Java™ 虛擬機器,確保在 JAVA_HOME 變數中為 JDK 配置了正確的主目錄。請注意,您必須擁有完整的 Java 開發工具包,而不只是擁有 Java 執行時環境 (JRE),因為 Sqoop 將程式碼編譯為 Couchbase Server 與 Hadoop 之間的匯出和匯入資料。

要在 Ubuntu 和類似的系統上使用 CDH3 安裝,您需要執行以下步驟:

1.  下載 CDH3 配置包。這會將 CDH3 原始檔的配置新增到 apt 儲存庫中。

2.  更新您的儲存庫快取:

3.  安裝主要 Hadoop 包:

4.  安裝 Hadoop 元件(參見 清單 1)。

清單 1. 安裝 Hadoop 元件

5.  編輯配置檔案,以確保您設定了核心元件。

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

清單 2. 編輯後的 /etc/hadoop/conf/core-site.xml 檔案

這將配置儲存資料的預設 hdfs 位置。

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

清單 3. 編輯後的 /etc/hadoop/conf/hdfs-site.xml 檔案

這支援複製儲存的資料。

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

清單 4. 編輯後的 /etc/hadoop/conf/mapred-site.xml 檔案

這實現了 MapReduce 的作業跟蹤器。

7.  最後,編輯 Hadoop 環境,使其正確地指向 /usr/lib/hadoop/conf/hadoop-env.sh 中您的 JDK 安裝目錄。其中會有一個註釋掉的 JAVA_HOME 變數行。您應該取消註釋它,並將它設定為您的 JDK 位置。例如:

8.  現在,在您的系統上啟動 Hadoop。最簡單的方法是使用 start-all.sh 指令碼:

假設所有設定均已正確配置,您現在應有一個正在執行的 Hadoop 系統。

 Couchbase Server 概述

Couchbase Server 是一個叢集化的、基於文件的資料庫系統,它使用一個快取層來提供非常快的資料訪問,將大部分資料都儲存在 RAM 中。該系統使用多個節點和一個自動分散在整個叢集上的快取層。這實現了一種彈性,您可擴大和緊縮叢集,以便利用更多 RAM 或磁碟 I/O 來幫助提升效能。

Couchbase Server 中的所有資料最終會持久儲存在磁碟中,但最初會通過快取層執行寫入和更新操作,這正是提供高效能的源泉,是我們通過處理 Hadoop 資料來獲得實時資訊和查詢內容時可利用的優勢。

Couchbase Server 的基本形式是一個基本文件和基於鍵/值的儲存。只有在您知道文件 ID 時,才能檢索叢集提供的資訊。在 Couchbase Server 2.0 中,您可以將文件儲存為 JSON 格式,然後使用檢視系統在儲存的 JSON 文件上建立一個檢視。檢視是在儲存在資料庫中的文件上執行的一個 MapReduce 組合。來自檢視的輸出是一個索引,它通過 MapReduce 函式來匹配您定義的結構。索引的存在為您提供了查詢底層的文件資料的能力。

我們可以使用此功能從 Hadoop 獲取已處理的資訊,將該資訊儲存在 Couchbase Server 中,然後使用它作為查詢該資料的基礎。Couchbase Server 可以方便地使用一個 MapReduce 系統來處理文件和建立索引。這在用於處理資料的方法之間提供了一定的相容性和一致性水平。

安裝 Couchbase Server

安裝 Couchbase Server 很容易。從 Couchbase 網站下載適合您平臺的 Couchbase Server 2.0 版本(參見 參考資料),使用 dpkg 或 RPM(具體依賴於您的平臺)安裝該包。

安裝之後,Couchbase Server 會自動啟動。要配置它,請開啟一個 Web 瀏覽器,並將它指向您的機器的 localhost:8091(或使用該機器的 IP 地址遠端訪問它)。

按照螢幕上的配置說明進行操作。您可使用在安裝期間提供的大部分預設設定,但最重要的設定是寫入資料庫中的資料的資料檔案的位置,以及您分配給 Couchbase Server 的 RAM 量。

 使 Couchbase Server 能夠與 Hadoop 聯結器通訊

Couchbase Server 使用 Sqoop 聯結器與您的 Hadoop 叢集通訊。Sqoop 提供了一個連線在 Hadoop 與 Couchbase Server 之間批量傳輸資料。

從技術上講,Sqoop 是一個設計用於在結構化資料庫與 Hadoop 之間轉換資訊的應用程式。Sqoop 這個名稱實際上來源於 SQL 和 Hadoop。

安裝 Sqoop

如果使用 CDH3 安裝,您可使用報管理器來安裝 Sqoop:$ sudo apt-get install sqoop

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

注意:Sqoop 中一個最新的 bug 表明它有時會嘗試傳輸uowu的資料集。修補程式包含在 Sqoop 1.4.2 版中。如果遇到問題,請嘗試使用 V1.4.2 或更高的版本。

安裝 Couchbase Hadoop Connector

Couchbase Hadoop Connector 是一個支援 Sqoop 與 Couchbase 之間的連線的 Java jar 檔案集合。從 Couchbase 網站下載 Hadoop 聯結器(參閱 參考資料)。該檔案封裝為一個 zip 檔案。解壓它,然後執行其中的 install.sh 指令碼,提供 Sqoop 系統的位置。例如:

這將安裝所有必要的庫和配置檔案。現在我們可以開始在兩個系統之間交換資訊了。

將資料從 Couchbase Server 匯入 Hadoop

儘管該場景不是我們這裡將直接處理的場景,但需要注意我們可從 Couchbase Server 將資料匯入 Hadoop。如果您在 Couchbase Server 中載入了大量資料,並希望利用 Hadoop 來處理和簡化它,這可能很有用。為此,您可以使用以下命令,從 Couchbase Server 將整個資料集載入到 HDFS 中的一個 Hadoop 檔案中:

這裡提供的 URL 是 Couchbase Server 桶池 (bucket pool) 的位置。這裡指定的表實際上是 HDFS 中將儲存資料的目錄的名稱。

資料本身被儲存為來自 Couchbase Server 的資訊的一種鍵/值轉儲形式。在 Couchbase Server 2.0 中,這意味著資料是使用惟一文件 ID 寫出的,包含記錄的 JSON 值。

將 JSON 資料寫入 Hadoop MapReduce

要在 Hadoop 與 Couchbase Server 之間交換資訊,需要使用一種通用語言來表達這些資訊,在本例中使用的是 JSON(參見 清單 5)。

清單 5. 在 Hadoop MapReduce 中輸出 JSON

該程式碼是 Hadoop 發行版所提供的字數示例的修改版。

此版本使用 Google Gson 庫從處理過程的精減階段寫入 JSON 資訊。為了方便起見,我們使用了一個新類 (wordRecord),它由 Gson 轉換為一條 JSON 記錄,這種記錄是 Couchbase Server 逐個文件地處理和解析內容所需的格式。

請注意,我們沒有為 Hadoop 定義一個 Combiner 類。這將阻止 Hadoop 嘗試重新精減該資訊,該操作在當前的程式碼中會失敗,因為我們的精減階段僅接收該單詞和一位數,並輸出一個 JSON 值。對於輔助的精減/組合階段,我們需要解析 JSON 輸入或定義一個新 Combiner 類,以便輸出資訊的 JSON 版本。這稍微簡化了定義。

要在 Hadoop 中使用此程式碼,首先需要將 Google Gson 庫複製到 Hadoop 目錄中 (/usr/lib/hadoop/lib)。然後重新啟動 Hadoop,以確保 Hadoop 已經正確識別出該庫。

接下來,將您的程式碼編譯到一個目錄中:

現在為您的庫建立一個 jar 檔案:

完成此過程後,您可以將一些文字檔案複製到某個目錄中,然後使用此 jar 檔案將這些文字檔案處理為許多獨立的單詞,建立一條 JSON 記錄來包含每個單詞和計數。例如,要在一些 Project Gutenberg 文字上處理此資料:

這將在我們的目錄中生成已由 Hadoop 內的 MapReduce 函式統計的單詞列表。

將資料從 Hadoop 匯出到 Couchbase Server

要從 Hadoop 取回資料並匯入 Couchbase Server 中,則需要使用 Sqoop 匯出該資料:

此示例中忽略了 --table 引數,但 --export-dir 是要匯出的資訊所在的目錄的名稱。

 在 Couchbase Server 中編寫 MapReduce

在 Hadoop 中,MapReduce 函式是使用 Java 編寫的。在 Couchbase Server 中,MapReduce 函式是使用 Javascript 編寫的。作為一種已解釋的語言,這意味著您不需要編譯檢視,它會支援您編輯和細化 MapReduce 結構。

要在 Couchbase Server 中建立一個檢視,請開啟管理控制檯(在 http://localhost:8091 上),然後單擊 View 按鈕。檢視收集在一個設計文件中。您可以在單個設計文件中建立多個檢視,也可以建立多個設計文件。要提升伺服器的總體效能,系統還支援一種可編輯的開發檢視以及一個無法編輯的生產檢視。生產檢視無法編輯是因為這麼做會使檢視索引無效,並會導致需要重新構建索引。

單擊 Create Development View 按鈕並命名您的設計文件和檢視。

在 Couchbase Server 內,有兩個相同的函式:map 和 reducemap 函式用於將輸入資料(JSON 文件)對映到某個表。然後使用reduce 函式彙總和精減該表。reduce 函式是可選的,不是索引功能所必需的,所以,出於本文的目的,我們將忽略 reduce 函式。

對於 map 函式,函式的格式如 清單 6 所示。

清單 6. map 函式的格式

引數 doc 是每個儲存的 JSON 文件。Couchbase Server 的儲存格式是一種 JSON 文件,檢視是使用 Javascript 語言編寫的,所以我們可使用以下語句訪問 JSON 中一個名為 count 的欄位:doc.count

要從 map 函式發出資訊,可以呼叫 emit() 函式。emit() 函式接受兩個引數,第一個是鍵(用於選擇和查詢資訊),第二個引數是相應的值。因此,我們可以建立一個 map 函式來使用來輸出單詞和計數,如 清單 7 中的程式碼所示。

清單 7. 輸出單詞和計數的 map 函式

這將為每個輸出文件輸出一行資料,其中包含文件 ID(實際上是我們的單詞)、用作鍵的單詞和該單詞在源文字中出現的次數。可在清單 8 中看到原始的 JSON 輸出。

清單 8. 原始的 JSON 輸出

在輸出中,id 是文件 ID,key 是您在 emit 語句中指定的鍵,value 是在 emit 語句中指定的值。

 獲取實時資料

現在我們已在 Hadoop 中處理了資訊,請將它匯入 Couchbase Server 中,然後在 Couchbase Server 中為該資料建立了一個檢視,我們可以開始查詢已處理和儲存的資訊了。檢視可使用一個 REST 樣式的 API 來訪問,或者在使用一個 Couchbase Server SDK 時,通過相應的檢視查詢函式來訪問它。

查詢可通過 3 種主要選擇來執行:

  • 單獨的鍵。例如,顯示與某個特定鍵(比如 'unkind')匹配的資訊。
  • 鍵列表。您可提供一個鍵值陣列,這將返回其鍵值與一個提供的值匹配的所有記錄。例如,['unkind','kind'] 將返回與其中一個單詞匹配的記錄。
  • 鍵範圍。您可指定一個開始和結束鍵。

例如,要找到一個指定的單詞的數量,可使用 key 引數進行查詢:

Couchbase Server 會很自然地採用 UTF-8 排序方式輸出一個 MapReduce 的按指定的鍵排序的結果。這意味著您可以通過指定開始值和結束值來獲取一個值範圍。例如,要獲取 ‘breeze’ 與 ‘kind’ 之間的所有單詞,可使用:

該查詢很簡單,但非常強大,尤其是在您認識到可以將它與靈活的檢視系統結合使用,生成具有您想要的格式的資料的時候。

 結束語

Hadoop 本身提供了一個強大的處理平臺,但沒有提供從已處理的資料中實際提取有用資訊的方法。通過將 Hadoop 連線到另一個系統,可使用該系統來查詢和提取資訊。因為 Hadoop 使用 MapReduce 進行相關處理,所以您可以通過 Couchbase Server 中的 MapReduce 系統,利用 MapReduce 的知識來提供查詢平臺。使用此方法,您可以在 Hadoop 中處理資料,以 JSON 文件格式將資料從 Hadoop 匯出到 Couchbase Server 中,然後在 Couchbase Server 中使用 MapReduce 查詢已處理的資訊。

相關文章