我已经使用 Amazon EMR 设置了一个集群。 我在 S3 上有一个 python 库(从 github 克隆,在 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/