在 Hadoop MapReduce 脚本中导入外部库

Posted

技术标签:

【中文标题】在 Hadoop MapReduce 脚本中导入外部库【英文标题】:Import external libraries in an Hadoop MapReduce script 【发布时间】:2011-02-13 15:13:08 【问题描述】:

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

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

提前致谢, 托马斯

【问题讨论】:

【参考方案1】:

在启动 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?

【讨论】:

以上是关于在 Hadoop MapReduce 脚本中导入外部库的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop之MapReduce命令

sqoop 数据迁移

sqoop数据迁移

sqoop数据迁移

使用 cassandra 对 hadoop-2.2.0 运行 piglatin 脚本时出错

MapReduce Streaming