我正在尝试使用与Hadoop捆绑在一起的DFSClient上传/写入文件到我的HDFS但是我没有成功,下面的代码实际上在HDFS中创建了文件,但它是空的(大小为0),文件和看到它的内容我可以确认它是空的。
如何调试此行为?我已经确认我的本地文件“dilox.txt”包含文本,并且我的缓冲区的循环会迭代,我的理论是client.create()创建的输出缓冲区不会向HDFS发回任何内容。 / p>
请注意,我不是在Hadoop工作中运行,而是在外部运行。
相关代码:
String hdfsUrl = "hdfs://1.2.3.4:8020/user/hadoop";
Configuration conf = new Configuration();
conf.set("fs.defaultFS", hdfsUrl);
DFSClient client = new DFSClient(new URI(hdfsUrl), conf);
OutputStream out = null;
InputStream in = null;
try {
out = new BufferedOutputStream(client.create(destinationFilename, true));
in = new BufferedInputStream(new FileInputStream("dilox.txt"));
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
System.out.println(buffer.toString());
out.write(buffer, 0, len);
}
} finally {
if (client != null) {
client.close();
}
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
答案 0 :(得分:1)
无法说明使用DFSClient复制文件,但您可以使用FileSystem的方法:
copyFromLocalFile(Path src, Path dst)
- 从本地文件复制文件
系统到HDFS moveFromLocalFile(Path src, Path dst)
- 移动文件
本地文件系统到HDFS 例如:
FileSystem fs = FileSystem.get(conf);
fs.copyFromLocalFile(new Path("/home/user/test.txt"), new Path("/hadoop/test.txt"));
您还可以通过输出流写入文件:
FSDataOutputStream outStream = fs.create(new Path("/hadoop/test.txt"));
outStream.write(buffer);
outStream.close();
此外,在FileSystem和FileUtil类的本地和分布式文件系统之间存在许多有用的文件复制方法。
答案 1 :(得分:0)
更改finally块顺序
finally {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
if (client != null) {
client.close();
}
}