Hadoop 从Windows使用java访问HDFS

Hadoop 从Windows使用java访问HDFS,hadoop,hdfs,Hadoop,Hdfs,我安装了Cloudera Hadoop,我想编写一个Java程序,从Windows机器上的文件系统读/写。这可能吗 我的程序非常简单: public class HadoopReader { static { URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); } public static void main(String[] args) throws Exception { System.out.

我安装了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)
...
线程“main”java.lang.StackOverflower中出现异常 位于java.net.URLStreamHandler.parseURL(未知源) 位于sun.net.www.protocol.file.Handler.parseURL(未知源) 位于java.net.URL。(未知源) 位于java.net.URL。(未知源) 位于sun.misc.URLClassPath$FileLoader.getResource(未知源) 位于sun.misc.URLClassPath$FileLoader.findResource(未知源) 位于sun.misc.URLClassPath$1.next(未知源) 位于sun.misc.URLClassPath$1.hasMoreElements(未知源) 位于java.net.URLClassLoader$3$1.run(未知源) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.net.URLClassLoader$3.next(未知来源) 位于java.net.URLClassLoader$3.hasMoreElements(未知源) 在sun.misc.CompoundEnumeration.next(未知来源)上 位于sun.misc.CompoundEnumeration.hasMoreElements(未知源) 位于java.util.ServiceLoader$LazyIterator.hasNext(未知源) 位于java.util.ServiceLoader$1.hasNext(未知源) 位于org.apache.hadoop.fs.FileSystem.loadFileSystems(FileSystem.java:2117) 位于org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2128) 位于org.apache.hadoop.fs.FsUrlStreamHandlerFactory.createURLStreamHandler(FsUrlStreamHandlerFactory.java:66) ...
我正在使用Cloudera 4的“源”下载中的JAR(以前,我下载了一个旧版本的Hadoop,虽然URL似乎解析得很好,但有一个版本不匹配)

您应该使用Hadoop文件系统类。IOUtils与hadoop无关,您正在做的事情无法工作

看看这个方法

将hadoop core-site.xml与要连接的hdfs文件系统url一起使用。理想情况下,从hdfs本身的Namenode获取此xml的副本。将它放在类路径中,就可以使用所有hdfs客户端API了。

试试看

    Configuration conf = new Configuration();
    confVirtual.set("fs.default.name", "hdfs://ip:port");
    confVirtual.set("mapred.job.tracker", "hdfs://ip:port");
    FileSystem fs = FileSystem.get(conf);

以这种方式访问HDFS群集后,您可以通过FSDataOutputStream/FSDataInputStream类执行读/写操作。

我尝试了”hdfs://HOSTNAME/test.txt"... 其中HOSTNAME是此命令中主节点的名称:hadoop fs-test-ehdfs://HOSTNAME/test.txt 如果我这样做了,请告诉我们其中一个实际节点的输出:“hadoop fs-ls/”我得到:“-rw-r--r--3根超级组2093 2012-08-10 11:21/WordCount.java”(和其他)和“hadoop fs-ls-test-e/WordCount.java”完全不返回输出为什么不使用简单的
文件系统
类?