我有一个简单的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)));
}
感谢
如果文件夹创建失败,则mkdirs
返回 false,如果成功,则返回 true。因此,只需使用它,然后知道它在返回 false 时没有创建它。
首先检查它是否存在根本没有帮助,因为这是对 NameNode 的额外操作。 此外,还必须担心多个作业之间的争用。请考虑以下情况:
- 映射器 1 检查目录
abc
是否存在 - 它不存在 - 映射器 2 检查目录
abc
是否存在 - 它不存在 - 映射器 1 尝试创建目录
abc
- 它确实 - 映射器 2 尝试创建目录
abc
- 它没有
长话短说,只需使用mkdirs
,因为它是原子的并且没有上述问题,并且需要NameNode的工作更少。