1. 程式人生 > >利用hbase api在本地訪問並操作伺服器的hbase資料庫

利用hbase api在本地訪問並操作伺服器的hbase資料庫

最近因為實驗室專案需要,開始研究了hbase。然後想一次性往叢集伺服器上寫入大量的資料,並存到hbase中,考慮到在hbase shell下只能單個數據put,這樣對於批量插入資料的要求完全不合適。於是就研究起hbase的java api,然後去大量填充資料到hbase以測試查詢的效能。於是,故事開始了。

首先在eclipse下寫好了,如下的Java程式碼:

<span style="font-size:12px;">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.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;

public class testCreate {
    public static void main(String[] args){
    	Configuration conf = HBaseConfiguration.create();
    	conf.set("hbase.rootdir", "hdfs://xxx-a.test.com:8020/apps/hbase/data");//使用eclipse時必須新增這個,否則無法定位
        conf.set("hbase.zookeeper.quorum", "xxx-a1.test.com,xxx-a2.test.com,xxx-a3.test.com");
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        conf.set("zookeeper.znode.parent","/hbase-unsecure");//這行程式碼也是後來加上的
        try {           
            Connection conn = ConnectionFactory.createConnection(conf);
            System.out.println("StartConnect...");
            Admin hAdmin = conn.getAdmin();
            HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("Customer2"));
            hTableDesc.addFamily(new HColumnDescriptor("name"));
            hTableDesc.addFamily(new HColumnDescriptor("contactinfo"));
            hTableDesc.addFamily(new HColumnDescriptor("address"));
            hAdmin.createTable(hTableDesc);
            System.out.println("Table created Successfully...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}</span>
<span style="font-size:12px;"><span style="white-space: pre;">	</span>程式碼寫好,一堆錯誤。是因為缺少依賴的jar包。以下是新增的jar截圖。</span>


這樣jar包都是程式執行報錯一點點加進去的,分享給大家可以少走冤枉路。(debug也是一種樂趣,雖然有時候想死的心都有,但是堅持找,肯定會解決的大笑

此時還得配置電腦的hosts,在C:\Windows\System32\drivers\etc\目錄,有一個hosts檔案,在其中加上xxx-a.test.com對應的實際ip地址,這樣程式執行才會訪問到正確的地方,格式類似於這樣

xxx-a.test.com      X.X.X.X。基於這樣,程式是可以執行的,Java的執行日誌會有如下顯示:


表示連線hbase資料庫成功,建立表成功。皆大歡喜。

下面說一下幾個需要注意的地方:

1、conf.set("hbase.rootdir", "hdfs://xxx-a.test.com:8020/apps/hbase/data");//使用eclipse時必須新增這個,否則無法定位
這句話必須要加上,通過這句配置,才能準確的定位hbase實際儲存的hdfs位置,所以這裡面的<span style="font-family: Arial, Helvetica, sans-serif;">xxx-a.test.com換成詳細的ip地址也是可以的。</span>
2、conf.set("hbase.zookeeper.quorum", "xxx-a1.test.com,xxx-a2.test.com,xxx-a3.test.com");
<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.2px;">Zookeeper叢集的地址列表,用逗號分割。例如:</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.2px;">"xxx-a1.test.com,xxx-a2.test.com,xxx-a3.test.com</span><span style="font-size: 14px; line-height: 25.2px; font-family: Helvetica, Tahoma, Arial, sans-serif;">".預設是localhost,是給偽分散式用的。要修改才能在完全分散式的情況下使用。如果在hbase-env.sh設定了HBASE_MANAGES_ZK,這些ZooKeeper節點就會和HBase一起啟動。</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.2px;">
</span>3、conf.set("hbase.zookeeper.property.clientPort", "2181");
這句話是設定zookeeper監控連線的客戶端的埠號是2181,這是預設的配置。
4、conf.set("zookeeper.znode.parent","/hbase-unsecure");//這行程式碼也是後來加上的
<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2px;">ZooKeeper中的HBase的根ZNode。所有的HBase的ZooKeeper會用這個目錄配置相對路徑。預設情況下,所有的HBase的ZooKeeper檔案路徑是用相對路徑,所以他們會都去這個目錄下面。</span>
<span style="font-family:Helvetica, Tahoma, Arial, sans-serif;"><span style="line-height: 25.2px;">5.沒加上面那句程式碼之前我的報錯資訊一直是:</span></span>
<span style="font-family:Helvetica, Tahoma, Arial, sans-serif;"><span style="line-height: 25.2px;">org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=35, exceptions:
Wed Aug 10 21:29:19 CST 2016, RpcRetryingCaller{globalStartTime=1470835740311, pause=100, retries=35}, org.apache.hadoop.hbase.MasterNotRunningException: org.apache.hadoop.hbase.MasterNotRunningException: Can't get connection to ZooKeeper: KeeperErrorCode = ConnectionLoss for /hbase
</span></span>
<span style="font-family:Helvetica, Tahoma, Arial, sans-serif;"><span style="line-height: 25.2px;">at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:157)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.HBaseAdmin.executeCallable(HBaseAdmin.java:4212)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.HBaseAdmin.createTableAsyncV2(HBaseAdmin.java:748)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.HBaseAdmin.createTable(HBaseAdmin.java:669)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.HBaseAdmin.createTable(HBaseAdmin.java:602)
<span style="white-space:pre">	</span>at hbase.testCreate.main(testCreate.java:24)
Caused by: org.apache.hadoop.hbase.MasterNotRunningException: org.apache.hadoop.hbase.MasterNotRunningException: Can't get connection to ZooKeeper: KeeperErrorCode = ConnectionLoss for /hbase
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation$StubMaker.makeStub(ConnectionManager.java:1535)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation$MasterServiceStubMaker.makeStub(ConnectionManager.java:1555)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.getKeepAliveMasterService(ConnectionManager.java:1706)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.MasterCallable.prepare(MasterCallable.java:38)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:134)
<span style="white-space:pre">	</span>... 5 more
Caused by: org.apache.hadoop.hbase.MasterNotRunningException: Can't get connection to ZooKeeper: KeeperErrorCode = ConnectionLoss for /hbase
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.checkIfBaseNodeAvailable(ConnectionManager.java:907)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.access$400(ConnectionManager.java:546)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation$StubMaker.makeStubNoRetries(ConnectionManager.java:1485)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation$StubMaker.makeStub(ConnectionManager.java:1526)
<span style="white-space:pre">	</span>... 9 more
Caused by: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase
<span style="white-space:pre">	</span>at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
<span style="white-space:pre">	</span>at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
<span style="white-space:pre">	</span>at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1045)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper.exists(RecoverableZooKeeper.java:221)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.zookeeper.ZKUtil.checkExists(ZKUtil.java:541)
<span style="white-space:pre">	</span>at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.checkIfBaseNodeAvailable(ConnectionManager.java:896)
<span style="white-space:pre">	</span>... 12 more
</span></span>
<span style="font-family:Helvetica, Tahoma, Arial, sans-serif;"><span style="line-height: 25.2px;">加上</span></span><span style="line-height: 25.2px; font-family: Helvetica, Tahoma, Arial, sans-serif;">conf.set("zookeeper.znode.parent","/hbase-unsecure");</span><span style="line-height: 25.2px; font-family: Helvetica, Tahoma, Arial, sans-serif;">就可以成功訪問並操作hbase資料庫。</span>
<span style="font-family:Helvetica, Tahoma, Arial, sans-serif;"><span style="line-height: 25.2px;">以上是個人實際學習過程的一些經驗,在此記錄一下,歡迎大家一起學習交流hbase相關技術!</span></span>