度量标准系统无法识别应用程序jar中的自定义源/接收器

时间:2016-09-29 06:52:44

标签: apache-spark spark-streaming

来自here

我在我的应用程序jar中添加了Custom Source和Sink,并找到了在独立群集节点上获取静态固定metrics.properties的方法。当我想启动我的应用程序时,我给出静态路径 - spark.metrics.conf =“/ fixed-path / to / metrics.properties”。尽管我的自定义源/接收器在我的代码/ fat-jar中 - 我在CustomSink上得到了ClassNotFoundException。

我的fat-jar(包含Custom Source / Sink代码)位于hdfs上,对所有人都具有读取权限。

所以这就是我已经尝试过的所有设置(因为执行器在我的应用程序fat-jar中找不到Custom Source / Sink):

  1. spark.executor.extraClassPath = hdfs:// path / to / fat-jar
  2. spark.executor.extraClassPath = fat-jar-name.jar
  3. spark.executor.extraClassPath = ./fat-jar-name.jar
  4. spark.executor.extraClassPath = ./
  5. spark.executor.extraClassPath = / dir / on / cluster / *(虽然*不在文件级别,但还有更多目录 - 我无法知道随机应用程序ID或驱动程序ID以提供绝对名称启动应用程序)
  6. 这似乎就是这个案例的执行者被初始化的方式(如果我错了请纠正我) -

    1. 驱动程序告诉这里是jar位置 - hdfs://../fat-jar.jar,这里有一些像spark.executor.memory等属性。
    2. 群集
    3. 上的N个执行器启动(取决于配置)
    4. 开始下载hdfs://../fat-jar.jar但同时初始化指标系统(? - 不确定此步骤)
    5. Metrics系统寻找Custom Sink / Source文件 - 因为它在metrics.properties中提到 - 甚至在它下载fat-jar之前(实际上有所有这些文件)(这是我的假设)
    6. ClassNotFoundException - 找不到CustomSink!
    7. 我的理解是否正确?此外,还有什么我可以尝试的吗?如果有人有自定义源/汇的经验,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

当我需要扩展现有的GraphiteSink类时,我偶然发现了同一个ClassNotFoundException,这就是我能够解决的方法。

首先,我在CustomGraphiteSink包中创建了一个org.apache.spark.metrics.sink类:

package org.apache.spark.metrics.sink;
public class CustomGraphiteSink extends GraphiteSink {}

然后我在metrics.properties中指定了班级 *.sink.graphite.class=org.apache.spark.metrics.sink.CustomGraphiteSink

并通过以下方式将此文件传递给spark-submit: --conf spark.metrics.conf=metrics.properties

答案 1 :(得分:0)

为了使用自定义源/接收器,必须使用$val = array_merge($val, $value4old[$i]); 进行分发,并通过spark.executor.extraClassPath

进行设置。