我有一个简单的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)));
}
THX
答案 0 :(得分:1)
mkdirs
返回false,如果成功则返回true。所以只需使用它,然后知道它在返回false时没有创建它。
检查它是否存在并不是真正有用,因为这是对NameNode的额外操作。此外,您必须担心多个作业的争用。请考虑以下情况:
abc
是否存在 - 它不是abc
是否存在 - 它不是abc
- 它确实abc
- 它不是长话短说,只需使用mkdirs
因为它是原子的并且没有上述问题,并且还需要较少的NameNode工作。