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 是必需的的主要内容,如果未能解决你的问题,请参考以下文章