python - AWS EMR 从 S3 导入外部库

标签 python amazon-web-services amazon-s3 apache-pig amazon-emr

我已经使用 Amazon EMR 设置了一个集群。 我在 S3 上有一个 python 库(从 gi​​thub 克隆,在 pip 上不可用)。

我想提交一个使用 udf 的 pig 作品,它利用了 S3 中存在的库。

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

我无法尝试任何有意义的事情,因为我不知道如何解决这个问题,因此到目前为止我没有尝试过任何代码示例或方法。帮助将不胜感激! :)

最佳答案

仔细阅读以下给定的 Material 。

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

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

以下部分介绍了如何使用 Pig 注册您的函数,以便您可以从 Pig shell 或 Pig 脚本中调用它们。有关在 Pig 中使用 UDF 的更多信息,请转至 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 文件。

在 Pig 中使用 JAR 文件

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

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

REGISTER s3://mybucket/path/mycustomjar.jar;

从 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.

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

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

4.在命令行输入 pig 运行 Pig 的 Grunt shell。

pig

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;

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

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

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

grunt> output=foreach input generate myfunctions.myfunction($1);

关于python - AWS EMR 从 S3 导入外部库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38810402/

相关文章:

sql - Redshift Copy 创建与分析不同的压缩编码

python - 编写集成高斯函数的 Python 函数的最佳方法?

amazon-web-services - 如何在 Amazon Linux EC2 中安装 Ansible?

amazon-web-services - IAM AWS S3 限制到特定的子文件夹

python - 如何仅针对 dynamodb 流中的 INSERT 事件触发 lambda 函数?

amazon-web-services - 无服务器 : Deploy Endpoint with Custom Authorizer - Name Not Found Error

java - 如何在java中获取签名的url?

python - 使用 python 在 opencv 中显示 imshow 不是交互式的

python - 没有名为 'pyhive' 的模块

python - Django Admin - 适用于一个整数模型的选择,但不适用于另一个