使用Java上的DFSClient将文件上载到HDFS

时间:2015-12-15 19:04:37

标签: java hadoop hdfs

我正在尝试使用与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();
    }
}

2 个答案:

答案 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();

此外,在FileSystemFileUtil类的本地和分布式文件系统之间存在许多有用的文件复制方法。

答案 1 :(得分:0)

更改finally块顺序

finally {
    if (out != null) {
        out.close();
    }
    if (in != null) {
        in.close();
    }
    if (client != null) {
        client.close();
    }
}