Eclipe集成環境開發HBase程序過程詳解
當前,爲了方便對TB級以上的數據進行分佈式存取,開發企業級的應用,很多公司採用HBase作爲後臺數據組織與管理平臺。HBase雖然可以存放近乎無限的數據,也可以實現在TB級以上的數據集塞責快速查、改操作,但是對數據操作的難度又不是一般人所能完成的,對其不能像關係數據庫那樣使用SQL語言進行操作,甚至也不能像在Hive中那樣使用類SQL語言對數據進行查詢。HBase提供了統一的接口,專門的命令實現對數據的操作。對於數據庫管理員來說,通過Hbase Shell登錄Hbase,使用專門的命令完成對HBase數據庫的操作是可以的。HBase提供了專門的Java API,可以讓Java程序進行調用,從而實現對Hbase的操作。Eclipse作爲開發Java應用程序的不二之選,使用它開發基於Java語言的Hbase應用程序也成了程序員們的首選。因爲資料的缺乏,或者提供相關資料的人員有意無意的疏漏,從集羣平臺與集成開發環境搭配完畢,到完成第一個Hbase開發,還有很多的事情要做,可能需要花費許多時間才能把路走通。本文將詳細介紹Eclipe集成環境開發HBase程序過程的過程,以期給讀者提供相關的參考,減少在這一過程花費的時間。
1、Hadoop集羣環境如下:
(1)5臺服務器,操作系統爲CentOS6.4。5臺機器的名稱分別爲H-master-01、H-node-11、H-node-12、H-node-13、H-node-14,IP地址分別爲192.168.100.1、192.168.100.11、192.168.100.12、192.168.100.13、192.168.100.14。
(2)Hadoop集羣使用的是Intel公司的IDH2.5。在IDH2.5中,Hadoop版本是1.2.1,Hbase的版本是0.94.1。
(3)H-master-01做Namenode、JobTracker、HBase Master,其他4臺做DataNode、TaskTracker、HBase RegionServer,H-node-11、H-node-12、H-node-13做Zookeeper。
2、客戶端開發環境如下:
(1)操作系統:Win7
(2)開發集成環境:Eclipse 4.21
(3)JavaSDK:JRE 6(Build 1.6.0.31)
3、開發準備
(1)確保集羣Hadoop與Hbase正常運行
(2)把集羣上Hbase安裝目錄下的hbase-0.94.11.jar、hbase-0.94.11-tests.jar、子目錄Lib下的所有文件、子目錄Security/src/main/java下的org目錄及Hbase-site.xml文件複製到客戶端電腦上。
(3)修改客戶端Win7的Hosts文件(windows/system32/drivers/etc下),加入集羣各服務器與IP地址的對應關係,使其跟CentOS上的Hosts文件中的對應關係一樣:
192.168.100.1 h-master-01
192.168.100.11 h-node-11
192.168.100.12 h-node-12
192.168.100.13 h-node-13
192.168.100.14 h-node-14
這是由於Hbase是通過hostname解析IP地址的(DNS),Zookeeper只會返回Hbase的域名,需要客戶端通過DNS或本地hosts文件進行服務器域名到IP地址的解析。如果在Hosts文件不指名域名與IP地址的關係,Zookeeper無法解析出作爲Zookeeper的IP地址,就會報錯:Will not attempt to authenticate using SASL(無法定位登錄配置)。
4、開發過程
(1)啓動Eclipse,創建一個普通的Java Application Project,假設名稱爲HbaseTest
(2)在HbaseTest項目所在目錄下創建Conf目錄,然後把Hbase-site.xml文件複製到Conf目錄下
(3)把前述Security/src/main/java目錄下的org目錄複製到HbaseTest項目的Src目錄下。該目錄下存放的是Hbase開發安全類包,如果不把該類包導入,則會出現錯誤信息:java.lang.ClassNotFoundException:org.apache.hadoop.hbase.ipc.SecureRpcEngine。
如果在從官網下載的Hbase中,已經把該安全包封裝在JAR文件hbase-0.94.1-security中,則不用把文件導入,通過第(6)步導入JARs操作把類庫導入也可以。
(4)在Eclipse中,找到HbaseTest項目,右單擊,在彈出菜單中選擇Refresh,進行刷新操作,就會發現Conf目錄已經出現在項目列表下。
(5)HbaseTest項目—右單擊—Properties,打開項目Properties窗口:
(5)在如上面所示的窗口點擊Add Class Folder…按鈕,在彈出的窗口中選擇Conf目錄,把Conf中的Hbase-site.xml文件加入到項目中,以保證程序能夠讀取Hbase配置信息,實現對Hbase的操作。
(6)上面的窗口中,點擊Add External JARs…按鈕,選擇前述從Hbase中複製出的Lib目錄下的Jar文件。如果不能確定具體要選哪些文件,選擇全部即可。陸嘉恆在《Hadoop實戰》(第二版)、風的王子在其CSDN博客中都有關於具體引用Jar的文件的說明。比如風的王子在其博客http://blog.csdn.net/zcwfengbingdongguke/article/details/14101433提到:
A、只需要用 java api對 HBase表進行增刪改時,必須用的以下 jar包:
commons-configuration-1.6.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
hadoop-core-1.2.1.jar
hbase-0.94.10.jar
log4j-1.2.16.jar
protobuf-java-2.4.0a.jar
slf4j-api-1.4.3.jar
slf4j-log4j12-1.4.3.jar
zookeeper-3.4.5.jar
B、運行 HBase MapReduce程序時,需要以下jar包:
commons-configuration-1.6.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
guava-11.0.2.jar
hadoop-core-1.2.1.jar
hbase-0.94.10.jar
jackson-core-asl-1.8.8.jar
jackson-mapper-asl-1.8.8.jar
log4j-1.2.16.jar
protobuf-java-2.4.0a.jar
slf4j-api-1.4.3.jar
slf4j-log4j12-1.4.3.jar
zookeeper-3.4.5.jar
(7)經過上述配置後,就可以直接創建Java Class文件了,把下面的代碼複製到所創建的類文件中,如果沒有引用錯誤,在類文件上,右單擊,Run As—Java Application,如果客戶開發電腦跟運行Hbase的Hadoop集羣在網絡上是聯通的,則可以在Hbase上創建表MyFirstHbaseTable!
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.hbase.HBaseConfiguration;
importorg.apache.hadoop.hbase.HColumnDescriptor;
importorg.apache.hadoop.hbase.HTableDescriptor;
importorg.apache.hadoop.hbase.KeyValue;
importorg.apache.hadoop.hbase.MasterNotRunningException;
importorg.apache.hadoop.hbase.ZooKeeperConnectionException;
importorg.apache.hadoop.hbase.client.Delete;
importorg.apache.hadoop.hbase.client.Get;
importorg.apache.hadoop.hbase.client.HBaseAdmin;
importorg.apache.hadoop.hbase.client.HTable;
importorg.apache.hadoop.hbase.client.Put;
importorg.apache.hadoop.hbase.client.Result;
importorg.apache.hadoop.hbase.client.ResultScanner;
importorg.apache.hadoop.hbase.client.Scan;
importorg.apache.hadoop.hbase.filter.Filter;
importorg.apache.hadoop.hbase.filter.FilterList;
importorg.apache.hadoop.hbase.filter.SingleColumnValueFilter;
importorg.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
importorg.apache.hadoop.hbase.util.Bytes;
publicclass TableInHbase {
public static Configuration configuration;
static {
configuration = HBaseConfiguration.create();
}
Private static string tableName=” MyFirstHbaseTable”;
public static void main(String[] args) {
System.out.println("Initing for HBaseAdmin ......");
try {
tableName=””;
HBaseAdmin hBaseAdmin =new HBaseAdmin(configuration);
System.out.println("start to check tables ......");
if (hBaseAdmin.tableExists(tableName)) {
hBaseAdmin.disableTable(tableName);
hBaseAdmin.deleteTable(tableName);
System.out.println(tableName + " is exist,detele....");
}
System.out.println("start create table ......");
HTableDescriptor tableDescriptor =newHTableDescriptor(tableName);
tableDescriptor.addFamily(new HColumnDescriptor("column1"));
tableDescriptor.addFamily(new HColumnDescriptor("column2"));
tableDescriptor.addFamily(new HColumnDescriptor("column3"));
hBaseAdmin.createTable(tableDescriptor);
hBaseAdmin.close();
}catch (MasterNotRunningException e) {
e.printStackTrace();
}catch (ZooKeeperConnectionException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
System.out.println("end create table ......");
}