1

我有一个简单的 MR 作业,需要根据时间戳在 hdfs 中创建一个目录。我很难找到正确的 api(在 hadoop 2.0.3 中查找状态并在不存在时创建目录)。有人可以提出正确的做法吗?这是现有的代码:

FileSystem fileSystem = FileSystem.get(new Configuration());
Calendar c = Calendar.getInstance();
String basepath = "/dev/group/data/json/";
for ( Record record: records){
    c.setTimeInMillis(record.timestamp );
    Path path = new Path(basepath + c.get(Calendar.YEAR) + "/" + c.get(Calendar.MONTH));
    // Check if the path is valid and create hdfs folder if not
    FileStatus[] status = filesystem.???
    context.write(key, new Text(mapper.writeValueAsString(record)));            
}

谢谢

4

1 回答 1

1

mkdirs如果文件夹创建失败返回 false,如果成功则返回 true。所以只需使用它,然后知道它在返回 false 时没有创建它。

首先检查它是否存在根本没有帮助,因为这是对 NameNode 的额外操作。此外,您必须担心多个工作之间的争用。考虑以下情况:

  1. Mapper 1 检查 dir 是否abc存在——它不存在
  2. Mapper 2 检查 dir 是否abc存在——它不存在
  3. 映射器 1 尝试创建目录abc- 它确实
  4. Mapper 2 尝试创建目录abc——它没有

长话短说,只需使用它,mkdirs因为它是原子的并且没有上述问题,并且还需要较少的 NameNode 工作。

于 2013-10-01T15:09:38.833 回答