AWS EMR从S3导入外部库

Mad*_*lan 7 python amazon-s3 apache-pig amazon-web-services amazon-emr

我使用Amazon EMR设置了一个集群.我在S3上有一个python库(从github克隆,在pip上不可用).

我想提交一个使用udf的猪工作,它使用了S3中的库.

我不想将库添加到系统路径,因为它只会使用一次.

我无法尝试任何有意义的事情,因为我不知道如何处理这个问题,因此我没有任何代码样本或方法到目前为止我已经尝试过.帮助将深表感谢!:)

小智 0

仔细阅读以下给出的材料。

从 Pig 调用用户定义的函数:

Pig 提供了从 Pig 脚本中调用用户定义函数 (UDF) 的能力。您可以执行此操作来实现在 Pig 脚本中使用的自定义处理。当前支持的语言有 Java、Python/Jython 和 JavaScript。(尽管 JavaScript 支持仍处于实验阶段。)

以下部分描述了如何向 Pig 注册您的函数,以便您可以从 Pig shell 或 Pig 脚本中调用它们。有关将 UDF 与 Pig 结合使用的更多信息,请访问http://pig.apache.org/docs/r0.14.0/udf.html

从 Pig 调用 JAR 文件:

您可以使用 Pig 脚本中的 REGISTER 命令将自定义 JAR 文件与 Pig 一起使用。JAR 文件是本地或远程文件系统,例如 Amazon S3。当 Pig 脚本运行时,Amazon EMR 会自动将 JAR 文件下载到主节点,然后将 JAR 文件上传到 Hadoop 分布式缓存。这样,集群中的所有实例都会根据需要自动使用 JAR 文件。

将 JAR 文件与 Pig 一起使用

1.将您的自定义 JAR 文件上传到 Amazon S3。

2.在 Pig 脚本中使用 REGISTER 命令指定自定义 JAR 文件在 Amazon S3 上的存储桶。

REGISTER s3://mybucket/path/mycustomjar.jar;
Run Code Online (Sandbox Code Playgroud)

从 Pig 调用 Python/Jython 脚本

您可以向 Pig 注册 Python 脚本,然后从 Pig shell 或 Pig 脚本中调用这些脚本中的函数。您可以通过使用 register 关键字指定脚本的位置来完成此操作。

由于 Pig 是用 Java 编写的,因此它使用 Jython 脚本引擎来解析 Python 脚本。有关 Jython 的更多信息,请访问http://www.jython.org/

从 Pig 调用 Python/Jython 脚本

1.编写Python脚本并将脚本上传到Amazon S3中的某个位置。这应该是创建 Pig 集群的同一帐户所拥有的存储桶,或者设置了权限以便创建集群的帐户可以访问它。在此示例中,脚本上传到

s3://mybucket/pig/python.
Run Code Online (Sandbox Code Playgroud)

2.启动一个猪集群。如果您要从 Grunt shell 访问 Pig,请运行交互式集群。如果您从脚本运行 Pig 命令,请启动脚本化 Pig 集群。在此示例中,我们将启动一个交互式集群。

3.因为我们已经启动了一个交互式集群,所以我们现在将通过 SSH 连接到可以运行 Grunt shell 的主节点。有关如何通过 SSH 连接到主节点的更多信息,请参阅通过 SSH 连接到主节点。

4.通过在命令行中键入pig 来运行Pig 的Grunt shell。

pig
Run Code Online (Sandbox Code Playgroud)

5. 在 Grunt 命令提示符处使用 register 关键字向 Pig 注册 Jython 库和 Python 脚本,如下所示,您将在其中指定脚本在 Amazon S3 中的位置。

grunt> register 'lib/jython.jar';
grunt> register 's3://mybucket/pig/python/myscript.py' using jython as myfunctions;
Run Code Online (Sandbox Code Playgroud)

6.加载输入数据。以下示例从 Amazon S3 位置加载输入。

grunt> input = load 's3://mybucket/input/data.txt' using TextLoader as (line:chararray);
Run Code Online (Sandbox Code Playgroud)

7. 现在,您可以通过使用 myfunctions 引用它们来从 Pig 中调用脚本中的函数。

grunt> output=foreach input generate myfunctions.myfunction($1);
Run Code Online (Sandbox Code Playgroud)