2012年9月14日 星期五

Hbase連結Eclipse

前言
  再說一萬次我也不閒煩, 如果我身份證的父親欄是寫"鍋台名", 我還會晚上不睡覺在研究Hbase怎麼跟Eclipse連接起來嗎?
  寫這篇網誌跟上一篇中間過程已經先作掉"動物園管理員"了,這有空再補上去吧。我為啥要補這篇先呢?因為Google了整晚,把手邊可以參考的兩本書翻爛了,就是搞不定"KeeperErrorCode = ConnectionLoss for /hbase/master"這一個Exception。當看到console不再跑紅字並且連通的瞬間我眼淚都差點要噴出來了,所以再爆肝我都要先把熱騰騰的記憶寫上來,雖然這篇篇幅不長, 還是讓我們繼續看下去吧

環境
上一篇一樣

實作
  Client端要與Hbase叢集互動,有幾種方式可以選擇:Java, Arvo, REST, Thrift。是的,在下只會Java。Hbase的資料庫是建立在HDFS上的,還記得hbase-site.xml有個屬性的value是hdfs://UD1204:9000/hbase嗎?待會可以從程式執行成功後可以從Eclipse裡或是terminal中看到
  待會要實作的就類似JDBC, 透過JAVA CODE存取資料庫, Hbase也有提供這樣的API,不過詳述底層API不是本篇的主旨,而是要利用Eclipse跟Hbase作連接,使JAVA CODE可以直接存取在HDFS中的Hbase資料庫
  首先要把Hbase相關的lib都add到project裡面,見下圖
Project按右鍵-->Build Path-->Configuration Build Path..-->Libraries-->Add External JARs.. 路徑選到${HBASE_HOME}/lib,把全部的jar檔都加進去, 再回到${HBASE_HOME}下還有兩個jar檔別忘記了



接下來的重頭戲就是要把Hbase的設定檔也加入Eclipse,不然執行程式時會連接不到你的master。步驟就是Project按右鍵-->Build Path-->Configuration Build Path..-->Libraries-->Add Variable..(跟上面加入jar的步驟一樣)
到了下面這畫面選擇Configure Variables..再選擇NEW, 會跳出一個對話框, 這就是要讓你加入Hbase設定檔的路徑,請見下圖


這對話框的Name隨便你取, Path指定到${HBASE_HOME}/bin就好了
按下OKOKOKOKOKOKOK......以上設定就結束了,下面用一個Create Table的程式馬來測試一下。至於API就不詳述如何使用, 改天(我搞清楚的那一天XD)再另外開一篇blog說明吧

以下這段code貼到eclipse中,記得hadoop跟hbase都要啟動, 再run as hadoop
console中會出現Table: ex1TableExisted. 1. create table :ex1Table這段字就代表新增成功。至於上面有些紅色的錯誤訊息,我還在研究那是啥原因跑出來的



import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.util.GenericOptionsParser;

public class CreateTable {
public static void createHBaseTable(String tablename, String family)
      throws IOException {
    // HTableDescriptor 用來描述table的屬性
    HTableDescriptor htd = new HTableDescriptor(tablename);

    // HTableDescriptor 透過 add() 方法來加入Column family
    htd.addFamily(new HColumnDescriptor(family));

    // HBaseConfiguration 能接收 hbase-site.xml 的設定值
    Configuration conf = HBaseConfiguration.create();

    // 檔案的操作則使用 HBaseAdmin
    HBaseAdmin admin = new HBaseAdmin(conf);

    // 檢查
    if (admin.tableExists(tablename)) {
      System.out.println("Table: " + tablename + "Existed.");
    } else {

      // 建立
      admin.createTable(htd);

      // 
      System.out.println( tablename + " created.");
    }
  }

  static public void main(String argv[]) throws IOException {
    // eclipse only
    String[] args = {"ex1Table","Detail"};
    argv = args;

    String[] otherArgs = new GenericOptionsParser(new Configuration(), argv)
        .getRemainingArgs();
    if (otherArgs.length < 2) {
      System.out.println("CreateTable <newTableName> <Family>");
      return;
    }
    
    String tablename = otherArgs[0];
    String family = otherArgs[1];

    createHBaseTable(tablename, family);
    
    System.out.println("1. create table :" + tablename);
  }
}

執行完後你可以再Eclipse左邊的視景窗看到這一個table已經產生在hdfs中了。


再來也可以從terminal進到hbase去看table存不存在, 用hbase shell進入再下list指令你可以看到這個table的名字'ex1Table',見下圖

以上就是Hbase連接Eclipse的方法,我只有做新增Table,也可以利用其他api對DB作存取,改天有空再寫詳細一點, Over

沒有留言:

張貼留言