2013-10-15 3 views
3

Java를 사용하여 원격 HBase 클라이언트를 작성하려고합니다. 다음은 참조 용 코드입니다.HBase Java 클라이언트가 작동하지 않음 (MasterNotRunningException 예외)

package ttumdt.app.connector; 


import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.hbase.MasterNotRunningException; 
import org.apache.hadoop.hbase.ZooKeeperConnectionException; 
import org.apache.hadoop.hbase.client.HBaseAdmin; 
import org.apache.hadoop.hbase.client.HTable; 
import org.apache.hadoop.hbase.client.Result; 
import org.apache.hadoop.hbase.client.ResultScanner; 
import org.apache.hadoop.hbase.client.Scan; 
import org.apache.hadoop.hbase.filter.BinaryComparator; 
import org.apache.hadoop.hbase.filter.CompareFilter; 
import org.apache.hadoop.hbase.filter.Filter; 
import org.apache.hadoop.hbase.filter.FilterList; 
import org.apache.hadoop.hbase.filter.RowFilter; 
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; 
import org.apache.hadoop.hbase.util.Bytes; 

import java.io.IOException; 
import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

public class HBaseClusterConnector { 
    private final String MASTER_IP = "10.138.168.185"; 
    private final String ZOOKEEPER_PORT = "2181"; 

    final String TRAFFIC_INFO_TABLE_NAME = "TrafficLog"; 
    final String TRAFFIC_INFO_COLUMN_FAMILY = "TimeStampIMSI"; 

    final String KEY_TRAFFIC_INFO_TABLE_BTS_ID = "BTS_ID"; 
    final String KEY_TRAFFIC_INFO_TABLE_DATE = "DATE"; 
    final String COLUMN_IMSI = "IMSI"; 
    final String COLUMN_TIMESTAMP = "TIME_STAMP"; 

    private final byte[] columnFamily = Bytes.toBytes(TRAFFIC_INFO_COLUMN_FAMILY); 
    private final byte[] qualifier= Bytes.toBytes(COLUMN_IMSI); 

    private Configuration conf = null; 

    public HBaseClusterConnector() throws MasterNotRunningException, ZooKeeperConnectionException { 
     conf = HBaseConfiguration.create(); 
     conf.set("hbase.zookeeper.quorum",MASTER_IP); 
     conf.set("hbase.zookeeper.property.clientPort",ZOOKEEPER_PORT); 
     HBaseAdmin.checkHBaseAvailable(conf); 
    } 

    /** 
    * This filter will return list of IMSIs for a given btsId and ime interval 
    * @param btsId : btsId for which the query has to run 
    * @param startTime : start time for which the query has to run 
    * @param endTime : end time for which the query has to run 
    * @return returns IMSIs as set of Strings 
    * @throws IOException 
    */ 
    public Set<String> getInfoPerBTSID(String btsId, String date, 
             String startTime, String endTime) 
      throws IOException { 
     Set<String> imsis = new HashSet<String>(); 

     //ToDo : better exception handling 
     HTable table = new HTable(conf, TRAFFIC_INFO_TABLE_NAME); 
     Scan scan = new Scan(); 

     scan.addColumn(columnFamily,qualifier); 
     scan.setFilter(prepFilter(btsId, date, startTime, endTime)); 

     // filter to build where timestamp 

     Result result = null; 
     ResultScanner resultScanner = table.getScanner(scan); 

     while ((result = resultScanner.next())!= null) { 
      byte[] obtainedColumn = result.getValue(columnFamily,qualifier); 
      imsis.add(Bytes.toString(obtainedColumn)); 
     } 

     resultScanner.close(); 

     return imsis; 
    } 

    //ToDo : Figure out how valid is this filter code?? How comparison happens 
    // with eqaul or grater than equal etc 


    private Filter prepFilter (String btsId, String date, 
           String startTime, String endTime) 
    { 
     byte[] tableKey = Bytes.toBytes(KEY_TRAFFIC_INFO_TABLE_BTS_ID); 
     byte[] timeStamp = Bytes.toBytes(COLUMN_TIMESTAMP); 

     // filter to build -> where BTS_ID = <<btsId>> and Date = <<date>> 
     RowFilter keyFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, 
       new BinaryComparator(Bytes.toBytes(btsId+date))); 

     // filter to build -> where timeStamp >= startTime 
     SingleColumnValueFilter singleColumnValueFilterStartTime = 
       new SingleColumnValueFilter(columnFamily, timeStamp, 
         CompareFilter.CompareOp.GREATER_OR_EQUAL,Bytes.toBytes(startTime)); 

