[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
'HADOOP' 카테고리의 다른 글
[HADOOP] 사용자의 sudoers 파일에 있어야 Hadoop을해야 하는가? (0) | 2019.10.20 |
---|---|
[HADOOP] 심지어 응용 프로그램 마스터 후 살해 가져 오지 원사 응용 프로그램을 종료 (0) | 2019.10.20 |
[HADOOP] HDFS의 DFS -ls 명령의 결과 (0) | 2019.10.20 |
[HADOOP] Gradle을 함께 간단한 맵리 듀스 프로젝트를 건물 : 하둡 종속성이 매퍼 및 감속기가 없습니다 (0) | 2019.10.20 |
[HADOOP] 아파치 돼지 - 같은 관계 이상 중첩 FOREACH (0) | 2019.10.20 |