EC2上にHBaseを構築し、そのHBaseへ接続を試みています。
ZooKeeper、HBaseMasterへは接続出来ている様なのですが、HRegionServerへの接続が出来ません。
原因としてはHBaseMasterが返してくるHRegionServerのIPがEC2内部ネットワークのIPになってしまっているようなので
す。
Log:XXXが外部IP、YYYが内部IP
=========================================================================
zookeeper.ClientCnxn: Priming connection to
java.nio.channels.SocketChannel[connected local=192.168.0.1:2091
remote=ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com/XXX.XXX.XXX.XXX:
2181]
zookeeper.ClientCnxn: Server connection successful
ipc.HbaseRPC: Problem connecting to server: /YYY.YYY.YYY.YYY:54095
=========================================================================
この内部IPを外部IP、或いは外部DNS名にする、という設定を行う事は可能なのでしょうか?
以上よろしくお願いします。
> 原因としてはHBaseMasterが返してくるHRegionServerのIPがEC2内部ネットワークのIPになってしまっているようなのです。
> この内部IPを外部IP、或いは外部DNS名にする、という設定を行う事は可能なのでしょうか?
残念ながら、ZooKeeperに登録されている内部IPを、外部IPや外部DNS名にすることはできません。HBaseは、NATの外側からのアクセスを直接受けることは想定していないので、ちょっと無理だと思います。
Region Server の IPアドレスは、以下の方法で取得されています。
HRegionServer.java
=============================================
public HRegionServer(Configuration conf) throws IOException {
machineName = DNS.getDefaultHost(
conf.get("hbase.regionserver.dns.interface","default"),
conf.get("hbase.regionserver.dns.nameserver","default"));
String addressStr = machineName + ":" +
conf.get(REGIONSERVER_PORT, Integer.toString(DEFAULT_REGIONSERVER_PORT));
this.address = new HServerAddress(addressStr);
LOG.info("My address is " + address);
=============================================
まずホスト名を取得して、次に、DNSをルックアップして、対応するIPアドレスを取得しています。EC2の場合は、ホスト名は "dom"
で始まる内部DNS名が得られるはずですので、それに対応する内部IPが取得されているのでしょう。
試してないのでうまくいくかは分かりませんが、Amazon Virtual Private
Cloudサービスを使って、HBaseクラスターへVPN接続してはどうでしょうか?
または、HRegionServer.javaと HMaster.java の
IPアドレス取得のコードを書き換えて、外部IPアドレスを取ってくるようにすることもできなくはないと思います。しかし、その場合、HBaseクラスター内での通信も外部IPアドレスと使うことになり、おそらく、EC2の課金対象になってしまいますので、あまりお勧めできる方法ではなさそうです。
--
河野 達也
Tatsuya Kawano (Mr.)
Tokyo, Japan
twitter: http://twitter.com/tatsuya6502
2010/2/23 豊月 <obsess...@gmail.com>:
EC2外部のクライアントから接続する時だけ、この外部DNS名を使う
よう、クライアント側のコード(たぶん、HConnection.java)を変
更すればいいと思います。
ただ、いまのバージョンの HBaseにはクライアントの認証と認可を
する機能がありませんので、EC2の security groupをしっか
り設定して、部外者が接続できないようにする必要があると思います。
たつや
On Feb 24, 2010, at 12:22 AM, Tatsuya Kawano <tatsu...@gmail.com>
wrote:
> たつやです。こんにちは。
>
>> 原因としてはHBaseMasterが返してくるHRegionServerの
>> IPがEC2内部ネットワークのIPになってしまっているよう
>> なのです。
>> この内部IPを外部IP、或いは外部DNS名にする、と
>> いう設定を行う事は可能なのでしょうか?
>
> 残念ながら、ZooKeeperに登録されている内部IPを、外部
> IPや外部DNS名にすることはできません。HBaseは、NAT
> の外側からのアクセスを直接受けることは想定していないので、ちょっ
> と無理だと思います。
>
> Region Server の IPアドレスは、以下の方法で取得されていま
詳しいご回答有り難うございます。
現状のHBaseで私のやりたい事を行おうとするのであれば、やはりソースに手を入れる意外方法はない、という事ですね。
ソースに手を入れる方法は試みているのですが、現状成功していないので他に方法があるかなぁと思い質問をしてみました。
EC2上で外部通信になる為に課金される事、Security設定如何によっては危険な事、は肝に銘じておきます。
どうもありがとうございました。
以上よろしくお願いします。
On 2月24日, 午前10:59, Tatsuya Kawano <tatsuya6...@gmail.com> wrote:
> HBaseのプログラム修正で対応する残りの方法としては、
> HRegionServer.javaと HMaster.javaの中で外部DNS名をなん
> とか取得して、内部IPに加えて、この情報も ZooKeeperに置
> くことでしょうか?
>
> EC2外部のクライアントから接続する時だけ、この外部DNS名を使う
> よう、クライアント側のコード(たぶん、HConnection.java)を変
> 更すればいいと思います。
>
> ただ、いまのバージョンの HBaseにはクライアントの認証と認可を
> する機能がありませんので、EC2の security groupをしっか
> り設定して、部外者が接続できないようにする必要があると思います。
>
> たつや
>
> On Feb 24, 2010, at 12:22 AM, Tatsuya Kawano <tatsuya6...@gmail.com>
> > 2010/2/23 豊月 <obsessedm...@gmail.com>: