无法从hadoop hdfs检索文件

无法从hadoop hdfs检索文件,hadoop,file-io,Hadoop,File Io,我正在学习如何从hdfs读取/写入文件 这是我用来阅读的代码: import java.io.InputStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; public clas

我正在学习如何从hdfs读取/写入文件

这是我用来阅读的代码:

import java.io.InputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class FileSystemCat {
public static void main (String [] args) throws Exception {

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

    FileSystem fs = FileSystem.get(URI.create(uri),conf);

    InputStream in = null;
    try{

        in = fs.open(new Path(uri));
        IOUtils.copyBytes(in, System.out, 4096,false);
    }finally{
        IOUtils.closeStream(in);
    }           
}
}

文件在那里

然而,当我在eclipse中运行代码时,我得到了以下信息

Exception in thread "main" java.io.FileNotFoundException: File /user/hadoop/file.txt does not exist
at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:511)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:724)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:501)
at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:397)
at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSInputChecker.<init>(ChecksumFileSystem.java:137)
at org.apache.hadoop.fs.ChecksumFileSystem.open(ChecksumFileSystem.java:339)
at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:764)
at hadoop.FileSystemCat.main(FileSystemCat.java:22)
core-site.xml

hdfs-site.xml

有什么问题吗


谢谢添加带有HDFS配置参数的XML文件:

Configuration conf = new Configuration();
conf.addResource(new Path("your_hadoop_path/conf/core-site.xml"));
conf.addResource(new Path("your_hadoop_path/conf/hdfs-site.xml"));
FileSystem fs = FileSystem.get(URI.create(uri),conf);

添加带有HDFS配置参数的XML文件:

Configuration conf = new Configuration();
conf.addResource(new Path("your_hadoop_path/conf/core-site.xml"));
conf.addResource(new Path("your_hadoop_path/conf/hdfs-site.xml"));
FileSystem fs = FileSystem.get(URI.create(uri),conf);

如果您想从HDFS文件中读取数据,那么这段代码可以做到这一点

package com.yp.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;


public class ReadHadoopFileData {


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

    Configuration conf = new Configuration();
    FileSystem hdfs = FileSystem.get(conf);

    Path hdfsFile = new Path(args[0]);

    try {
        BufferedReader br=new BufferedReader(new InputStreamReader(hdfs.open(hdfsFile)));
        String line;
        line=br.readLine();
        while (line != null){
                System.out.println(line);
                line=br.readLine();
        }

    }catch (IOException ioe) {
        ioe.printStackTrace();
    }   
  }

}
当您使用命令行运行时,hadoop将负责所有环境设置

假设您创建了Read.jar和hdfs文件,那么运行上述程序的命令是part-r-00000

hadoop jar Read.jar com.yp.util.ReadHadoopFileData /MyData/part-r-00000

如果您想从HDFS文件中读取数据,那么这段代码可以做到这一点

package com.yp.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;


public class ReadHadoopFileData {


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

    Configuration conf = new Configuration();
    FileSystem hdfs = FileSystem.get(conf);

    Path hdfsFile = new Path(args[0]);

    try {
        BufferedReader br=new BufferedReader(new InputStreamReader(hdfs.open(hdfsFile)));
        String line;
        line=br.readLine();
        while (line != null){
                System.out.println(line);
                line=br.readLine();
        }

    }catch (IOException ioe) {
        ioe.printStackTrace();
    }   
  }

}
当您使用命令行运行时,hadoop将负责所有环境设置

假设您创建了Read.jar和hdfs文件,那么运行上述程序的命令是part-r-00000

hadoop jar Read.jar com.yp.util.ReadHadoopFileData /MyData/part-r-00000

你应该换线

FileSystem fs = FileSystem.get(URI.create(uri),conf);
像这样的事情

FileSystem fs = FileSystem.get(URI.create("hdfs://localhost"), conf);
如果您的uri路径在hdfs中,那么这应该是可行的


要查看uri路径是否在hdfs中,可以在命令行中执行hadoop fs-ls/

您应该更改该行

FileSystem fs = FileSystem.get(URI.create(uri),conf);
像这样的事情

FileSystem fs = FileSystem.get(URI.create("hdfs://localhost"), conf);
如果您的uri路径在hdfs中,那么这应该是可行的


要查看您的uri路径是否在hdfs中,您可以在命令行中执行hadoop fs-ls/

我用您的提示编辑了这篇文章。它仍然不起作用。请查看hdfs-site.xls和core-site.xml您是如何运行该应用程序的?使用hadoop jar?我在构建路径中添加了hadoop文件夹和子文件夹中包含的所有jar文件。我知道:对不起,我误解了你的问题。我只是从eclipse运行程序。我不会创建jar文件并从命令行运行它。我应该这样做吗?我从未尝试过Eclipse,但是当您使用java-jar而不是hadoop jar运行jar时,您所描述的情况就会发生。试着创建一个jar文件,并用hadoop jar yourjar.jar文件系统运行它。我用你的技巧编辑了这篇文章。它仍然不起作用。请查看hdfs-site.xls和core-site.xml您是如何运行该应用程序的?使用hadoop jar?我在构建路径中添加了hadoop文件夹和子文件夹中包含的所有jar文件。我知道:对不起,我误解了你的问题。我只是从eclipse运行程序。我不会创建jar文件并从命令行运行它。我应该这样做吗?我从未尝试过Eclipse,但是当您使用java-jar而不是hadoop jar运行jar时,您所描述的情况就会发生。尝试创建一个jar文件,并使用hadoop jar yourjar.jar FileSystemCat运行它