EC2上のHBaseに外部から接続する方法

417 views
Skip to first unread message

豊月

unread,
Feb 22, 2010, 11:50:47 PM2/22/10
to Hadoopユーザー会
こんにちわ。掲題の件で質問があります。

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名にする、という設定を行う事は可能なのでしょうか?
以上よろしくお願いします。

Tatsuya Kawano

unread,
Feb 23, 2010, 10:22:27 AM2/23/10
to hado...@googlegroups.com
たつやです。こんにちは。

> 原因としては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接続してはどうでしょうか?

http://aws.amazon.com/vpc/


または、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>:

Tatsuya Kawano

unread,
Feb 23, 2010, 8:59:59 PM2/23/10
to hadoop-jp

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 <tatsu...@gmail.com>
wrote:

> たつやです。こんにちは。
>
>> 原因としてはHBaseMasterが返してくるHRegionServerの
>> IPがEC2内部ネットワークのIPになってしまっているよう
>> なのです。
>> この内部IPを外部IP、或いは外部DNS名にする、と
>> いう設定を行う事は可能なのでしょうか?
>
> 残念ながら、ZooKeeperに登録されている内部IPを、外部
> IPや外部DNS名にすることはできません。HBaseは、NAT
> の外側からのアクセスを直接受けることは想定していないので、ちょっ
> と無理だと思います。
>
> Region Server の IPアドレスは、以下の方法で取得されていま

豊月

unread,
Feb 23, 2010, 9:59:20 PM2/23/10
to Hadoopユーザー会
河野様

詳しいご回答有り難うございます。
現状の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>:

Reply all
Reply to author
Forward
0 new messages