写完后Hadoop文件为空

时间:2017-10-24 01:58:09

标签: java hadoop hdfs

我们有一个应用程序从MongoDB检索数据并写入Hadoop集群。 数据是转换为JSON并使用以下逻辑写入Hadoop的字符串列表 ˚

Configuration conf = new Configuration();
conf.addResource(new Path("/etc/hadoop/conf/core-site.xml"));
conf.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml"));
conf.set("fs.defaultFS", HadoopConstants.HDFS_HOST + HadoopConstants.HDFS_DEFAULT_FS);

FSDataOutputStream out = null;
FileSystem fileSystem = null;
//Create Hadoop FS Path and Directory Structure
if (!fileSystem.exists(new Path(dir))) {
    // Create new Directory
    fileSystem.mkdirs(new Path(dir), FsPermission.getDefault());
    out = fileSystem.create(new Path(filepath));
} else if (fileSystem.exists(new Path(dir))) {
    if (!fileSystem.exists(new Path(filepath))) {
        out = fileSystem.create(new Path(filepath));
    } else if (fileSystem.exists(new Path(filepath))) {
        //should not reach here .
        fileSystem.delete(new Path(filepath), true);
        out = fileSystem.create(new Path(filepath));
    }

}

for (Iterator < String > it = list.iterator(); it.hasNext();) {
    String node = it.next();
    out.writeBytes(node.toString());
    out.writeBytes("\n");
}
LOGGER.debug("Write to HDFS successful");
out.close();

该应用程序适用于QA和登台环境。

在生产环境中,为了连接它而有一个额外的防火墙(此防火墙现在已经打开,以便为写入授予访问权限),可以看到以下错误。

正在创建文件,但最终的Hadoop文件为空。即。大小为0字节。

正在编写的文件上的Hadoop fs -du和Hadoop fsck命令附加在屏幕截图中。写入期间复制后的大小增加到384M,但随后再次变为0。

  • 这是因为上面代码中的out.close()没有被调用吗? 这并不能解释QA数据是否正确写入。

  • 这可能是防火墙问题吗? 正在正确创建文件。因此似乎不是连接问题。除非在创建文件之后,正在写入打开的数据并且没有正确刷新以便保存它。

    以下是写入期间的文件规范

$ hadoop fs -du -h file.json 0 384M ......

上面复制参数后的大小增加到384M,并在一段时间后变为0。这是否意味着数据已到达但未正确刷新到磁盘?

$ hadoop fsck

  • 我可以通过哪些方法验证是否正在从Hadoop端获取数据?

****更新****

  • 执行以下行时,在客户端日志中抛出以下异常:

    out.close();

    HDFSWriter :: Write Failed ::无法获取块位置。源文件“part-m-2017102304-0000.json” - 正在中止......

  • Hadoop httpfs.out日志包含以下内容:

    hadoop-httpfs ... INFO httpfsaudit:[/ part-m-2017102304-0000.json] offset [0] len [204800]

1 个答案:

答案 0 :(得分:0)

这意味着您可以访问namenode(可以创建文件),但不能访问datanode(将数据写入文件所需的数据节点)。

更新防火墙规则,以便您也可以访问数据节点。