我试图从HDFS读取文件的内容。我的代码在下面 -
package gen;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class ReadFromHDFS {
public static void main(String[] args) throws Exception {
if (args.length < 1) {
System.out.println("Usage: ReadFromHDFS <hdfs-file-path-to-read-from>");
System.out.println("Example: ReadFromHDFS 'hdfs:/localhost:9000/myFirstSelfWriteFile'");
System.exit(-1);
}
try {
Path path = new Path(args[0]);
FileSystem fileSystem = FileSystem.get(new Configuration());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileSystem.open(path)));
String line = bufferedReader.readLine();
while (line != null) {
System.out.println(line);
line = bufferedReader.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
但是,我无法弄清楚如何让这个程序成为我的HDFS目录的路径。我试过了 -
java -cp <hadoop jar:myjar> gen.ReadFromHDFS <path>
在路径中我尝试直接引用目录(我在hadoop fs -ls时看到的内容),目录中的文件,添加hdfs:/ localhost,hdfs:/并且没有一个工作。任何人都可以帮我确切地说我应该如何将文件夹的路径传递给HDFS?例如,当我直接给出路径(没有前缀)时,它表示该文件不存在。
编辑:到目前为止,所有解决方案似乎都不适用于我。我总是得到例外 -
java.io.FileNotFoundExceptoin: File <filename> does not exist.
at org.apache.hadoop.fs.getFileSystem.getFileStatus(RawLocalFileSystem.java:361)
似乎是在尝试在本地找到该文件。
答案 0 :(得分:2)
尝试
FileSystem fileSystem = FileSystem.get(new Configuration());
Path path = new Path(fileSystem.getName() + "/" + args[0]);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileSystem.open(path)));
String line = bufferedReader.readLine();
并将HDFS中的文件路径指定为(没有前缀)
"/myFirstSelfWriteFile"
不包含“hdfs:/ localhost”
答案 1 :(得分:0)
您需要使用包org.apache.hadoop.fs(FileSystem,FSDataInputStream,FSDataOutputStream和Path)中的类。有几篇文章,但我会使用Hadoop Wiki
中的这篇文章答案 2 :(得分:0)
看起来你在路径中缺少一个/,在文件系统之后应该给两个/。尝试指定以下路径
hdfs://localhost:9000/myFirstSelfWriteFile