我有一个简单的mr作业,需要根据时间戳在hdfs中创建一个目录。我很难找到正确的api(在Hadoop2.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)));
}
谢谢
1条答案
按热度按时间qxgroojn1#
mkdirs
如果文件夹创建失败,则返回false;如果成功,则返回true。所以只要使用它,然后知道当它返回false时并没有创建它。首先检查它是否存在并没有真正的帮助,因为这是namenode的额外操作。此外,你还必须担心多个工作之间的竞争。考虑以下情况:
Map器1检查dir
存在——不存在 Map器2检查是否
存在——不存在Map器1尝试创建目录
--是的 Map器2尝试创建目录
--它没有长话短说,就用
mkdirs
因为它是原子的,不存在上述问题,而且需要namenode做的工作更少。