我们有一个应用程序从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
****更新****
执行以下行时,在客户端日志中抛出以下异常:
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]
答案 0 :(得分:0)
这意味着您可以访问namenode(可以创建文件),但不能访问datanode(将数据写入文件所需的数据节点)。
更新防火墙规则,以便您也可以访问数据节点。