awsglue.utils.GlueArgumentError:参数 --JOB_NAME 是必需的

Posted

技术标签:

【中文标题】awsglue.utils.GlueArgumentError:参数 --JOB_NAME 是必需的【英文标题】:awsglue.utils.GlueArgumentError: argument --JOB_NAME is required 【发布时间】:2018-09-13 22:03:08 【问题描述】:

当我使用 Python 在 AWS Glue 中运行 Glue 作业样板时,出现错误

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

glueContext = GlueContext(SparkContext.getOrCreate())
spark = glueContext.spark_session

args = getResolvedOptions(sys.argv, ['JOB_NAME'])
job = Job(glue_context)
job.init(args[‘JOB_NAME’], args)

这是错误

in getResolvedOptions
File "/usr/lib64/python2.7/argparse.py", line 1733, in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
File "/usr/lib64/python2.7/argparse.py", line 1957, in _parse_known_args
self.error(_('argument %s is required') % name)
awsglue.utils.GlueArgumentError: argument --JOB_NAME is required

这遵循我的代码,然后

job.commit()

但是 AWS 说不提供 JOBNAME。 我究竟做错了什么? getResolved 还有什么作用?我尝试阅读 AWS 文档,但什么也得不到。

【问题讨论】:

您是否使用 Zeppelin Notebook 等开发端点运行此代码? 【参考方案1】:

您能否提供示例脚本的参考链接。我相信 AWS 会解释说您应该使用脚本或 lambda 等开始工作。在这种情况下,您将指定如下内容:

response = client.start_job_run(
             JobName = 'my_test_Job',
             Arguments = 
               '--day_partition_key':   'partition_0',
               '--hour_partition_key':  'partition_1',
               '--day_partition_value':  day_partition_value,
               '--hour_partition_value': hour_partition_value  )

然后在您的粘合作业中,您可以按如下方式访问这些变量:

args = getResolvedOptions(sys.argv,
                          ['JOB_NAME',
                           'day_partition_key',
                           'hour_partition_key',
                           'day_partition_value',
                           'hour_partition_value'])

因此,您在某处传递了作业名称的变量/值。明智的做法是,尝试通过按名称 JOB_NAME 设置参数并传递值来运行作业。

以上代码示例参考:https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-get-resolved-options.html

让我们知道。

【讨论】:

什么是client?它是库中的方法/函数吗?【参考方案2】:

这可能是一个迟到的回复,但为我解决了同样的错误。 将参数传递给 Glue 脚本: 在Security configuration, script libraries, and job parameters (optional) --> Job parameters (key value) 中添加/编辑作业时传递作业参数,例如:

key = --JOB_NAME    value= my_job
key = --input       value= 'xyz'

在 Glue 脚本中使用参数:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [job_name]
sc = SparkContext()
glueContext = GlueContext(SparkContext.getOrCreate())
spark = glueContext.spark_session
job = Job(glueContext)
args = getResolvedOptions(sys.argv, ['JOB_NAME','input'])
job.init(args['JOB_NAME'], args)
print("Job name is:, and input: ".format(args["JOB_NAME"],args["input"]))

job.commit()

也据我了解,它与开发环境无关,在仪表板参数中添加/编辑 Glue 作业时也可以在不创建 lambda 函数的情况下传递。

【讨论】:

【参考方案3】:

您不能在开发环境中运行以下命令。

args = getResolvedOptions(sys.argv, ['JOB_NAME'])

【讨论】:

【参考方案4】:

我在遇到与 OP 类似的问题时偶然发现了此解决方案,但使用的是 AWS Glue Python Shell 作业。斯瓦蒂的上述回答有所帮助。

如果有人试图将参数传递给 AWS Glue Python Shell 作业,下面是一个适合我的模板:

key = --JOB_NAME    value= my_job
key = --input       value= 'xyz'

AWS Glue Python Shell 作业脚本:

import sys
from awsglue.utils import getResolvedOptions

args = getResolvedOptions(sys.argv, ['JOB_NAME','input'])

print("Job name is:, and input: ".format(args["JOB_NAME"],args["input"]))

【讨论】:

截至目前 (2022/1),您不应提供 JOB_NAME 作为 pythonshell 脚本的预期参数,否则会中断作业执行。【参考方案5】:

要将 JOB_NAME 传递给脚本,请使用以下命令提交您的脚本

$HOME/bin/aws-glue-libs-glue-1.0/bin/gluesparksubmit TestScripy.py --JOB_NAME local_test

local_test 是作业名称。我仍然不知道如何传递 JOBNAME 以外的键值对

更多信息请点击此处:https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html

【讨论】:

以上是关于awsglue.utils.GlueArgumentError:参数 --JOB_NAME 是必需的的主要内容,如果未能解决你的问题,请参考以下文章