Система метрик не распознает пользовательский источник / приемник в банке приложения

Продолжение отсюда

Я добавил Custom Source и Sink в jar приложения и нашел способ получить статические фиксированные значения metrics.properties на узлах автономного кластера. Когда я хочу запустить свое приложение, я даю статический путь - spark.metrics.conf="/fixed-path/to/metrics.properties". Несмотря на то, что мой собственный источник / приемник находится в моем коде / толстом фляге - я получаю ClassNotFoundException на CustomSink.

Мой толстый кувшин (с кодом Custom Source/Sink в нем) находится на hdfs с доступом для чтения ко всем.

Итак, вот что все, что я уже пробовал установить (так как исполнители не могут найти Custom Source/Sink в моем приложении fat-jar):

  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 / * (хотя * не на уровне файлов, существует больше каталогов - у меня нет способа узнать случайный идентификатор приложения или идентификатор драйвера, чтобы дать абсолютное имя перед запуском приложения)

Похоже, что так инициализируются исполнители для этого случая (пожалуйста, исправьте меня, если я ошибаюсь) -

  1. Драйвер сообщает, что здесь находится файл jar - hdfs://../fat-jar.jar, а также некоторые свойства, такие как spark.executor.memory и т. Д.
  2. Количество исполнителей увеличивается (в зависимости от конфигурации) на кластере
  3. Начните скачивать hdfs: //../fat-jar.jar, но за это время инициализируйте систему метрик (? - не уверены в этом шаге)
  4. Система метрик ищет файлы Custom Sink/Source - так как она упоминается в metrics.properties - даже до того, как она закончит загрузку fat-jar (который фактически содержит все эти файлы) (это моя гипотеза)
  5. ClassNotFoundException - CustomSink не найден!

Правильно ли мое понимание? Кроме того, я могу попробовать что-нибудь еще? Если у кого-то есть опыт работы с пользовательскими источниками / приемниками, любая помощь будет принята с благодарностью.

1 ответ

Я наткнулся на то же ClassNotFoundException, когда мне нужно было расширить существующие GraphiteSink класс и вот как мне удалось это решить.

Во-первых, я создал 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

Чтобы использовать собственный источник / приемник, нужно распространять его, используя spark-submit --files и установите его через spark.executor.extraClassPath

Другие вопросы по тегам