在Hadoop MapReduce脚本中导入外部库

2 投票
1 回答
1786 浏览
提问于 2025-04-16 11:44

我正在亚马逊的EMR Hadoop平台上运行一个Python的MapReduce脚本。这个脚本的主要功能是计算物品之间的相似度。接下来,我想把这些结果分开存储到不同的S3桶里,每个桶里放一个物品和与它相似的物品列表。为此,我想在后续步骤的reduce函数中使用亚马逊的boto Python库。

  • 我该如何在Hadoop中导入外部的Python库,以便在用Python编写的reduce步骤中使用它们呢?
  • 在Hadoop环境中,是否可以以这种方式访问S3?

提前谢谢你, 托马斯

1 个回答

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());
        }
    }
}

这些内容几乎是直接从我们多个Mapper中的工作代码复制过来的。

至于你问题的第二部分,我就不太清楚了。希望第一部分的答案能帮到你。:)

除了 -files,还有 -libjars 用于包含额外的jar文件;我这里有一点相关信息 - 如果我有一个构造函数需要一个文件路径,如果它被打包成一个jar,我该如何“伪造”这个路径?

撰写回答