2016-10-12 12 views
0
によってコプロセッサのステップをロードする方法

は、誰もがregionCoprocessorがshell.iがステップ

+0

申し訳ありませんが、シェルで質問しましたが、私はJavaに答えました。 "シェル"という言葉には記されていません。とにかく、誰かのために役立つかもしれない..私はシェルではわからない。 HBaseシェルでは決して実際に働いたことがありません – Mallikarjun

答えて

1

以下の手順に従ってください読み込みに関する適切な情報を取得し、事前にCoprocessor.Thanksを展開することはできませんトラフロードする方法を説明しなければならないことができますステップ1:インターフェイスを作成し、org.apache.hadoop.hbase.ipc.CoprocessorProtocol

ステップ2拡張:

を作っているあなたはコプロセッサ呼び出した後に実行したいインタフェースのメソッドを定義します。

ステップ3:この例で

:以下の例をご覧ください必要なすべてのパラメータ

HTable.coprocessorExec()メソッドを呼び出します。HTable

ステップ4のインスタンスを作成します。登録番号が興味のある範囲内にある学生のリストを取得しようとしています。

作成インタフェースプロトコル:

public interface CoprocessorTestProtocol extends org.apache.hadoop.hbase.ipc.CoprocessorProtocol{ 
    List<Student> getStudentList(byte[] startRegistrationNumber, byte[] endRegistrationNumber) throws IOException; 
} 

サンプルStudentクラス:

public class Student implements Serializable{ 
    byte[] registrationNumber; 
    String name; 

    public void setRegistrationNumber(byte[] registrationNumber){ 
     this.registrationNumber = registrationNumber; 
    } 

    public byte[] getRegistrationNumber(){ 
     return this.registrationNumber; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 

    public int getName(){ 
     return this.name; 
    } 

    public String toString(){ 
     return "Student[ registration number = " + Bytes.toInt(this.getRegistrationNumber()) + " name = " + this.getName() + " ]" 
    } 
} 

モデルクラス: [HBaseのからデータを取得するためのビジネスロジックが書かれている]

public class MyModel extends org.apache.hadoop.hbase.coprocessor.BaseEndpointCoprocessor implements CoprocessorTestProtocol{ 

    @Override 
    List<Student> getStudentList(byte[] startRegistrationNumber, byte[] endRegistrationNumber){ 
     Scan scan = new Scan(); 
     scan.setStartRow(startRegistrationNumber); 
     scan.setStopRow(endRegistrationNumber); 

     InternalScanner scanner = ((RegionCoprocessorEnvironment) getEnvironment()).getRegion().getScanner(scan); 

     List<KeyValue> currentTempObj = new ArrayList<KeyValue>(); 
     List<Student> studentList = new ArrayList<Student>(); 

     try{ 
      Boolean hasNext = false; 
      Student student; 

      do{ 
       currentTempObj.clear(); 
       hasNext = scanner.next(currentTempObj); 

       if(!currentTempObj.isEmpty()){ 
        student = new Student(); 
        for(KeyValue keyValue: currentTempObj){ 
         bytes[] qualifier = keyValue.getQualifier(); 
         if(Arrays.equals(qualifier, Bytes.toBytes("registrationNumber"))) 
          student.setRegistrationNumber(keyValue.getValue()); 
         else if(Arrays.equals(qualifier, Bytes.toBytes("name"))) 
          student.setName(Bytes.toString(keyValue.getValue())); 
        } 
        StudentList.add(student); 
       } 
      }while(hasNext); 

     }catch (Exception e){ 
      // catch the exception the way you want 
     } 
     finally{ 
      scanner.close(); 
     } 
    } 
} 

Clientクラス: [コプロセッサへの呼び出しが行われる場所]

public class MyClient{ 

    if (args.length < 2) { 
     System.out.println("Usage : startRegistrationNumber endRegistrationNumber"); 
     return; 
    } 

    public List<Student> displayStudentInfo(int startRegistrationNumber, int endRegistrationNumber){ 
     final byte[] startKey=Bytes.toBytes(startRegistrationNumber); 
     final byte[] endKey=Bytes.toBytes(endRegistrationNumber); 


    String zkPeers = SystemInfo.getHBaseZkConnectString(); 
    Configuration configuration=HBaseConfiguration.create(); 
    configuration.set(HConstants.ZOOKEEPER_QUORUM, zkPeers); 

    HTableInterface table = new HTable(configuration, TABLE_NAME); 

     Map<byte[],List<Student>> allRegionOutput; 

     allRegionOutput = table.coprocessorExec(CoprocessorTestProtocol.class, startKey,endKey, 
       new Batch.Call<CoprocessorTestProtocol, List<Student>>() { 
      public List<Student> call(CoprocessorTestProtocol instance)throws IOException{ 
       return instance.getStudentList(startKey, endKey); 
      } 
     }); 

     table.close(); 

     List<Student> anotherList = new ArrayList<Student>(); 

     for (List<Student> studentData: allRegionOutput.values()){ 
      anotherList.addAll(studentData); 
     } 

     return anotherList; 
    } 

    public static void main(String args){ 

     if (args.length < 2) { 
      System.out.println("Usage : startRegistrationNumber endRegistrationNumber"); 
      return; 
     } 

     int startRegistrationNumber = args[0]; 
     int endRegistrationNumber = args[1]; 

     for (Student student : displayStudentInfo(startRegistrationNumber, endRegistrationNumber)){ 
      System.out.println(student); 
     } 
    } 
} 

注意してください:例でScanner.next(Object)法上の特別な外観を持っていてください。これはブール値を返し、現在のオブジェクトを引数に格納します