跟随面包屑,我拼凑了一些代码,这些代码似乎可以满足我的要求:在后台运行,查看正在进行的工作,然后收集...可能提供的任何信息:
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中?
答案 0 :(得分:0)
...虽然repl使它看起来像Python对该对象一无所知,但它只是某种Object,而py4j确实使您可以使用数组的内容:
ipdb> type(si)
<class 'py4j.java_collections.JavaArray'>
ipdb> tuple(si)
(0,)
现在我真的很傻:)