【问题标题】:Not able to fetch data from HDFS using URL protocol handler无法使用 URL 协议处理程序从 HDFS 获取数据
【发布时间】:2013-11-13 18:25:13
【问题描述】:

我在 java 中运行以下程序时遇到问题(我是 java 初学者)。这里程序使用 HDFS 特定的 URLstreamhandlerfactory 使用适当的协议处理程序来访问 HDFS。在 eclipse 中,它没有显示任何错误。我已将 hadoop-common-2.2.0.jar 放入构建路径。

package org.hdfs.prog;

//cc URLCat Displays files from a Hadoop filesystem on standard output using a //URLStreamHandler



import java.io.InputStream;

import java.net.URL;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;


public class URLCat {

    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }

    public static void main(String[] args) throws Exception {
        InputStream in = null;
        try {
            in = new URL(args[0]).openStream();
            IOUtils.copyBytes(in, System.out, 4096, false);
        } finally {
            IOUtils.closeStream(in);
        }
    }
}

但是当我运行它时,我得到了 class not found 错误,如下所示。

这清楚地表明它在运行时没有找到一个类“org.apache.commons.logging.LogFactory”。为了克服这个问题,我下载了包含“org.apache.commons.logging”包的 jar 文件。然后我再次运行代码另一个类未找到错误。

是否有任何解决方案可以提前告诉我我需要哪些运行时依赖 jar 文件?请帮帮我。

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at org.apache.hadoop.conf.Configuration.<clinit>(Configuration.java:165)
    at org.apache.hadoop.fs.FsUrlStreamHandlerFactory.<init>(FsUrlStreamHandlerFactory.java:54)
    at org.hdfs.prog.URLCat.<clinit>(URLCat.java:14)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    ... 3 more
Could not find the main class: org.hdfs.prog.URLCat. Program will exit.

【问题讨论】:

    标签: java eclipse apache maven hadoop


    【解决方案1】:

    我建议你使用像 Maven 这样的构建工具。当您在 pom.xml 中指定 hadoop 工件时,将下载其所有直接和间接依赖项。 Hadoop 有很多依赖项,一个一个下载所有的 jar 会很耗时。

    您只需在 pom.xml 中添加 maven 依赖项,所有其他依赖项将自动下载:

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-core</artifactId>
        <version>0.20.2</version>
    </dependency>
    

    【讨论】:

    • 嗨 Andrershov,是不是 maven 会自动获取所有依赖 jar 文件来构建我的代码?我是否需要手动提供所有 jar 文件名,或者它会自行检测所有 jar 文件(就像我不知道构建代码​​所需的所有 JAR 文件一样)。
    • 嗨 Andershov,谢谢你给我 articaft 的位置,但是我正在为 hadoop-2.2.0 构建我的应用程序,因此在使用你给定的依赖构建之后,当我尝试运行它时给了我错误说第 4 版客户端正在尝试连接到第 9 版服务器 API。因此,我将依赖关系更改为如下org.apache.hadoophadoop-common2.2.0构建时出错,请告诉我为 hadoop-2.2.0 构建此程序是否正确
    猜你喜欢
    • 2016-11-26
    • 2017-03-24
    • 2011-01-15
    • 2013-04-28
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2012-02-23
    • 2011-09-10
    相关资源
    最近更新 更多