2011-02-13 55 views
2

我在Amazons EMR Hadoop實現之上運行python MapReduce腳本。由於主要腳本的結果,我獲得了項目項目的相似性。在後續步驟中,我想將此輸出分割爲每個項目的單獨S3存儲區,因此每個項目存儲區都包含與其類似的項目列表。爲了達到這個目的,我想在後續步驟的reduce函數中使用Amazons boto python庫。在Hadoop MapReduce腳本中導入外部庫

  • 如何將外部(python)庫導入到hadoop中,以便它們可以在使用python編寫的reduce步驟中使用?
  • 是否可以在Hadoop環境中以這種方式訪問​​S3?

由於提前, 托馬斯

回答

4

當啓動,您可以指定應提供外部文件Hadoop的過程。這是通過使用-files參數完成的。

$HADOOP_HOME/bin/hadoop jar /usr/lib/COMPANY/analytics/libjars/MyJar.jar -files hdfs://PDHadoop1.corp.COMPANY.com:54310/data/geoip/GeoIPCity.dat

我不知道,如果這些文件必須在HDFS,但如果它是要經常運行的工作,它不會是一個壞主意,把它們放在那裏。
從你可以做一些類似的代碼

if (DistributedCache.getLocalCacheFiles(context.getConfiguration()) != null) { 
    List<Path> localFiles = Utility.arrayToList(DistributedCache.getLocalCacheFiles(context.getConfiguration())); 
    for (Path localFile : localFiles) { 
     if ((localFile.getName() != null) && (localFile.getName().equalsIgnoreCase("GeoIPCity.dat"))) { 
      Path path = new File(localFile.toUri().getPath()); 
     } 
    } 
} 

這一切,但複製和直接從工作中我們映射器的多個代碼粘貼。

我不知道你的問題的第二部分。希望第一部分的答案能讓你開始。 :)

除了-files-libjars包括額外的罐子;我在這裏有一些信息 - If I have a constructor that requires a path to a file, how can I "fake" that if it is packaged into a jar?