在Hadoop MapReduce脚本中导入外部库

时间:2011-02-13 15:13:09

标签: python amazon-web-services hadoop mapreduce amazon-emr

我在Amazons EMR Hadoop实现之上运行python MapReduce脚本。作为主脚本的结果,我得到了项目项目的相似性。在后续护理步骤中,我想将此输出拆分为每个项目的单独S3存储桶,因此每个项目存储桶包含与其类似的项目列表。为了达到这个目的,我希望在aftercare步骤的reduce函数中使用Amazons boto python库。

  • 如何将外部(python)库导入hadoop,以便它们可以在用python编写的reduce步骤中使用?
  • 是否可以在Hadoop环境中以这种方式访问​​S3?

提前致谢, 托马斯

1 个答案:

答案 0 :(得分: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());
        }
    }
}

除了我们的多个Mappers中的工作代码之外,这只是复制和粘贴。

我不知道你问题的第二部分。希望第一部分的答案能让你开始。 :)

除了-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?