【问题标题】:Can't retrieve files from hadoop hdfs无法从 hadoop hdfs 检索文件
【发布时间】:2014-06-30 10:41:13
【问题描述】:

我正在学习如何从/向 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)

我将 file:///user/hadoop/file.txthdfs:///user/hadoop/file.txt 都用作路径>

对于后者,错误略有不同:

Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs

core-site.xml

<configuration>
   <property>
     <name>fs.default.name</name>
     <value>hdfs://localhost/</value>
   </property>
</configuration>

hdfs-site.xml

<configuration>
<property>
   <name>dfs.replication</name>
   <value>2</value>
 </property>

 <property>
   <name>dfs.namenode.name.dir</name>
   <value>file:///usr/local/hadoop_store/hdfs/namenode/</value>
 </property>

 <property>
   <name>dfs.datanode.data.dir</name>
   <value>file:///usr/local/hadoop_store/hdfs/datanode/,file:///mnt/hadoop/hadoop_store/hdfs/datanode/</value>
 </property>

 <property>
   <name>dfs.webhdfs.enabled</name>
   <value>true</value>
 </property>
</configuration>

有什么问题吗?

谢谢

【问题讨论】:

    标签: hadoop file-io


    【解决方案1】:

    你应该换行

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

    对于这样的事情

    FileSystem fs = FileSystem.get(URI.create("hdfs://localhost"), conf);
    

    如果你的 uri 路径在 hdfs 中,那应该可以。

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

    【讨论】:

      【解决方案2】:

      使用 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-site.xls 和 core-site.xml
      • 你是如何运行应用程序的?使用hadoop jar?
      • 我将hadoop文件夹和子文件夹中包含的所有jar文件添加到构建路径中(我知道的不好的做法:))
      • 对不起,我误解了你的问题。我只是从eclipse运行程序。我不创建 jar 文件并从命令行运行它。我应该这样做吗?
      • 我从未尝试过使用 Eclipse,但是当您使用 java -jar 而不是 hadoop jar 运行 jar 时,您所描述的就会发生。尝试创建一个 jar 文件,并使用 hadoop jar yourjar.jar FileSystemCat 运行它
      【解决方案3】:

      如果您想从 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-21
        • 2012-09-27
        • 2023-03-25
        • 2015-09-27
        • 1970-01-01
        相关资源
        最近更新 更多