我编写了一个CustomListener(派生自SparkListener等等)并且工作正常,我可以拦截指标。 问题是关于在侦听器本身中使用DataFrames,因为它假设使用相同的Spark Context,但是从2.1.x开始,每个JVM只有1个上下文。
假设我想在json中写入磁盘中的一些指标。无法在ApplicationEnd上执行此操作,仅在最后一个jobEnd(如果您有多个作业,最后一个作业)。
答案 0 :(得分:1)
SparkListeners应该尽可能快,因为慢速SparkListener会阻止其他人接收事件。您可以使用单独的线程来释放主事件调度程序线程,但是您仍然受限于每个JVM都有一个SparkContext。
然而,这个限制很容易克服,因为您可以使用SparkContext.getOrCreate来请求当前的SparkContext。
但我不建议使用该架构。这对驱动程序的JVM施加了太大的压力,而JVM应该“专注”应用程序处理(而不是收集可能已经为Web UI和/或Spark History Server执行的事件)。
我宁愿使用Kafka或Cassandra或其他一些持久性存储来存储事件,并使用其他处理应用程序来使用它们(就像Spark History Server一样)。