AWS Datapipeline的EmrActivity步骤运行配置单元脚本立即失败,并显示“没有此类文件或目录”

mBr*_*ria 1 hadoop hive amazon-web-services 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" }
}
Run Code Online (Sandbox Code Playgroud)

以及运行它的相应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"
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误消息始终如下:

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)
...
Run Code Online (Sandbox Code Playgroud)

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

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

我可以直接在EMR中手动创建一个群集,该群集看起来与我在此DataPipeline中指定的完全一样,并具有使用相同"command-runner.jar,/usr/share/aws/emr/scripts/hive-script ..."命令字符串的Step ,并且可以正常运行。

有没有人遇到过这种情况,可以就我所缺少和/或做错的事情向我提出建议?我已经有一段时间了。

mBr*_*ria 5

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

我的Step脚本有3件事,也许是4件事:

  • 在运行脚本时,需要“ script-runner.jar”而不是“ command-runner.jar”(我最终只是从s3上的EMR的libs目录中拉出了该脚本)
  • 需要从其他地方获取“ hive脚本”-因此,为此还前往s3中的公共EMR libs目录
  • 一个有趣的人,谢谢AWS;对于步骤args(“ hive-script”规范之后的所有内容)... 在DataPipeline中时需要用逗号分隔其中的每个值(这与在EMR中直接在Step中指定args时使用空格分隔相反)

然后是“也许第4个”:

  • 包括s3中的基本文件夹和我们正在使用的有关Hive脚本的特定Hive发行版(我之所以添加此代码,是因为在AWS博客中看到了类似的内容,但尚未测试它是否对我的情况有所帮助,太累了一切)

因此,最后,我正在工作的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" }
}
Run Code Online (Sandbox Code Playgroud)

希望这有助于从我投入的时间上节省别人。编码愉快!