使用自定义文件配置 EMR 节点

Posted

技术标签:

【中文标题】使用自定义文件配置 EMR 节点【英文标题】:Provisioning EMR nodes with custom files 【发布时间】:2019-07-24 16:25:49 【问题描述】:

我正在尝试使用 Apache Nutch 依赖于 AWS EMR Hadoop 集群运行 jar。问题是 Nutch 找不到插件类(我用-Dplugin.folders 指定插件位置)。 我在本地测试了这个选项,它工作正常:java -cp app.jar -Dplugin.folders=./nutch-plugins

我收到此错误:

19/07/24 15:42:26 INFO mapreduce.Job: Task Id : attempt_1563980669003_0005_m_000000_2, Status : FAILED
Error: java.lang.RuntimeException: x point org.apache.nutch.net.URLNormalizer not found.
        at org.apache.nutch.net.URLNormalizers.<init>(URLNormalizers.java:146)
        at org.apache.nutch.crawl.Injector$InjectMapper.setup(Injector.java:139)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:796)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:342)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

我试图将插件复制到 /tmp 文件夹(只是猜测它是一个共享文件夹) - 没有帮助:

hadoop jar app.jar -Dplugin.folders=/tmp/nutch-plugins

然后我尝试将其复制到 HDFS - 没有帮助:

hadoop fs -cp file:///tmp/nutch-plugins hdfs:///tmp/
hadoop jar app.jar -Dplugin.folders=hdfs:///tmp/nutch-plugins

并尝试将其上传到 S3 存储桶 - 没有帮助:

hadoop fs -cp file:///tmp/nutch-plugins s3a:///mybucket/
hadoop jar app.jar -Dplugin.folders=s3a:///mybucket/nutch-plugins

如何使用 Nutch 插件配置 Hadoop 节点?我所需要的只是将插件文件复制到某个地方,以便从集群中的任何节点访问它。

【问题讨论】:

【参考方案1】:

在分布式模式下(在 Hadoop 集群中),插件包含在作业文件 (runtime/deploy/apache-nutch-1.x.job) 中:

    从源码包或从git克隆的Nutch源码开始 调整conf/ 中的配置 - 注意:配置文件也包含在作业文件中 构建 Nutch (ant runtime) 运行runtime/deploy/bin/nutchruntime/deploy/bin/crawl:调用hadoop jar &lt;jobfile&gt; 来启动Nutch 作业,因此可执行文件hadoop 必须在PATH 上。

【讨论】:

感谢您的回答。如果我只运行 Nutch 本身会很有帮助,但我正在运行使用 Nutch 类作为依赖项的自定义 jar,所以我无法以与 Nutch 相同的方式部署我的应用程序【参考方案2】:

我找到了一种使用 EMR bootstrap actions 为所有节点配置所需文件的方法,因此我创建了一个脚本以将 nutch-plugins 从 S3 存储桶复制到 /tmp/nutch-plugins 目录:

#!/bin/bash
aws s3 cp --recursive s3://mybucket/nutch-plugins/ /tmp/nutch-plugins/

然后将此脚本上传到 S3 存储桶, 并在配置集群时添加了“自定义引导操作”。它可以通过 AWS Web 控制台(EMR 高级模式)或使用 CLI 参数添加:

aws emr create-cluster \
  # ... \
  --bootstrap-actions Path="s3://mybucket/bootstrap.sh"

在这些步骤之后,任何节点都可以访问/tmp/nutch-plugins 的插件文件:

hadoop jar app.jar -Dplugin.folders=/tmp/nutch-plugins

【讨论】:

以上是关于使用自定义文件配置 EMR 节点的主要内容,如果未能解决你的问题,请参考以下文章

activiti modeler 任务节点自定义属性扩展

Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ④ ( 默认生成的 pom 文件 | Maven 中的 pom 配置 | 自定义 pom 文件节点 )

Flink EMR 安装

web config自定义节点报错 跪求大神完美解答

网关开发5.Openresty 自定义负载均衡与流量转发

.net core实现读取自定义配置文件