我们在带有纱线的数据中心集群上运行了火花作业 - 我们在python中有一个包装程序,它对作业的状态进行持续轮询,我们正在监控纱线的作业状态 - 如下所示:
dataproc = discovery.build('dataproc', 'v1', credentials=credentials)
job_id = '8873a82c-6201-48d4-8ad3-d8f236ef9c49'
projectId='dev-111111'
REGION = 'global'
result = dataproc.projects().regions().jobs().get(projectId=projectId,region=REGION,jobId=job_id).execute()
print result['yarnApplications'][0]['state']
根据Google dataproc的文档here
的建议上面的“结果”是一个JSON对象,在JSON对象中有一个名为“yarnApplications”的字段,它是一个列表对象,其第一个也是唯一一个元素包含我们感兴趣的作业状态。
问题是 - 为什么这个“yarnApplications”对象总是一个列表对象,即使我们只有一个纱线作业在运行?我们已经看到纱线多次尝试启动工作的情况 - “yarnApplications”字段在这种情况下是否包含多个元素?
另外,是否保证 - 如果我们只在纱线上运行一个作业,“yarnApplications”列表对象将只包含一个元素?
我们知道这只是dataproc客户端的测试版 - 但由于我们在其上运行生产系统,所以我们将非常感谢任何输入和建议。
由于
答案 0 :(得分:1)
根据Dataproc API job definition,作业包含YarnApplications的“集合”,通常这个定义不能根据运行时内容更改它的类型。例如,Job.getYarnApplications()
returns a java.util.List的Java接口,无论列表是仅恰好有一个元素还是零或多个。
此API定义旨在适应各种作业类型,每个作业可以提交多个YARN应用程序,例如Hive或Pig。在某些情况下,Hadoop jarfiles还提交多个作业,例如,如果驱动程序是Apache Crunch程序,或者您运行Gridmix。
确实如果你只有一个作业在YARN中运行,那么列表对象只包含一个元素;列表中的YARN应用程序仅是给定作业调用创建的应用程序。即使您同时运行多个Dataproc作业,每个作业提交不同的并发YARN应用程序,每个作业也只包含作业自己提交的特定YARN应用程序。