我如何从python获取关于Spark作业和阶段的数据

时间:2019-03-18 16:39:28

标签: python-3.x apache-spark pyspark

跟随面包屑,我拼凑了一些代码,这些代码似乎可以满足我的要求:在后台运行,查看正在进行的工作,然后收集...可能提供的任何信息:

def do_background_monitoring(sc: pyspark.context.SparkContext):
    thread = threading.Thread(target=monitor, args=[sc])
    thread.start()
    return thread

def monitor(sc: pyspark.context.SparkContext):
    job_tracker: pyspark.status.StatusTracker = sc.statusTracker() # should this go inside the loop?
    while True:
        time.sleep(1)
        for job_id in job_tracker.getActiveJobsIds():
            job: pyspark.status.SparkJobInfo = job_tracker.getJobInfo(job_id)
            stages = job.stageIds
            # ???

但是,那是我死胡同的地方。根据{{​​3}},stageIds是一个int[],显然是py4j或其他不知道如何处理它的东西? (the docs

ipdb> stages
JavaObject id=o34
ipdb> stages. 
          equals    notify    wait     
          getClass  notifyAll          
          hashCode  toString           
ipdb> stages.toString()
'[I@4b1009f3'

这是死胡同吗?还有其他方法可以做到这一点吗?如果我愿意编写scala来做到这一点,那么我是否可以在Scala中拥有这点并将其余部分保留在Python中?

1 个答案:

答案 0 :(得分:0)

...虽然repl使它看起来像Python对该对象一无所知,但它只是某种Object,而py4j确实使您可以使用数组的内容:

ipdb> type(si)
<class 'py4j.java_collections.JavaArray'>
ipdb> tuple(si)
(0,)

现在我真的很傻:)