2017-09-25 9 views
0

後でLoadIncrementalHFilesコマンドでバルクロードに使用するHFilesを生成するSparkアプリケーションを作成しました。ソース・データ・プールが非常に大きいので、入力ファイルは順次処理される反復に分割されます。LoadIncrementalHFilesとサブディレクトリを使用したバルクロード

/user/myuser/map_data/hfiles_0 
     ...   /hfiles_1 
     ...   /hfiles_2 
     ...   /hfiles_3 
        ... 

このmap_dataディレクトリにある約500のファイル、したがって、私はプロセスに、自動的にLoadIncrementalHFiles関数を呼び出す方法を探していますがあります。私のHDFS構造は次のようになりますので、各反復は、独自のHFileディレクトリを作成しますこれらのサブディレクトリは後で反復されます。

対応するコマンドは次のようになります:私は、このコマンドは(私は/user/myuser/map_dataディレクトリとそれを呼び出すとき)のサブディレクトリでは動作しないよう、繰り返しコマンドにこれを変更する必要が

hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dcreate.table=no /user/myuser/map_data/hfiles_0 mytable 

上記のコマンドを自動的に実行するために、Java Processインスタンスを使用しようとしましたが、これは何も起こりません(コンソールに出力されず、HBaseテーブルにも行がありません)。

org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFilesコードのJavaクラスも使用できませんが、応答しません。

私のための実例は誰ですか?または上記のhbaseコマンドを親ディレクトリに実行するためのパラメータがありますか?私はHortonworks Data Platform 2.5クラスタでHBase 1.1.2を使用しています。

EDIT私はHadoopのクライアントJavaアプリケーションからLoadIncrementalHFilesコマンドを実行しようとしたが、私はてきぱきと圧縮に関連する例外を取得しています、Run LoadIncrementalHFiles from Java client

答えて

0

ソリューションは、多くの部分にhbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dcreate.table=no /user/myuser/map_data/hfiles_0 mytableコマンドを分割した参照します(コマンド部分ごとに1つ)、このJavaコードスニペットをご覧ください:

TreeSet<String> subDirs = getHFileDirectories(new Path(HDFS_PATH), hadoopConf); 

for(String hFileDir : subDirs) { 

    try { 
     String pathToReadFrom = HDFS_OUTPUT_PATH + "/" + hFileDir; 
     ==> String[] execCode = {"hbase", "org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles", "-Dcreate.table=no", pathToReadFrom, hbaseTableName}; 
     ProcessBuilder pb = new ProcessBuilder(execCode); 
     pb.redirectErrorStream(true); 
     final Process p = pb.start(); 

     // Write the output of the Process to the console 
     new Thread(new Runnable() { 
      public void run() { 
       BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
       String line = null; 

       try { 
        while ((line = input.readLine()) != null) 
         System.out.println(line); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 

    // Wait for the end of the execution 
    p.waitFor(); 
    ... 
} 
関連する問題