草庐IT

python - AWS EMR 从 S3 导入外部库

coder 2023-08-25 原文

我已经使用 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/

有关python - AWS EMR 从 S3 导入外部库的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  5. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  6. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. ruby - 如何使用 CarrierWave 从 S3 获取真实文件 - 2

    我有一个应用程序可以读取文件的内容并为其编制索引。我将它们存储在磁盘本身中,但现在我使用的是AmazonS3,因此以下方法不再适用。事情是这样的:defperform(docId)@document=Document.find(docId)if@document.file?#Youshould'tcreateanewversion@document.versionlessdo|doc|@document.file_content=Cloudoc::Extractor.new.extract(@document.file.file)@document.saveendendend@docu

随机推荐