2013-10-01 76 views
1

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

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

回答

1

mkdirs返回false如果该文件夹创建失败,真如果成功。所以只需使用它,然后知道它在返回false时不会创建它。

检查它是否首先存在并不真正有帮助,因为这是对NameNode的额外操作。此外,你必须担心跨多个工作的争论。考虑以下情况:

  1. 映射1个检查是否DIR abc存在 - 它不
  2. 映射2个检查是否DIR abc存在 - 它不
  3. 映射1次尝试创建目录abc - 它
  4. 映射2尝试创建目录abc - 但这并没有

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

+0

太棒了,我正在尝试它。谢谢 – Kiran