[HADOOP] 윈도우에서 원격 HDFS에 연결할 수 없습니다
HADOOP윈도우에서 원격 HDFS에 연결할 수 없습니다
나는 원격 HDFS 인스턴스와 연결을 시도하고있다
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://hostName:8020");
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = FileSystem.get(conf);
RemoteIterator<LocatedFileStatus> ri = fs.listFiles(fs.getHomeDirectory(), false);
while (ri.hasNext()) {
LocatedFileStatus lfs = ri.next();
//log.debug(lfs.getPath().toString());
}
fs.close();
여기 내 메이븐 의존성은
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-examples</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.1</version>
</dependency>
여기에 내 원격 노드에서 하둡 버전 명령의 결과입니다
hadoop version
Hadoop 2.7.1.2.3.0.0-2557
하지만 난 얻을
Exception in thread "main" java.lang.UnsupportedOperationException: Not implemented by the DistributedFileSystem FileSystem implementation
at org.apache.hadoop.fs.FileSystem.getScheme(FileSystem.java:217)
at org.apache.hadoop.fs.FileSystem.loadFileSystems(FileSystem.java:2624)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2634)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2651)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:92)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2687)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2669)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:371)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:170)
at filecheck.HdfsTest.main(HdfsTest.java:21)
이것은 오류를 발생시키는 행은
FileSystem fs = FileSystem.get(conf);
어떤 생각이 왜이 일이있을 수 있는가?
Manjunath의 답변을 시도하는 후
여기에 내가 무엇을 얻을
ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:356)
at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:371)
at org.apache.hadoop.util.Shell.<clinit>(Shell.java:364)
at org.apache.hadoop.util.StringUtils.<clinit>(StringUtils.java:80)
at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:2807)
at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:2802)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2668)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:371)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:170)
at filecheck.HdfsTest.main(HdfsTest.java:27)
15/11/16 09:48:23 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Exception in thread "main" java.lang.IllegalArgumentException: Pathname from hdfs://hostName:8020 is not a valid DFS filename.
at org.apache.hadoop.hdfs.DistributedFileSystem.getPathName(DistributedFileSystem.java:197)
at org.apache.hadoop.hdfs.DistributedFileSystem.access$000(DistributedFileSystem.java:106)
at org.apache.hadoop.hdfs.DistributedFileSystem$DirListingIterator.<init>(DistributedFileSystem.java:940)
at org.apache.hadoop.hdfs.DistributedFileSystem$DirListingIterator.<init>(DistributedFileSystem.java:927)
at org.apache.hadoop.hdfs.DistributedFileSystem$19.doCall(DistributedFileSystem.java:872)
at org.apache.hadoop.hdfs.DistributedFileSystem$19.doCall(DistributedFileSystem.java:868)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at org.apache.hadoop.hdfs.DistributedFileSystem.listLocatedStatus(DistributedFileSystem.java:886)
at org.apache.hadoop.fs.FileSystem.listLocatedStatus(FileSystem.java:1694)
at org.apache.hadoop.fs.FileSystem$6.<init>(FileSystem.java:1787)
at org.apache.hadoop.fs.FileSystem.listFiles(FileSystem.java:1783)
at filecheck.HdfsTest.main(HdfsTest.java:29)
해결법
-
==============================
1.내 HDFS 클라이언트 코드 코드는 하둡 HDFS를 사용이 필요합니다
내 HDFS 클라이언트 코드 코드는 하둡 HDFS를 사용이 필요합니다
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.1</version> </dependency>
그리고 나는 호튼 웍스 저장소를 사용합니다 :
<repository> <id>repo.hortonworks.com</id> <name>Hortonworks HDP Maven Repository</name> <url>http://repo.hortonworks.com/content/repositories/releases/</url> </repository>
난 당신이 파일 시스템의 잘못된 버전을 따기 것 같아요.
-
==============================
2.예외가 발생 FileSystem.java된다 getScheme에서 () 메소드는 UnsupportedOperationException 단순히 예외가 발생한다.
예외가 발생 FileSystem.java된다 getScheme에서 () 메소드는 UnsupportedOperationException 단순히 예외가 발생한다.
public String getScheme() { throw new UnsupportedOperationException("Not implemented by the " + getClass().getSimpleName() + " FileSystem implementation"); }
대신 DistributedFileSystem 클래스에서 호출 getScheme () 메소드로, 파일 시스템 클래스의 getScheme () 메서드를 호출한다.
DistributedFileSystem 클래스 반환의 getScheme () 메소드 :
@Override public String getScheme() { return HdfsConstants.HDFS_URI_SCHEME; }
아래 그림과 같이 그래서이 문제를 극복하기 위해, 당신은 "FileSystem.get (conf의)"문을의을 변경해야합니다 :
DistributedFileSystem fs = (DistributedFileSystem) FileSystem.get(conf);
편집하다:
나는 프로그램을 시도하고 나를 위해 완벽하게 정상적으로 작동했다. 사실, 그것은으로 캐스팅없이 작동합니다. 다음은 (유일한 차이점은 내가 재귀 목록을 설정하고, "true"로이다) 내 코드입니다 :
package com.hadooptests; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.apache.hadoop.hdfs.DistributedFileSystem; import java.io.IOException; public class HDFSConnect { public static void main(String[] args) { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://machine:8020"); conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem"); DistributedFileSystem fs = null; try { fs = (DistributedFileSystem) FileSystem.get(conf); RemoteIterator<LocatedFileStatus> ri; ri = fs.listFiles(new Path("hdfs://machine:8020/"), true); while (ri.hasNext()) { LocatedFileStatus lfs = ri.next(); System.out.println(lfs.getPath().toString()); } fs.close(); } catch (IOException e) { e.printStackTrace(); } } }
내 받는다는 :
<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-core</artifactId> <version>1.2.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> <configuration> <archive> <manifest> <mainClass>com.hadooptests.HDFSConnect </mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
나는 프로그램으로 실행 :
java -cp "%CLASSPATH%;hadooptests-1.0-SNAPSHOT.jar" com.hadooptests.HDFSConnect
CLASSPATH로 설정되는 경우 : .; % HADOOP_HOME % \ 등 \ 하둡 \; % HADOOP_HOME의 %의 \ 공유 \ 하둡 \ 공통 \ *; % HADOOP_HOME %의 \ 공유 \ 하둡 \ 공통 \ LIB \ *; % HADOOP_HOME %의 \ 공유 \ 하둡 \ HDFS \ *; % HADOOP_HOME %의 \ 공유 \ 하둡 \ HDFS \ LIB \ *; % HADOOP_HOME %의 \ 공유 \의 하둡 \ 맵리 듀스 \ *; % HADOOP_HOME의 %의 \ 공유 \ 하둡 \ 맵리 듀스 \ lib 디렉토리 \ *; % HADOOP_HOME %의 \ 공유 \ 하둡 \ 도구 \ * ; % HADOOP_HOME %의 \ 공유 \ 하둡 \ 도구 \ LIB \ *; % HADOOP_HOME %의 \ 공유 \의 하둡 \ 원사 \ *; % HADOOP_HOME %의 \ 공유 \의 하둡 \ 원사 \ lib 디렉토리 \ *
출력의 일부, 내가 가지고 :
hdfs://machine:8020/app-logs/machine/logs/application_1439815019232_0001/machine.corp.com_45454 hdfs://machine:8020/app-logs/machine/logs/application_1439815019232_0002/machine.corp.com_45454 hdfs://machine:8020/app-logs/machine/logs/application_1439817471006_0002/machine.corp.com_45454 hdfs://machine:8020/app-logs/machine/logs/application_1439817471006_0003/machine.corp.com_45454
편집 2 :
내 환경 :
하둡은 Windows에서 2.7.1.
나는 하둡 2.7.1 배포 HDP 2.3.0을 설치
from https://stackoverflow.com/questions/33681940/cannot-connect-to-remote-hdfs-from-windows by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 어떻게 사용자 정의 Oozie EL 기능을 사용 HDFS 파일을 읽어 (0) | 2019.09.27 |
---|---|
[HADOOP] 클라우 데라 매니저에 dfs_hosts_allow (0) | 2019.09.27 |
[HADOOP] 이 버킷의 일부는 부분 데이터를 포함 할 수 있습니다 - 키바 문제를 (0) | 2019.09.27 |
[HADOOP] Ambari 서버 설정 : OSError : [errno를 2] 해당 파일하거나 디렉토리 (0) | 2019.09.27 |
[HADOOP] 하둡은 의사 모드에서 작동하지 않습니다 최대 동시 맵리 듀스 작업을 설정 (0) | 2019.09.27 |