使用自定义文件配置 EMR 节点
Provisioning EMR nodes with custom files
我正在尝试 运行 对 AWS EMR Hadoop 集群依赖 Apache Nutch 的 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.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 节点?我所需要做的就是将插件文件复制到某个地方,以便从集群中的任何节点访问它。
在分布式模式下(在 Hadoop 集群中)插件包含在作业文件中 (runtime/deploy/apache-nutch-1.x.job
):
- 从源码包或从git
克隆的Nutch源码开始
- 调整
conf/
中的配置 - 注意:配置文件也包含在作业文件中
- 构建 Nutch (
ant runtime
)
- 运行
runtime/deploy/bin/nutch
或 runtime/deploy/bin/crawl
:调用 hadoop jar <jobfile>
来启动 Nutch 作业,因此可执行文件 hadoop
必须在 PATH 上。
我找到了一种使用 EMR bootstrap actions 为所有节点提供所需文件的方法,因此我创建了一个脚本来将 nutch-plugins
从 S3 存储桶复制到 /tmp/nutch-plugins
目录:
#!/bin/bash
aws s3 cp --recursive s3://mybucket/nutch-plugins/ /tmp/nutch-plugins/
然后将此脚本上传到 S3 存储桶,
并在配置集群时添加了 "custom bootstrap action"。它可以通过 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
我正在尝试 运行 对 AWS EMR Hadoop 集群依赖 Apache Nutch 的 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.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 节点?我所需要做的就是将插件文件复制到某个地方,以便从集群中的任何节点访问它。
在分布式模式下(在 Hadoop 集群中)插件包含在作业文件中 (runtime/deploy/apache-nutch-1.x.job
):
- 从源码包或从git 克隆的Nutch源码开始
- 调整
conf/
中的配置 - 注意:配置文件也包含在作业文件中 - 构建 Nutch (
ant runtime
) - 运行
runtime/deploy/bin/nutch
或runtime/deploy/bin/crawl
:调用hadoop jar <jobfile>
来启动 Nutch 作业,因此可执行文件hadoop
必须在 PATH 上。
我找到了一种使用 EMR bootstrap actions 为所有节点提供所需文件的方法,因此我创建了一个脚本来将 nutch-plugins
从 S3 存储桶复制到 /tmp/nutch-plugins
目录:
#!/bin/bash
aws s3 cp --recursive s3://mybucket/nutch-plugins/ /tmp/nutch-plugins/
然后将此脚本上传到 S3 存储桶, 并在配置集群时添加了 "custom bootstrap action"。它可以通过 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