hadoop - 从 Windows 使用 Java 访问 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.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 的“源”下载中的 jar(之前,我下载了一个旧版本的 Hadoop,虽然 URL 似乎可以正常解析,但存在版本不匹配)

最佳答案

您应该使用 hadoop FileSystem 类。 IOUtils 与 hadoop 无关,你所做的是行不通的。

看看这个方法Path.getFileSystem

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

关于hadoop - 从 Windows 使用 Java 访问 HDFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11908925/

相关文章:

hadoop - 如何用Spark尾部HDFS文件?

hadoop - Bluemix 上的 Analytics for Hadoop 服务不会在 Firefox 浏览器中启动

hadoop - 名称节点支持多少并发读写?

hadoop - Hbase错误 "ERROR: KeeperErrorCode = NoNode for/hbase/master"

nosql - NoSQL 上的文件 I/O - 特别是 HBase - 是否推荐?或不?

hadoop - 在 docker 容器中运行 HDFS 伪模式

sql - 在HIVE SQL中替换NULL或空值的函数

hadoop - 配置单元意外的DataOperationType:UNSET

hadoop - 根据提交查询的用户为 Presto 实现配置单元 sql 标准安全性

hadoop - HDFS文件中的分隔符与Hive表的分隔符值不匹配