2013年2月18日 星期一

資料科學家 - Big Data 資料庫系統 (HBase)

Hadoop 除了擁有分散式檔案系統 (HDFS) 之外,一樣參照 Google 系統做了一個用來存放結構化資料的 BigTable 系統, 這系統就是 HBase, 當然 HBase 是架構在 HDFS 檔案系統之上.

簡單的說,HBase 有別於關連式資料庫系統用的列導向 (row-oriented) 儲存方式,它是 column-oriented 的儲存方式。Column-oriented 的好處是每一筆記錄 (record) 可以存放不固定欄位的資料,不像 row-oriented 的存法,增加一個新的欄位需要將所有記錄一併修改, 這是需要花些力氣才能達成。 HBase 底層使用了分散式的檔案系統 (Hadoop 的 HDFS),並且也將一個資料表拆成很多份,由不同的資料伺服器 (Data Node) 負責該部份的存取,藉此達到高效能。

在寫入資料的時候,HBase 是先寫到記憶體中的 MemCache,並且有預寫式日誌 (Write-Ahead Log) 以防意外發生時可以做復原的動作。每隔一段時間,或者 MemCache 累積到一定程度,HBase 就會把資料寫入檔案系統中。因此,HBase 可以提供相當高速的寫入。讀取的時候,也是先去找 MemCache 後再去找檔案系統,而藉由將一個大大的表拆成很多份的技巧,也提昇了讀取的速度。

在執行本文 HBase 系統安裝與設定之前, 你必須先參考 "資料科學家 - Big Data 分散檔案系統" 這篇文章, 將 HDFS 系統建置好

1. HBase 系統檔下載與解壓縮

$ cd kvmhdfs1.0/bigdata
$ wget http://apache.stu.edu.tw/hbase/hbase-0.94.4/hbase-0.94.4.tar.gz
$ tar xvfz hbase-0.94.4.tar.gz

2. 指定 HBase 系統目錄
在 kvmhdfs1.0 目錄中的 kvmhadoop.env 設定檔, 加入 hbase 變數宣告, "hbase-0.94.4" 是 HBase  系統目錄名稱.

$ nano ~/kvmhdfs1.0/kvmhadoop.env
hadoop=hadoop-1.0.4
hadoopjar=hadoop-core-1.0.4.jar
jdk=jdk1.6.0_37
hbase=hbase-0.94.4

3. 設定 HBase 系統
首先修改 hbase-0.94.4/conf/hbase-env.sh 設定檔, 指定 JDK 的目錄.

$ nano hbase-0.94.4/conf/hbase-env.sh
                                   :
                                   :
# The java implementation to use.  Java 1.6 required.
export JAVA_HOME=/home/student/kvmhadoop/bigdata/jdk1.6.0_37
                                   :
                                   :
# The maximum amount of heap to use, in MB. Default is 1000.
export HBASE_HEAPSIZE=512

然後修改 hbase-0.94.4/conf/hbase-site.xml, 指定 HDFS 的 NameNode 主機與資料庫儲存目錄.

$ nano hbase-0.94.4/conf/hbase-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://NN:9000/hbase</value>
  </property>

  <property>
    <name>hbase.tmp.dir</name>
    <value>/home/student/kvmhdfs1.0/bigdata/hbase-0.94.4/db</value>
  </property>

</configuration>

4. 啟動 HDFS 檔案系統

$ sudo ./hdfs.sh
建構 SH100 網路
--------------------------
SH100 建立成功
  SH100-NET 建立成功
  SH100P1 建立成功
  SH100P2 建立成功
  SH100P3 建立成功
  SH100P4 建立成功
  SH100R1 建立成功
  SH100R2 建立成功

啟動 HDFS 系統
--------------------------
NN(768 M) 啟動成功
SN(512 M) 啟動成功
DN01(512 M) 啟動成功
DN02(512 M) 啟動成功
HDFS:mapreduce>

5. 修改 /etc/hosts 檔案
在 /etc/hosts 檔案中, 將以下設定 :

127.0.1.1  UB641

改為

172.16.100.1 UB641

6. 撰寫 hbase.sh 啟動程式
務必在 ~/kvmhdfs1.0 目錄中, 撰寫 hbase.sh 啟動程式, 程式內容如下 :

#!/bin/bash
[ "$USER" != "root" ] && echo "需要 root 權限" && exit 1

[ ! -d ~/kvmhdfs1.0 ] && echo "找不到 kvmhdfs1.0 目錄" && exit 1
cd ~/kvmhdfs1.0
p=$(pwd)
[ ! -d "$p/bigdata" ] && echo "找不到 bigdata 目錄" && exit 1

source ./kvmhadoop.env
[ ! -d "$p/bigdata/$hbase" ] && read -p "Hbase 目錄不存在 ($p/bigdata/$hbase), 按任何鍵繼續" k && exit 1

export JAVA_HOME=$p/bigdata/$jdk
export PATH=$PATH:$JAVA_HOME/bin
export HBASE_HOME=$p/bigdata/$hbase
export PATH=$PATH:$p/bigdata/$hadoop/bin
export PATH=$PATH:$HBASE_HOME/bin

x=$(ps aux)
echo $x | grep "$hbase" &>/dev/null
if [ "$?" != "0" ]; then
   cd "$HBASE_HOME"
   start-hbase.sh
   hbase shell
   stop-hbase.sh
else
   read -p "已開啟 HBase 終端機視窗, 按任何鍵繼續" k
fi

程式撰寫完, 務必賦予執行權限, 命令如下 :

$ chmod +x hbase.sh

7. 啟動 Hbase
執行 hbase.sh 程式, 只要連接 Hbase 系統成功, 會直接啟動 Hbase shell, 啟動命令如下 :

HDFS:mapreduce>  sudo ~/kvmhdfs1.0/hbase.sh
starting master, logging to /home/student/kvmhdfs1.0/bigdata/hbase-0.94.4/logs/hbase-root-master-UB641.out
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.94.4, r1428173, Thu Jan  3 06:29:56 UTC 2013

hbase(main):001:0>

接著在提示字串, 輸入 version 命令, 得知目前執行的 Hbase 版本 :

hbase(main):001:0> version
0.94.4, r1428173, Thu Jan  3 06:29:56 UTC 2013

輸入 status 命令, 得知目前執行的狀態 :

hbase(main):002:0> status
1 servers, 0 dead, 2.0000 average load

輸入 quit 命令, 會脫離 HBase shell, 並關閉 HBase 系統

hbase(main):011:0> quit
stopping hbase.............
HDFS:mapreduce>

沒有留言:

張貼留言