복붙노트

[HADOOP] 자바 클라이언트에서 실행 LoadIncrementalHFiles

HADOOP

자바 클라이언트에서 실행 LoadIncrementalHFiles

내 자바 클라이언트 코드에서 HBase와의 org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles / 사용자 / 참고 MyUser / map_data / hfiles MYTABLE 메소드를 호출합니다.

나는 응용 프로그램을 실행할 때 나는 다음과 같은 예외를 얻을 :

org.apache.hadoop.hbase.io.hfile.CorruptHFileException: Problem reading HFile Trailer from file webhdfs://myserver.de:50070/user/myuser/map_data/hfiles/b/b22db8e263b74a7dbd8e36f9ccf16508
    at org.apache.hadoop.hbase.io.hfile.HFile.pickReaderVersion(HFile.java:477)
    at org.apache.hadoop.hbase.io.hfile.HFile.createReader(HFile.java:520)
    at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles.groupOrSplit(LoadIncrementalHFiles.java:632)
    at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles$3.call(LoadIncrementalHFiles.java:549)
    at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles$3.call(LoadIncrementalHFiles.java:546)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: native snappy library not available: this version of libhadoop was built without snappy support.
    at org.apache.hadoop.io.compress.SnappyCodec.checkNativeCodeLoaded(SnappyCodec.java:65)
    at org.apache.hadoop.io.compress.SnappyCodec.getDecompressorType(SnappyCodec.java:193)
    at org.apache.hadoop.io.compress.CodecPool.getDecompressor(CodecPool.java:178)
    at org.apache.hadoop.hbase.io.compress.Compression$Algorithm.getDecompressor(Compression.java:327)
    at org.apache.hadoop.hbase.io.compress.Compression.decompress(Compression.java:422)
    at org.apache.hadoop.hbase.io.encoding.HFileBlockDefaultDecodingContext.prepareDecoding(HFileBlockDefaultDecodingContext.java:90)
    at org.apache.hadoop.hbase.io.hfile.HFileBlock.unpack(HFileBlock.java:529)
    at org.apache.hadoop.hbase.io.hfile.HFileBlock$AbstractFSReader$1.nextBlock(HFileBlock.java:1350)
    at org.apache.hadoop.hbase.io.hfile.HFileBlock$AbstractFSReader$1.nextBlockWithBlockType(HFileBlock.java:1356)
    at org.apache.hadoop.hbase.io.hfile.HFileReaderV2.<init>(HFileReaderV2.java:149)
    at org.apache.hadoop.hbase.io.hfile.HFileReaderV3.<init>(HFileReaderV3.java:77)
    at org.apache.hadoop.hbase.io.hfile.HFile.pickReaderVersion(HFile.java:467)
    ... 8 more

내 하둡 서버 콘솔에서 위의 명령이 완벽하게 작동합니다 ... HBase를 실행. 내가 HBase를 / 하둡 클라이언트 라이브러리를 사용하여 내 자바 코드에서 다음을 실행하려고하면 그러나 예외와 함께 실패!

여기에 코드 스 니펫 :

public static void main(String[] args) {

    try {
        Configuration conf = loginFromKeyTab("REALM.DE", "server.de", "user", "C:/user.keytab");
        conf.set("fs.webhdfs.impl", org.apache.hadoop.hdfs.web.WebHdfsFileSystem.class.getName());
        conf.set("hbase.zookeeper.quorum", "server1.de,server2.de,server3.de");
        conf.set("zookeeper.znode.parent", "/hbase-secure");
        conf.set("hbase.master.kerberos.principal", "hbase/_HOST@REALM.DE");
        conf.set("hbase.regionserver.kerberos.principal", "hbase/_HOST@REALM.DE");
        conf.set("hbase.security.authentication", "kerberos");

        Connection connection = ConnectionFactory.createConnection(conf);
        Table table = connection.getTable(TableName.valueOf("mytable"));

        RegionLocator locator = connection.getRegionLocator(table.getName());

        Job job = Job.getInstance(conf, "Test Bulk Load"); 

        //HFileOutputFormat2.configureIncrementalLoad(job, table, locator);     
        //Configuration conf2 = job.getConfiguration();

        LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);
        loader.doBulkLoad(new Path(HDFS_PATH), connection.getAdmin(), table, locator);
    } catch(Exception e) {
        e.printStackTrace();
    }
}

내 프로젝트에 종속성을 추가해야합니까? 하지만 어떻게 / 어디서 / 버전?

나는 HBase와의 1.1.2 및 하둡 2.7.3을 포함 HDP 2.5 함께 일하고 있어요

해결법

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

    1.나는 내 문제에 대한 또 다른 해결책을 발견 : 나는 (하둡 노드에서 직접 실행) 자동 LoadIncrementalHFiles 메소드를 호출 프로세스 인스턴스를 실행하는 자바 프로그램을 사용하는 대신 내 코드에서 LoadIncrementalHFiles 클래스 자체를 사용하고 있습니다!

    나는 내 문제에 대한 또 다른 해결책을 발견 : 나는 (하둡 노드에서 직접 실행) 자동 LoadIncrementalHFiles 메소드를 호출 프로세스 인스턴스를 실행하는 자바 프로그램을 사용하는 대신 내 코드에서 LoadIncrementalHFiles 클래스 자체를 사용하고 있습니다!

    내 솔루션의 코드 여기 :

    TreeSet<String> subDirs = getHFileDirectories(new Path(HDFS_OUTPUT_PATH), conf);        // The HDFS_OUTPUT_PATH directory contains many HFile sub-directories
    
    for(String hFileDir : subDirs) {
        String pathToReadFrom = HDFS_OUTPUT_PATH + "/" + hFileDir;
    
        String[] execCode = {"hbase", "org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles", "-Dcreate.table=no", pathToReadFrom, "mytable"};       // Important: Separate each parameter here!!!
        ProcessBuilder pb = new ProcessBuilder(execCode);
        pb.redirectErrorStream(true);
        final Process p = pb.start();
    
        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();
    
        p.waitFor();
    
        int exitCode = p.exitValue();
        System.out.println(" ==> Exit Code: " + exitCode);
    }
    
    System.out.println("Finished");
    

    누군가가 다른 해결책이있는 경우 (예를 들어, 직접 코드에서 LoadIncrementalHFiles 클래스를 사용하는 방법), 알려주세요. 감사합니다!

  2. from https://stackoverflow.com/questions/46405738/run-loadincrementalhfiles-from-java-client by cc-by-sa and MIT license