[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.나는 내 문제에 대한 또 다른 해결책을 발견 : 나는 (하둡 노드에서 직접 실행) 자동 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 클래스를 사용하는 방법), 알려주세요. 감사합니다!
from https://stackoverflow.com/questions/46405738/run-loadincrementalhfiles-from-java-client by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 자바 1.8과 로컬 Mac에서 하둡을 실행 (0) | 2019.10.01 |
---|---|
[HADOOP] 하둡은 파이썬 스트리밍 : 행 번호를 추적 유지 (0) | 2019.10.01 |
[HADOOP] 하이브 테이블 Sqoop을 수출에 문제는 타임 스탬프에 의해 분할 (0) | 2019.10.01 |
[HADOOP] HIVE LLAP는 복잡한 유형 작동하지 않습니다 (0) | 2019.10.01 |
[HADOOP] 파일 당 카운트와 단어 수 예 (0) | 2019.10.01 |