【问题标题】:java exception: No FileSystem for schemejava异常:没有用于方案的文件系统
【发布时间】:2015-11-11 21:46:07
【问题描述】:

下面的代码将数据从我的本地机器复制到 hdfs

Configuration conf = new Configuration();                   
conf.addResource(new Path("/etc/hadoop/conf/core-site.xml"));
conf.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml"));

FileSystem fs = FileSystem.get(conf);

fs.moveFromLocalFile(new Path("/path/to/file"), new Path("/path/to/hdfs/"));

当我在 Eclipse 中运行它时,它运行良好。但是,在我编译为 jar 并使用此代码独立运行后:

nohup java -cp "Test.jar" Test &

我收到以下错误:

Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2584)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2630)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2612)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:169)
at Test.main(Test.java:37)

【问题讨论】:

    标签: java hadoop jar


    【解决方案1】:

    鉴于 Test.jar 是一个胖 JAR(包括依赖项),协议处理程序的注册出现问题。

    如果您知道 Hadoop 中提供它的包,要覆盖它,请执行以下操作(这是随机的,很可能是错误的,猜测):

    nohup java -cp Test.jar -Djava.protocol.handler.pkgs=org.apache.hadoop.fs Test &
    

    如果 org.apache.hadoop.fs.Handler 存在并扩展 java.net.URLStreamHandler,这将起作用。

    这个机制在the JavaDocs for java.net.URL中有更详细的描述。

    alternative fix 记录在 HortonWorks 论坛上。

    【讨论】:

    • 我想我做到了。但我仍然遇到同样的问题。我正在使用cloudera ..这就是我所做的:export CLASSPATH=/usr/lib/hadoop/client/*:/usr/lib/hadoop/lib/*:/usr/lib/hadoop-hdfs/lib/*
    • @FreeMan 再看看。您只包含了 Test.jar (-cp Test.jar)。您需要在该命令行中包含由 : 分隔的其他 JAR,因为您似乎在 *nix 操作系统(如 Ubuntu、Mac OS X、FreeBSD、SmartOS)上。
    • 实际上,Test.jar 包含了我在 eclipse 中运行它时使用的所有 jar 文件。我将我的 java 程序导出为可运行的 JAR 文件。
    • 好吧,这很奇怪。它可能不包含注册 FS 方案所需的 META-INF 内容。我记得当一位同事为支持 SFTP 而做这件事时,这很繁琐。
    • @FreeMan 我认为我的解决方法可能有效,尽管需要它似乎非常错误。它确实表明当 Test.jar 的 META-INF 从所有依赖项合并时被破坏了。
    【解决方案2】:

    这是一个类路径问题。添加类路径的常用方法如下:

    export CLASSPATH=/usr/lib/hadoop/client-0.20/\*
    

    不幸的是,这对我不起作用。这是有效的。我必须将包含我所有 jar 文件的路径添加到 nohup java 命令中..

    nohup java -cp "/usr/lib/hadoop/client-0.20/*:Test.jar" Test & 
    

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 1970-01-01
      • 2021-05-25
      • 2018-02-11
      • 1970-01-01
      • 2021-12-12
      • 2021-11-15
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多