복붙노트

[HADOOP] 자바 코드에서 대량로드 데이터를 사용 HBase와의 importtsv 도구

HADOOP

자바 코드에서 대량로드 데이터를 사용 HBase와의 importtsv 도구

나는 아파치 HBase와 함께 제공 importtsv 및 LoadIncrementalHFiles 도구를 사용하여 HBase를 위해 대량로드 csv 파일을하려합니다.

우리는이 페이지에서 자습서를 찾을 수 있습니다 클라우 데라, 아파치

나는 아파치 하둡과 HBase를 사용하고 있습니다.

두 소스는 명령 프롬프트를 통해 이러한 도구를 사용하는 방법에 대해 설명합니다. 그러나 나는 이것이 자바 코드에서 끝내야합니다. 나는 클라우 데라 페이지에 설명 된대로 감소 매핑 사용자 정의 쓸 수 있습니다 알고 있습니다. 그러나 내가 직접 내 자바 코드에서 이러한 도구에 해당하는 클래스를 사용할 수 있는지 알고 싶습니다.

내 자바 코드는 Windows 호스트 컴퓨터에서 실행되는 반면 내 클러스터는 의사 분산 모드에서 VM웨어의 내부 우분투 VM에서 실행되고 있습니다. 동일한 시스템의 실행중인 클러스터에서 명령 프롬프트를 통해 그 일을 할 때, 우리는 명령을 다음 실행 :

$HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/hbase-server-1.2.1.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,d:c1,d:c2 -Dimporttsv.bulk.output=hdfs://192.168.23.128:9000/bulkloadoutputdir datatsv  hdfs://192.168.23.128:9000/bulkloadinputdir/

우리가 HADOOP_CLASSPATH을 설정 이상으로 볼 수 있습니다. 내 경우에는, 난 내 윈도우 머신에 모든 XYZ-site.xml의 하둡 구성 파일을 복사하고 HADOOP_CLASSPATH 환경 변수로 포함하는 디렉토리를 설정해야 할 것 같아요. 그래서 난 내 Windows 시스템에 코어를 site.xml, HBase를-site.xml 파일, HDFS-site.xml 파일을 붙여 복사, Windows 환경 변수 HADOOP_CLASSPATH에 디렉토리를 설정합니다. 이들은 그렇다 나는 또한 프로젝트의 빌드 경로를 이클립스에 필요한 모든 JAR 파일을 추가했습니다.

그러나 프로젝트를 실행 한 후 나는 다음과 같은 오류가 발생했습니다 :

Exception in thread "main" org.apache.hadoop.hbase.client.RetriesExhaustedException: Can't get the locations
    at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.getRegionLocations(RpcRetryingCallerWithReadReplicas.java:319)
    at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:156)
    at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:60)
    at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:200)
    at org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:326)
    at org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:301)
    at org.apache.hadoop.hbase.client.ClientScanner.initializeScannerInConstruction(ClientScanner.java:166)
    at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:161)
    at org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:794)
    at org.apache.hadoop.hbase.MetaTableAccessor.fullScan(MetaTableAccessor.java:602)
    at org.apache.hadoop.hbase.MetaTableAccessor.tableExists(MetaTableAccessor.java:366)
    at org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:403)
    at org.apache.hadoop.hbase.mapreduce.ImportTsv.createSubmittableJob(ImportTsv.java:493)
    at org.apache.hadoop.hbase.mapreduce.ImportTsv.run(ImportTsv.java:737)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
    at org.apache.hadoop.hbase.mapreduce.ImportTsv.main(ImportTsv.java:747)
    at HBaseImportTsvBulkLoader.createStoreFilesFromHdfsFiles(HBaseImportTsvBulkLoader.java:36)
    at HBaseImportTsvBulkLoader.main(HBaseImportTsvBulkLoader.java:17)

그래서 어떻게 든 여전히 클러스터의 위치를 ​​찾을 수 importtsv 없습니다.

이것은 내 기본 코드가 같은 모습입니다 :

1    import java.io.IOException;
2    
3    import org.apache.hadoop.conf.Configuration;
4    import org.apache.hadoop.hbase.mapreduce.ImportTsv;
5    import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles;
6    import org.apache.hadoop.conf.Configuration;
7    import org.apache.hadoop.fs.FileStatus;
8    import org.apache.hadoop.fs.FileSystem;
9    import org.apache.hadoop.fs.Path;
10    
11    public class HBaseImportTsvBulkLoader {
12      static Configuration config;
13        
14        public static void main(String[] args) throws Exception {
15          config = new Configuration();
16              copyFileToHDFS();
17          createStoreFilesFromHdfsFiles();
18          loadStoreFilesToTable();
19      }
20        
21        private static void copyFileToHDFS() throws IOException
22        {
23          config.set("fs.defaultFS","hdfs://192.168.23.128:9000"); //192.168.23.128       
24          FileSystem hdfs = FileSystem.get(config);
25          Path localfsSourceDir = new Path("D:\\delete\\bulkloadinputfile1");
26          Path hdfsTargetDir = new Path (hdfs.getWorkingDirectory() + "/");       
27          hdfs.copyFromLocalFile(localfsSourceDir, hdfsTargetDir);
28        }
29        
30        private static void createStoreFilesFromHdfsFiles() throws Exception
31        {
32          String[] _args = {"-Dimporttsv.bulk.output=hdfs://192.168.23.128:9000/bulkloadoutputdir",
33                  "-Dimporttsv.columns=HBASE_ROW_KEY,d:c1,d:c2",
34                  "datatsv",
35                  "hdfs://192.168.23.128:9000/bulkloadinputdir/"};    
36          ImportTsv.main(_args);                                 //**throws exception**
37          
38        }
39        
40        private static void loadStoreFilesToTable() throws Exception
41        {
42          String[] _args = {"hdfs://192.168.23.128:9000/hbasebulkloadoutputdir","datatsv"};
43          LoadIncrementalHFiles.main(_args);
44        }
45    }
46    

질문

해결법

    from https://stackoverflow.com/questions/37548316/using-hbase-importtsv-tool-to-bulk-load-data-from-java-code by cc-by-sa and MIT license