运行配置单元脚本的AWS Datapipeline,EmrActivity步骤会立即失败,并显示“No such file or directory”

时间:2015-11-14 01:25:20

标签: hadoop amazon-web-services hive amazon-emr amazon-data-pipeline

我有一个简单的DataPipeline作业,它只有一个EmrActivity,只需一步就可以尝试从我的s3存储桶中执行一个配置单元脚本。

EmrActivity的配置如下所示:

{
  "name" : "Extract and Transform",
  "id" : "HiveActivity",
  "type" : "EmrActivity",
  "runsOn" : { "ref" : "EmrCluster" },
  "step" : ["command-runner.jar,/usr/share/aws/emr/scripts/hive-script --run-hive-script --args -f s3://[bucket-name-removed]/s1-tracer-hql.q -d INPUT=s3://[bucket-name-removed] -d OUTPUT=s3://[bucket-name-removed]"],
  "runsOn" : { "ref": "EmrCluster" }
}

正在运行的相应EmrCluster资源的配置:

{
  "id" : "EmrCluster",
  "type" : "EmrCluster",
  "name" : "Hive Cluster",
  "keyPair" : "[removed]",
  "masterInstanceType" : "m3.xlarge",
  "coreInstanceType" : "m3.xlarge",
  "coreInstanceCount" : "2",
  "coreInstanceBidPrice": "0.10",
  "releaseLabel": "emr-4.1.0",
  "applications": ["hive"],
  "enableDebugging" : "true",
  "terminateAfter": "45 Minutes"
}

我收到的错误消息总是如下:

java.io.IOException: Cannot run program "/usr/share/aws/emr/scripts/hive-script --run-hive-script --args -f s3://[bucket-name-removed]/s1-tracer-hql.q -d INPUT=s3://[bucket-name-removed] -d OUTPUT=s3://[bucket-name-removed]" (in directory "."): error=2, No such file or directory
    at com.amazonaws.emr.command.runner.ProcessRunner.exec(ProcessRunner.java:139)
    at com.amazonaws.emr.command.runner.CommandRunner.main(CommandRunner.java:13)
...

主要错误msg是“...(在目录中。”):错误= 2,没有这样的文件或目录“。

我已登录主节点并验证了/usr/share/aws/emr/scripts/hive-script的存在。我还尝试为其他几个地方的hive-script指定一个基于s3的位置;总是出现相同的错误结果。

我可以直接在EMR中手动创建一个类似于我在此DataPipeline中指定的集群,其中Step使用相同的"command-runner.jar,/usr/share/aws/emr/scripts/hive-script ..."命令字符串,并且它可以正常工作。

有没有人经历过这个,可以告诉我我缺少什么和/或做错了什么?我现在已经在这一段时间了。

1 个答案:

答案 0 :(得分:4)

经过一番长时间的研究和尝试错误,我能够回答我自己的问题。

我的步骤脚本有3件事,可能是4件事:

  • 需要'script-runner.jar',而不是'command-runner.jar',因为我们正在运行一个脚本(我最终只是从s3上的EMR的libs dir中提取)
  • 需要从其他地方获取'hive-script' - 所以,也在s3中找到了公共EMR libs目录
  • 一个有趣的,谢谢AWS;对于步骤args('hive-script'规范之后的所有内容)...... need to comma-separate every value in it when in DataPipeline(与在EMR中直接指定args时的空格分隔相反)

然后是“可能是第四次”:

  • 包含s3中的基本文件夹和我们正在使用的hive-script的特定hive版本(我在an AWS blog看到类似内容时添加了这个,但尚未测试它是否成为我的情况有所不同,其他一切都耗尽了)

所以,最后,我工作的EmrActivity看起来像这样:

{
  "name" : "Extract and Transform",
  "id" : "HiveActivity",
  "type" : "EmrActivity",
  "runsOn" : { "ref" : "EmrCluster" },
  "step" : ["s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar,s3://us-east-1.elasticmapreduce/libs/hive/hive-script,--base-path,s3://us-east-1.elasticmapreduce/libs/hive/,--hive-versions,latest,--run-hive-script,--args,-f,s3://[bucket-name-removed]/s1-tracer-hql.q,-d,INPUT=s3://[bucket-name-removed],-d,OUTPUT=s3://[bucket-name-removed],-d,LIBS=s3://[bucket-name-removed]"],
  "runsOn" : { "ref": "EmrCluster" }
}

希望这有助于在我投入的同一时间内拯救其他人。快乐的编码!