web-dev-qa-db-ja.com

HbaseクライアントがリモートHbaseサーバーに接続できない

リモートサーバー用に次のhbaseクライアントクラスを作成しました。

System.out.println("Hbase Demo Application ");

            // CONFIGURATION

                // ENSURE RUNNING
            try {
                HBaseConfiguration config = new HBaseConfiguration();
                config.clear();
                config.set("hbase.zookeeper.quorum", "192.168.15.20");
                config.set("hbase.zookeeper.property.clientPort","2181");
                config.set("hbase.master", "192.168.15.20:60000");
                //HBaseConfiguration config = HBaseConfiguration.create();
    //config.set("hbase.zookeeper.quorum", "localhost");  // Here we are running zookeeper locally
                HBaseAdmin.checkHBaseAvailable(config);


                System.out.println("HBase is running!");
            //  createTable(config);    
                //creating a new table
                HTable table = new HTable(config, "mytable");
                System.out.println("Table mytable obtained ");  
                addData(table);
            } catch (MasterNotRunningException e) {
                System.out.println("HBase is not running!");
                System.exit(1);
            }catch (Exception ce){ ce.printStackTrace();

それはいくつかの例外を投げています:

Oct 17, 2011 1:43:54 PM org.Apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation getMaster
INFO: getMaster attempt 0 of 1 failed; no more retrying.
Java.net.ConnectException: Connection refused
    at Sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at Sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.Java:567)
    at org.Apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.Java:206)
    at org.Apache.hadoop.net.NetUtils.connect(NetUtils.Java:404)
    at org.Apache.hadoop.hbase.ipc.HBaseClient$Connection.setupIOstreams(HBaseClient.Java:328)
    at org.Apache.hadoop.hbase.ipc.HBaseClient.getConnection(HBaseClient.Java:883)
    at org.Apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.Java:750)
    at org.Apache.hadoop.hbase.ipc.HBaseRPC$Invoker.invoke(HBaseRPC.Java:257)
    at $Proxy4.getProtocolVersion(Unknown Source)
    at org.Apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.Java:419)
    at org.Apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.Java:393)
    at org.Apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.Java:444)
    at org.Apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getMaster(HConnectionManager.Java:359)
    at org.Apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.Java:89)
    at org.Apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.Java:1215)
    at com.ifkaar.hbase.HBaseDemo.main(HBaseDemo.Java:31)
HBase is not running!

なぜ例外がスローされるのか、コードの何が問題なのか、そしてそれを解決する方法を教えてください。

14
Ali Raza

この問題は、HBaseサーバーのホストファイルが原因で発生します。
HBaseサーバーの/ etc/hostsファイルを編集するだけです。
そのファイルからlocalhostエントリを削除し、localhostエントリをHBaseサーバーIPの前に配置します。

たとえば、HBaseサーバーの/etc/hostsファイルは次のようになります。

127.0.0.1 localhost
192.166.66.66 xyz.hbase.com hbase

Localhostを削除して、次のように変更する必要があります。

# 127.0.0.1 localhost # line commented out
192.166.66.66 xyz.hbase.com hbase localhost # note: localhost added here

これは、リモートマシンがhbaseサーバーマシンにHMasterが実行されている場所を尋ねると、ローカルホストで実行されていることを通知するためです。
したがって、エントリが127.0.0.1の場合、HBaseサーバーはこのアドレスを返し、リモートマシンは自身のマシン(ローカル)でHMasterの検索を開始します。
HBaseサーバーIPでこれを変更すると、すべてが正常に機能します:)

22
khan

同意します。HBaseは/ etc/hosts構成に非常に敏感です。上記のJavaコード作業するには...例:次のように設定する必要がありました:

