我有一个 Cloudera Hadoop 安装,我想编写一个 Java 程序来从 Windows 机器上的文件系统读/写。这应该可能吗?
我的程序很简单:
public class HadoopReader {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) throws Exception {
System.out.println("okay");
InputStream in = null;
try {
in = new URL("hdfs://HOST/PATH").openStream();
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
}
}
但我收到此错误:
Exception in thread "main" java.lang.StackOverflowError
at java.net.URLStreamHandler.parseURL(Unknown Source)
at sun.net.www.protocol.file.Handler.parseURL(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at sun.misc.URLClassPath$FileLoader.getResource(Unknown Source)
at sun.misc.URLClassPath$FileLoader.findResource(Unknown Source)
at sun.misc.URLClassPath$1.next(Unknown Source)
at sun.misc.URLClassPath$1.hasMoreElements(Unknown Source)
at java.net.URLClassLoader$3$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader$3.next(Unknown Source)
at java.net.URLClassLoader$3.hasMoreElements(Unknown Source)
at sun.misc.CompoundEnumeration.next(Unknown Source)
at sun.misc.CompoundEnumeration.hasMoreElements(Unknown Source)
at java.util.ServiceLoader$LazyIterator.hasNext(Unknown Source)
at java.util.ServiceLoader$1.hasNext(Unknown Source)
at org.apache.hadoop.fs.FileSystem.loadFileSystems(FileSystem.java:2117)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2128)
at org.apache.hadoop.fs.FsUrlStreamHandlerFactory.createURLStreamHandler(FsUrlStreamHandlerFactory.java:66)
...
我正在使用 Cloudera 4 的“源”下载中的 jars(以前,我下载了旧版本的 Hadoop,虽然 URL 似乎解析得很好,但版本不匹配)