当前位置: 首页 > 知识库问答 >
问题:

无法实例化Hadoop hdfs DistributedFileSystem

汪栋
2023-03-14

我已经建立了一个hadoop hdfs集群,由于我是hadoop新手,我一直在尝试按照一个简单的示例从我在本地机器上编写的java驱动程序中读/写hdfs。我尝试测试的示例如下:

public static void main(String[] args) throws IOException {

    args = new String[3];
    args[0] = "add";
    args[1] = "./files/jaildata.csv";
    args[2] = "hdfs://<Namenode-Host>:<Port>/dir1/dir2/";        
    if (args.length < 1) {
        System.out.println("Usage: hdfsclient add/read/delete/mkdir [<local_path> <hdfs_path>]");
        System.exit(1);
    }

    FileSystemOperations client = new FileSystemOperations();
    String hdfsPath = "hdfs://<Namenode-Host>:<Port>";

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

    if (args[0].equals("add")) {
        if (args.length < 3) {
            System.out.println("Usage: hdfsclient add <local_path> <hdfs_path>");
            System.exit(1);
        }
        client.addFile(args[1], args[2], conf);

    } else {
        System.out.println("Usage: hdfsclient add/read/delete/mkdir [<local_path> <hdfs_path>]");
        System.exit(1);
    }
    System.out.println("Done!");
}

其中,addFile功能如下:

public void addFile(String source, String dest, Configuration conf) throws IOException {

    FileSystem fileSystem = FileSystem.get(conf);

    // Get the filename out of the file path
    String filename = source.substring(source.lastIndexOf('/') + 1, source.length());

    // Create the destination path including the filename.
    if (dest.charAt(dest.length() - 1) != '/') {
        dest = dest + "/" + filename;
    } else {
        dest = dest + filename;
    }
    Path path = new Path(dest);
    if (fileSystem.exists(path)) {
        System.out.println("File " + dest + " already exists");
        return;
    }

    // Create a new file and write data to it.
    FSDataOutputStream out = fileSystem.create(path);
    InputStream in = new BufferedInputStream(new FileInputStream(new File(source)));

    byte[] b = new byte[1024];
    int numBytes = 0;
    while ((numBytes = in.read(b)) > 0) {
        out.write(b, 0, numBytes);
    }

    // Close all the file descriptors
    in.close();
    out.close();
    fileSystem.close();
}

该项目是一个maven项目,将hadoop-通用-2.6.5、hadoop-hdfs-2.9.0和hadoop=hdfs-Client 2.9.0添加到依赖项中,并配置为构建包含所有依赖项的jar。

我的问题是,不管我尝试过的不同的演示示例是,我在FileSystemFileSystem=FileSystem.get(conf);创建FileSystem的地方得到以下异常:

Exception in thread "main" java.util.ServiceConfigurationError: org.apache.hadoop.fs.FileSystem: Provider org.apache.hadoop.hdfs.DistributedFileSystem could not be instantiated
at java.util.ServiceLoader.fail(ServiceLoader.java:232)
at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at org.apache.hadoop.fs.FileSystem.loadFileSystems(FileSystem.java:2565)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2576)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2593)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2632)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2614)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:169)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:354)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
Caused by: java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataOutputStreamBuilder

我不知道如何通过,我已经尝试了我在网上看到的几个解决方案中的每一个,所以我将非常感谢关于这个问题的任何建议。。。

谢谢

共有1个答案

申屠英韶
2023-03-14

org.apache.hadoop.fs.FSDataOutputStreamBuilder类不是在一个hadoop-通用-2.6.5中,而是在hadoop-通用-2.9.0中。

正如我所注意到的,您已经在为hdfs客户端使用2.9.0版本。将其他hadoop包与2.9.0保持一致,以避免类似问题。

请参阅hadoop common的2.9.0版本的构建,以解决此问题。

 类似资料:
  • 我试图使用Postgis 2.2和Postgreql 9.5与JPA,Postgis 9.5方言。我已经在pom.xml的要求,按这里http://www.hibernatespatial.org/documentation/documentation/和类型导入正确,但是当我试图运行程序使用几何类型我得到这个错误: 我显然遗漏了一些配置,有人能指出是什么吗?

  • 我在MapFragment的布局文件中出现了这个错误 我试过了 > 安装Google Play服务,但仍有错误 - com.google.android.gms.maps.MapFragment(开放类,显示异常,清除缓存) 提示:在自定义视图中使用view.isinEditMode()跳过代码或在IDE中显示示例数据。 如果这是一个意外错误,您也可以尝试构建项目,然后手动刷新布局。 异常详细信息

  • 我正在将一个Java EE应用程序部署到Bluemix,当第一个请求到达时,我得到了这个错误: 2015-05-20T23:11:58.51+0200[app/0]OUT[INFO]FFDC1015I:已创建FFDC事件:“java.util.ServiceConfigurationError:javax.servlet.ServletContainerInitializer:Provider o

  • 我正在尝试将H2设置为内存数据库。我已将其配置为: 然而,当我尝试运行它时,我会遇到这个错误 我不确定它为什么不接受jdbc url,我的confg格式有什么问题吗?

  • 我想使用我的本地代码通过spark-sql连接到远程配置单元。这是我的代码: 请帮帮我.

  • 我试图在Angular2应用程序中实例化一个对象,以便在我正在开发的组件中使用。 这个代码段在RC5中运行良好。现在我正在尝试升级到Angular2最终版本,并在运行<code>ng serve</code>或<code>ng build</code>时出现此错误, 如何解决此问题?是否有另一种实例化管道的方法?或者Angular是否停止支持组件内部管道的实例化?