{property}
  {name}hbase.zookeeper.quorum{/name}
  {value}www.remoterg12.net{/value}      {!-- this is the externally accessible domain --}
{/property}
{property}
  {name}hbase.zookeeper.property.clientPort{/name}
  {value}2181{/value}              {!-- everything needs to be externally accessible --}
{/property}
{property}
  {name}hbase.master.info.port{/name}    {!--   http://www.remoterg12.net:60010/ --}
  {value}60010{/value}
{/property}
{property}
  {name}hbase.master.info.bindAddress{/name}
  {value}www.remoterg12.net{/value}      {!-- Use this to access the GUI console, --}
{/property}

リモートGUIは、バインディングドメインの明確な画像を提供します。たとえば、「GUI Webコンソール」の[HBaseマスター]プロパティは、次のようになります。www.remoterg12.net:60010(localhostであってはなりません) :60010)...そしてはい!!、既存のApache構成を台無しにしたくなかったので、/ etc/hostsを正しく操作する必要がありました:-)

2
Shawn Brito

この質問に答えるには遅すぎることは知っていますが、同様の問題を解決する私の方法を共有したいと思います。

同じ問題が発生し、Javaプログラムからzookeeperクォーラムを設定しようとしましたが、CLIを介して試しましたが、いずれも機能しませんでした。

CDH5.7.7とHBaseバージョン1.1.0を使用しています。最後に、問題を修正するために、いくつかの構成をHadoopクラスパスにエクスポートする必要がありました。これが私がエクスポートした設定です。

export HADOOP_CLASSPATH=/etc/hadoop/conf:/usr/share/cmf/lib/cdh5/hbase-protocol-0.98.1-cdh5.5.0.jar:/etc/hbase/conf:/driven/conf

お役に立てれば。

ここでHBase1.1.3とまったく同じ問題が発生します。同じネットワーク上の2台の仮想マシン(Ubuntu)。ログは、クライアントがZookeeperに到達できるが、HBaseサーバーには到達できないことを示しています。

TL; DR:サーバーの/etc/hostsから次の行を削除します(server_hostame):

127.0.1.1 server_hostname server_hostname

そして、(ローカル)ネットワーク上のサーバーのIPを127.x.y.zで追加します。

192.x.y.z server_hostname

クライアント側とサーバー側で多くの組み合わせを試しました。スタンドアロンモードでは、これより良い方法はないと思います。それを本当に誇りに思っていません。ネットワーク構成をいじり、サーバーにリモート接続できるHBase Shellクライアントを提供しないのは残念です(Java幻想の世界へようこそ...)

サーバー側では、ファイルをconf/hbase-site.xmlを空のままにします。ここにZookeeper構成を配置する必要はありません。デフォルトで問題ありません。 etc/regionserversも同様です。スタンドアロンモードでは本当に気にしないので、デフォルトのエントリ(localhost)のままにしておきます(そしてserver_hostnameを入れようとしましたその中で、もちろんこれは機能しません)。

クライアント側では、サーバーを解決する場合はホスト名でサーバーを認識している必要があるため、サーバーの/etc/hostsクライアントファイルにエントリを再度追加します。

ボーナスとして、私はsbt構成とクライアントにいくつかのcomplete作業コードを提供します。これは、HBaseチームが過去4年間(再び、 Java/Scalaの「ビジネス対応」の世界を歓迎します。

build.sbt

libraryDependencies ++= Seq(
  ...
  "org.Apache.hadoop" % "hadoop-core" % "1.2.1",
  "org.Apache.hbase" % "hbase" % "1.1.2",
  "org.Apache.hbase" % "hbase-client" % "1.1.2",
)

some_client_code.scala

import org.Apache.hadoop.hbase.HBaseConfiguration
import org.Apache.hadoop.hbase.client.{HTable, Put, HBaseAdmin}
import org.Apache.hadoop.hbase.util.Bytes

val hbaseConf = HBaseConfiguration.create()
hbaseConf.set("hbase.zookeeper.quorum", "server_hostname")
HBaseAdmin.checkHBaseAvailable(hbaseConf)

val table = new HTable(hbaseConf, "my_hbase_table")
val put = new Put(Bytes.toBytes("row_key"))
put.add(Bytes.toBytes("cf"), Bytes.toBytes("colId1"), Bytes.toBytes("foo"))
0
Stan

同じ問題は、hbaseディレクトリのconf/regionserversファイルを編集してHbaseサーバー(リモート)を追加することで解決できます。その後、etc/hostsファイルを変更する必要はありません

編集後、conf/regionserversは次のようになります。

localhost  
ip address of the remote hbase server

例えば

localhost              
10.132.258.366
0