无法使用url协议处理程序从hdfs获取数据

w6mmgewl  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(311)

我在java中运行以下程序时遇到问题(我是java的初学者),这里的程序使用hdfs sepecific 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.
z3yyvxxp

z3yyvxxp1#

我建议您使用maven这样的构建工具。当您在pom.xml中指定hadoop工件时,它的所有直接和间接依赖项都将被下载。hadoop有很多依赖项,逐个下载所有jar会很费时。
您只需将maven依赖项添加到pom.xml中,所有其他依赖项将自动下载:

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

相关问题