2016-09-28 13 views
0

JavaをリモートサーバのHBaseに接続しようとしています。ここでJavaをHBaseにリモート接続する

はケースです:

Javaクラスは私のローカルコンピュータ(192.168.111.165)

でHadoopのファイルシステムで、HBaseのは、別のサーバー(192.168.11.7)である

ここ(192.168.11.7で)私のHadoopのコア-site.xmlのです:

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

(192.168.11.7で)私のHadoopのHDFS-site.xmlのです:

は、ここでは
<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> 

(192.168.11.7で)私のHBaseのHBaseの-site.xmlのです:

<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> 

私はHBaseのシェルで "リスト" コマンドを実行することができて、私は実績のある(成功したHDFSとHBaseのをオンにしています)。私はローカルコンピュータから192.168.11.7にsshを使ってHBase Shellで "list"コマンドを実行することに注意してください。 、

今(http://192.168.11.7:16010/:、HBaseのURLを押すことでhttp://192.168.11.7:8088/:URLを押すことでhttp://192.168.11.7:50070/、HadoopクラスタURLを押すことでHadoopの)私のローカルコンピュータ(192.168.111.165)から は、私はHadoopのファイルシステムとブラウザを使用してのHBaseにアクセスすることができます次のように

<?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> 

と私のメインコード::私は、HBaseの-site.xmlのを持っている私のローカルコンピュータ(192.168.111.165)、でJavaコードを開発

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."); 
    } 
} 

私は、コードを実行すると、 、ある例外で

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がある私は、スタックトレースを持つ例外を得ました。 tableExists(tableName)){ creatTableメソッドの

TestHBaseHandler.java:47 is:creatTable(tablename、familys);メインメソッド

誰でもこの問題を解決できますか?

はあなたがlistを実行することができると言いましたが、あなたは、特定のテーブルの上にcreatescanを実行できますか?非常に多くの

答えて

1

をありがとうリージョンサーバーを開始するのを忘れた可能性があります。私はこのような何かを実行する:

create testtable, {NAME => 'testcf'}これは、シェルでもそれを作成するかどうかを確認します。それが何らかの形で機能する場合は、scan 'testtable'を実行してスキャンできることを確認します。

ファイアウォールの問題でもあります。リージョンサーバーは起動していても、ポートはファイアウォールで保護されています。

HBaseAdmin#availableに電話して、HBaseがクライアントから起動しているかどうかを確認することもできます。

+0

(マスター・シェルから起動することができます)、私は「jsonlog」、「requestdata」を作成すなわち 、3列の家族に「jsonlog」テーブルを作成し、 '応答データ'、 'ユーザデータ' 'jsonlog'、 '1'、 'requestdata:requestmessage'、 'test'を入力してください。 'jsonlog'、 '1'、 'requestdata:requestdate'を入力してください。 'test' 'jsonlog'、 '1'、 'responsedata:responsemessage'、 'test'を入力してください 'jsonlog'、 '1'を入力してください 'jsonlog'、 '1'、 'responsedata:responsedate' 、 'userdata:user、' test ' 0 0.0310秒 –

1

多くの問題は、HBaseがインストールされている方法やネットワーク構成によって異なる場合があります。

HBaseでは、ほとんどの作業がスレーブノードによって行われ、マスターノードは単にあなたの主要な「接点」です。たいていの場合、スレーブノードのIPを返します(内部IP)。これは、操作を実行することになっています(読み取り/書き込みは確かに可能です。テーブルを作成する)。クライアントがそのスレーブIPを解決できない、またはアクセスできない場合、接続の問題が発生する可能性があります。あなたが戻ってくる例外は変わるかもしれません。

しようとするもの:

  • はあなたがマスターノード上でHBaseのシェルからテーブルを作成することはできますか?
    • 注:それはちょうどマスターノードによって提供されるかもしれないようlistが十分ではありません...
  • は、REST APIを介してコマンドの仕事をしていますか?ええ、私が作成、実行し、正常に まずスキャンすることができます
+0

うんで 行のCOLUMN + CELL ... .... 1行(複数可)、私は192.168でのHBaseシェルからtavkeを作成することができます。はその後、すなわち スキャン 'jsonlog' プロデュース は、スキャンします。 11.7 hadoopとhbaseがどこにあるのですか Hmmm、あなたはどういう意味ですか?**コマンドはREST APIを介して機能しますか? (マスターシェルから起動することができます)** マスターノードには非常に –

+0

sshありがとうございます。 'bin/hbase rest start -p port_number'を実行してください。これにより、指定したポートにHBase RESTサーバーが起動します。シェルを開いたままにしておきます。ブラウザを使用して、master_node:port_numberに移動します。 HBaseコマンドは、REST API経由で発行できます。 Ref:https://hbase.apache.org/book.html#_rest – Gevorg

+0

リモートマシンから内部IPをpingできるかどうかチェックしましたか?おそらくTCPアクセス権も必要になり、ポート60020を開いてリージョンサーバと通信することに注意してください – Gevorg