복붙노트

[HADOOP] Amazon EMR에서 java의 hbase를 사용하는 데 문제가 발생했습니다.

HADOOP

Amazon EMR에서 java의 hbase를 사용하는 데 문제가 발생했습니다.

그래서 내가 사용자 정의 항아리를 사용하여 아마존 ec2에서 내 hbase 클러스터를 쿼리하려고하는데 MapReduce 단계로 실행됩니다. 메신저 내 항아리 (지도 함수 내부) 나는 Hbase 전화 이렇게 :

public void map( Text key, BytesWritable value, Context contex ) throws IOException, InterruptedException {
    Configuration conf = HBaseConfiguration.create();
    HTable table = new HTable(conf, "tablename");
      ...

문제는 그것이 HTable 라인에 도착하고 hbase에 연결을 시도 할 때 단계가 실패하고 다음과 같은 오류가 발생한다는 것입니다.

2014-02-28 18:00:49,936 INFO [main] org.apache.zookeeper.ZooKeeper: Initiating client connection, connectString=localhost:2181 sessionTimeout=180000 watcher=hconnection
2014-02-28 18:00:49,974 INFO [main] org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper: The identifier of this process is 5119@ip-10-0-35-130.ec2.internal
2014-02-28 18:00:49,998 INFO [main-SendThread(localhost:2181)] org.apache.zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2014-02-28 18:00:50,005 WARN [main-SendThread(localhost:2181)] org.apache.zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused

      ...

2014-02-28 18:01:05,542 WARN [main] org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper: Possibly transient ZooKeeper exception: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid
2014-02-28 18:01:05,542 ERROR [main] org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper: ZooKeeper exists failed after 3 retries
2014-02-28 18:01:05,542 WARN [main] org.apache.hadoop.hbase.zookeeper.ZKUtil: hconnection Unable to set watcher on znode (/hbase/hbaseid)
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid

      ... and on and on

hbase 쉘을 사용하면 쉘에서 데이터와 모든 것을 쿼리 할 수 ​​있습니다. 나는 어디에서 시작해야하는지 아무런 단서가 없다. 그리고 나는 운이없는 몇 시간 동안 인터넷 검색을 해왔다. 인터넷에서 이와 같은 문제의 대부분은 아마존 특정 수정에 대해 이야기하지 않습니다. 나는 사육사와 hbase가 아마존 부트 스트랩에 의해 자동으로 올바르게 연결되어야한다고 생각했다.

나는 hbase 0.94.17 항아리를 사용하고 아마존은 hbase 0.94.7을 실행 중입니다. 문제는 아니지만 자바 코드를 올바르게 설정하지 않은 것 같습니다. 누구든지 이걸로 도울 수 있다면 크게 감사하겠습니다. 감사합니다.

해결법

  1. ==============================

    1.글쎄, 거의 30 시간 후에 나는 해결책을 찾았다. 이것에 대한 많은주의 사항이 있으며 버전이 중요합니다.

    글쎄, 거의 30 시간 후에 나는 해결책을 찾았다. 이것에 대한 많은주의 사항이 있으며 버전이 중요합니다.

    이 경우에는 Hbase 0.94.7과 amazon emr hadoop2 (ami 3.0.4)를 사용하고 동일한 클러스터에서 사용자 정의 jar를 실행하여 java를 통해 hbase에 로컬로 액세스하려고 시도합니다.

    따라서 가장 먼저 EC2가 직면하는 외부 / 내부 IP idiosynchronicies 때문에 기본 hbase 구성이 작동하지 않습니다. 따라서 당신은 HConfiguration을 사용할 수 없다. (기본값은 로컬 호스트 쿼럼이기 때문에) 당신이해야 할 일은 amazon이 설정 한 구성 (/home/hadoop/hbase/conf/hbase-site.xml에 있음)을 사용하고 빈 구성 객체에 수동으로 추가하는 것입니다.

    연결 코드는 다음과 같습니다.

    Configuration conf = new Configuration();
    conf.addResource("/home/hadoop/hbase/conf/hbase-site.xml");
    HBaseAdmin.checkHBaseAvailable(conf);
    

    둘째, 사용자 정의 jar에 올바른 hbase jar PACKAGED를 사용해야합니다. 그 이유는 hbase 94.x가 기본적으로 hadoop1을 위해 컴파일되기 때문에 hadoop2에 대해 컴파일 된 hbase-0.94.6-cdh4.3.0.jar (온라인에서 찾을 수 있음)라는 cloudera hbase jar를 가져와야하기 때문입니다. 이 부분을 수행하지 않으면 org.apache.hadoop.net.NetUtils 예외를 포함하여 많은 지저분하고 오류없는 오류가 발생합니다.

  2. from https://stackoverflow.com/questions/22105085/trouble-using-hbase-from-java-on-amazon-emr by cc-by-sa and MIT license