2013-10-01 77 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