在Hadoop MapReduce脚本中导入外部库
我正在亚马逊的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,我该如何“伪造”这个路径?