使用LoadIncrementalHFiles和子目录批量加载

时间:2017-09-25 11:34:44

标签: hadoop hbase bulk-load hfile

我编写了一个Spark应用程序,它生成HFile,以便稍后使用LoadIncrementalHFiles命令进行批量加载。由于源数据池非常大,因此输入文件将被拆分为一个接一个地处理的迭代。每次迭代都会创建自己的HFile目录,因此我的HDFS结构如下所示:

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

这个map_data目录中有大约500个文件,因此我正在寻找一种自动调用LoadIncrementalHFiles函数的方法,以便稍后在迭代中处理这些子目录。

相应的命令是:

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

我需要将其更改为迭代命令,因为此命令不适用于子目录(当我使用/user/myuser/map_data目录调用它时)!

我尝试使用Java Process实例自动执行上面的命令,但是没有做任何事情(没有输出到控制台,也没有更多行在我的HBase表中)。

使用我的代码中的org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles Java类也不起作用,它也没有响应!

有人为我做一个有用的例子吗?或者是否有一个参数能够在父目录上运行上面的hbase命令?我在Hortonworks Data Platform 2.5集群中使用HBase 1.1.2。

编辑我尝试从Hadoop客户端Java应用程序运行LoadIncrementalHFiles命令,但是我收到了与snappy压缩相关的异常,请参阅Run LoadIncrementalHFiles from Java client

1 个答案:

答案 0 :(得分:0)

解决方案是将hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dcreate.table=no /user/myuser/map_data/hfiles_0 mytable命令拆分为多个部分(每个命令部分一个),请参阅此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();
    ...
}