如何在SparkListener中使用DataFrame?

时间:2017-01-29 18:40:45

标签: scala apache-spark

我编写了一个CustomListener(派生自SparkListener等等)并且工作正常,我可以拦截指标。 问题是关于在侦听器本身中使用DataFrames,因为它假设使用相同的Spark Context,但是从2.1.x开始,每个JVM只有1个上下文。

假设我想在json中写入磁盘中的一些指标。无法在ApplicationEnd上执行此操作,仅在最后一个jobEnd(如果您有多个作业,最后一个作业)。

  1. 可行/可行吗???
  2. 我正在尝试测量作业/阶段/任务的性能,记录然后以编程方式进行分析。可能那不是最好的方法吗?! Web UI很好 - 但我需要让事情变得可以呈现
  3. 我可以强制在endJob事件上创建数据帧,但是会抛出一些错误(基本上它们指的是无法向侦听器传播事件),并且通常我希望避免不必要的操作。我希望有一套可以记录并写入磁盘的简洁测量值

1 个答案:

答案 0 :(得分:1)

SparkListeners应该尽可能快,因为慢速SparkListener会阻止其他人接收事件。您可以使用单独的线程来释放主事件调度程序线程,但是您仍然受限于每个JVM都有一个SparkContext。

然而,这个限制很容易克服,因为您可以使用SparkContext.getOrCreate来请求当前的SparkContext。

但我不建议使用该架构。这对驱动程序的JVM施加了太大的压力,而JVM应该“专注”应用程序处理(而不是收集可能已经为Web UI和/或Spark History Server执行的事件)。

我宁愿使用Kafka或Cassandra或其他一些持久性存储来存储事件,并使用其他处理应用程序来使用它们(就像Spark History Server一样)。