簡體   English   中英

遠程將Java連接到HBase

[英]Connect Java to HBase Remotedly

我正在嘗試將Java連接到遠程服務器中的HBase。

情況是這樣的:

Java類在我的本地計算機中(192.168.111.165)

Hadoop文件系統和HBase在另一台服務器(192.168.11.7)中

這是我的Hadoop的core-site.xml(位於192.168.11.7中):

<configuration>
  <property>
        <name>fs.default.name</name>
        <value>hdfs://192.168.11.7:9000</value>
  </property>
</configuration>

這是我的Hadoop的hdfs-site.xml(位於192.168.11.7中):

<configuration>
  <property>
        <name>dfs.replication</name>
        <value>1</value>
  </property>
  <property>
    <name>dfs.name.dir</name>
    <value>file:///home/hadoop/hadoopinfra/hdfs/namenode</value>
  </property>

  <property>
    <name>dfs.data.dir</name>
    <value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value>
  </property>   
</configuration>

這是我的HBase的hbase-site.xml(在192.168.11.7中):

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

  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/hadoop/zookeeper</value>
  </property>

  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
</configuration>

我已經成功打開了HDFS和HBase(經過驗證,我可以在HBase Shell中運行“ list”命令)。 請注意,我從本地計算機使用ssh到192.168.11.7在HBase Shell中運行“列表”命令。 在我的本地計算機(192.168.111.165)中,我可以使用瀏覽器訪問hadoop文件系統和hbase(通過單擊URL進行hadoop: http : //192.168.11.7 :50070/,通過單擊URL進行hadoop集群: http : //192.168.11.7 :8088 / ,通過點擊URL的HBase: http : //192.168.11.7 :16010/

現在,我在本地計算機(192.168.111.165)中開發了一個Java代碼,該代碼具有hbase-site.xml:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  <configuration>
    <property>
      <name>hbase.rootdir</name>
      <value>hdfs://192.168.11.7:9000/hbase</value>
    </property>
</configuration>

和我的主要代碼如下:

private static Configuration conf = null;

public static void main(String[] args) throws Exception {
    try {
        conf = HBaseConfiguration.create();
        String tablename = "scores";
        String[] familys = { "grade", "course" };
        creatTable(tablename, familys);
    } catch (Exception e) {
        e.printStackTrace();

        throw e;
    }
}

public void creatTable(String tableName, String[] familys)
        throws Exception {
    HBaseAdmin admin = new HBaseAdmin(conf);
    if (admin.tableExists(tableName)) {
        System.out.println("table already exists!");
    } else {
        HTableDescriptor tableDesc = new HTableDescriptor(tableName);
        for (int i = 0; i < familys.length; i++) {
            tableDesc.addFamily(new HColumnDescriptor(familys[i]));
        }
        admin.createTable(tableDesc);
        System.out.println("create table " + tableName + " ok.");
    }
}

當我運行代碼時,我得到了Exception,它具有stacktrace:

org.apache.hadoop.hbase.client.RetriesExhaustedException: Can't get the locations
at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.getRegionLocations(RpcRetryingCallerWithReadReplicas.java:319)
at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:156)
at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:60)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:210)
at org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:326)
at org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:301)
at org.apache.hadoop.hbase.client.ClientScanner.initializeScannerInConstruction(ClientScanner.java:166)
at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:161)
at org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:797)
at org.apache.hadoop.hbase.MetaTableAccessor.fullScan(MetaTableAccessor.java:602)
at org.apache.hadoop.hbase.MetaTableAccessor.tableExists(MetaTableAccessor.java:366)
at org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:406)
at org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:416)
at com.volt.kismistest.handler.TestHBaseHandler.creatTable(TestHBaseHandler.java:82)
at com.volt.kismistest.handler.TestHBaseHandler.doAction(TestHBaseHandler.java:47)
at com.volt.kismistest.handler.TestHBaseHandler.doAction(TestHBaseHandler.java:1)

注意例外是:

TestHBaseHandler是我的Java類的名稱

TestHBaseHandler.java:82是: if(admin.tableExists(tableName)){ on creatTable方法

TestHBaseHandler.java:47是: creatTable(tablename,familys); 在主要方法上

誰能幫我解決這個問題?

非常感謝你

您說可以運行list ,但是可以在特定表上運行createscan嗎? 您可能忘記了啟動區域服務器。 我會這樣運行:

create testtable, {NAME => 'testcf'}以查看是否也在外殼程序中創建了它。 如果該方法可行,請運行scan 'testtable'以驗證您可以對其進行掃描。

也可能是防火牆問題。 區域服務器可能已啟動,但其端口已防火牆關閉。

另外,您還可以調用HBaseAdmin#available來檢查HBase是否已從客戶端啟動並正在運行。

這里只是一個猜測,許多問題可能取決於HBase的安裝方式/位置或您的網絡配置。

在HBase中,大部分工作是由從屬節點完成的,而主節點只是您的主要“聯系點”。 在大多數情況下,您會遇到主服務器,該主服務器只會向您返回應該完成該操作的從屬節點的IP(很可能是內部IP )(肯定是讀/寫,也可能是創建表) )。 如果您的客戶端無法解析或無法訪問該從IP,則可能會遇到連接問題。 您得到的例外可能會有所不同。

嘗試的事情:

  • 可以從主節點上的HBase Shell創建表嗎?
    • 注意: list是不夠的,因為它可能僅由主節點提供...
  • 該命令是否可以通過REST API使用? (您可以從主外殼啟動它)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM