从Windows访问带有Java的HDFS

时间:2012-08-10 20:38:59

标签: hadoop hdfs

我安装了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的'source'下载的jar(之前我已经下载了旧版本的Hadoop,虽然URL似乎解析得很好,但版本不匹配)

2 个答案:

答案 0 :(得分:0)

您应该使用hadoop FileSystem类。 IOUtils与hadoop无关,你正在做的事情无法发挥作用。

看看这个方法Path.getFileSystem

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

答案 1 :(得分:0)

    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类进行读/写操作。