     // filter to build -> where timeStamp <= endTime 
     SingleColumnValueFilter singleColumnValueFilterEndTime = 
       new SingleColumnValueFilter(columnFamily, timeStamp, 
         CompareFilter.CompareOp.LESS_OR_EQUAL,Bytes.toBytes(endTime)); 

     FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays 
       .asList((Filter) keyFilter, 
         singleColumnValueFilterStartTime, singleColumnValueFilterEndTime)); 
     return filterList; 
    } 


    public static void main(String[] args) throws IOException { 
     HBaseClusterConnector flt = new HBaseClusterConnector(); 
     Set<String> imsis= flt.getInfoPerBTSID("AMCD000784", "26082013","104092","104095"); 
     System.out.println(imsis.toString()); 
    } 
} 

저는 이것을 테스트하기 위해 현재 Cloudera 빠른 시작 VM을 사용하고 있습니다.

문제는 다음과 같습니다. VM에서이 코드를 실행하면 절대 작동합니다. 하지만 외부에서 실행하면 아래 오류로 실패합니다. 그리고 나는 VM 설정과 관련이 있다고 의심하고 있습니다. 호스트 컴퓨터에서 VM의 노드 관리자/작업 추적기에 연결할 수 있는지 여부는 이미 확인 했으므로 잘 작동합니다. VM에서 실행하는 대신 내 호스트 OS에서 코드를 실행할 때; 아래 오류가 표시됩니다.

2013-10-15 18:16:04.185 java[652:1903] Unable to load realm info from SCDynamicStore 
Exception in thread "main" org.apache.hadoop.hbase.MasterNotRunningException: Retried 1 times 
    at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:138) 
    at org.apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.java:1774) 
    at ttumdt.app.connector.HBaseClusterConnector.<init>(HBaseClusterConnector.java:47) 
    at ttumdt.app.connector.HBaseClusterConnector.main(HBaseClusterConnector.java:117) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 

Process finished with exit code 1 

주의 사항 : 마스터 노드가 실제로 실행 중입니다. zookeper 로그는 호스트와의 연결을 설정했음을 보여줍니다. OS :

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

6:16:03.274 PM INFO org.apache.zookeeper.server.ZooKeeperServer  

Client attempting to establish new session at /10.138.169.81:50567 

6:16:03.314 PM INFO org.apache.zookeeper.server.ZooKeeperServer  

Established session 0x141bc2487440004 with negotiated timeout 60000 for client /10.138.169.81:50567 

6:16:03.964 PM INFO org.apache.zookeeper.server.PrepRequestProcessor  

Processed session termination for sessionid: 0x141bc2487440004 

6:16:03.996 PM INFO org.apache.zookeeper.server.NIOServerCnxn 

Closed socket connection for client /10.138.169.81:50567 which had sessionid 0x141bc2487440004 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

그러나 Master 또는 RegionServer 로그의 활동에 대한 흔적은 없습니다.

내 호스트 OS는 맥 OSX 사용할 수있는 자원으로 당 10.7.5

있음을 유의하시기 바랍니다; 이 잘 작동합니다; 어떤 사람들은 간단한 HBase 자바 클라이언트가 절대로 작동하지 않는다고 제안하기도합니다. 나는 혼란 스럽다. 열정적으로 포인터를 기다리고 있습니다 !!! 답장을 보내주십시오.

답변

0

HBase Java 클라이언트가 확실히 작동합니다!

가장 일반적인 설명은 클라이언트가 어떤 이유로 마스터가 실행중인 컴퓨터를 볼 수 없다는 것입니다.

하나의 가능한 설명은 IP 주소를 사용하여 Zookeeper에 연결하더라도 HBase 클라이언트가 호스트 이름을 사용하여 마스터에 연결하려고 시도한다는 것입니다.

따라서 클라이언트에서 마스터 파일을 실행하는 컴퓨터의 호스트 이름과 일치하는 항목이 있는지 확인하면 문제가 해결 될 수 있습니다.

클라이언트 컴퓨터의 < 호스트 이름 > : 60010에서 마스터 웹 UI에 액세스 할 수 있는지 확인하십시오.

0
가 다른 포트에 hiveserver2를 시작하고 다른 포트에서 hiveserver2 연결

명령을 연결합니다

(있는지 확인 하이브 경로에) :

hive --service hiveserver2 --hiveconf hive.server2.thrift.port=13000 
관련 문제