无法从hadoop hdfs检索文件
我正在学习如何从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
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运行它