Broadcasting TypeSafe Config генерирует исключение. Класс пользователя выбросил исключение: java.io.UTFDataFormatException: слишком длинная закодированная строка: 70601 байт? - PullRequest
1 голос
/ 27 июня 2019

Как и в заголовке вопроса, я пытаюсь передать конфигурацию TypeSafe исполнителям, чтобы мой код мог получить доступ к конфигурации. К сожалению, я получаю исключение

object AppConfigUtility {

  var config: Config = ConfigFactory.empty()

  var brConfig: Broadcast[Config] = _

  /**
    * Broadcast the config so it can be available for executors to use
    * @param sc
    */
  def broadCastConfig(sc: SparkContext): Unit = {

    brConfig = sc.broadcast(config)

  }

  def loadConfig(): Unit = {
    //some actual implementation of loading my application.conf file
  }
}

Когда я вызываю broadCastConfig в моем основном методе, он выдает следующее исключение

Пользовательский класс выдал исключение: java.io.UTFDataFormatException: слишком длинная закодированная строка: 70601 байт

Окончательный размер моего application.conf составляет всего 3 КБ или 3000 байт, что не превышает предел в 64 КБ, поэтому я не понимаю, почему нажимаю на эту ошибку.

1 Ответ

3 голосов
/ 27 июня 2019

похоже, что у вас есть длинные строки в application.conf, что вызывает проблему ..

с this: ограничение строки 64 КБ в данных Javastreams пример, который вы могли бы доказать, что.

public static void main(String[] args) throws Exception {
    // generate string longer than 64KB
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10000; i++)
        sb.append("1234567890");
    String s = sb.toString();

    // write the string into the stream
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(baos);
    dos.writeUTF(s);
    dos.close();
}

похожая, но не та же проблема, с которой сталкивались, была исправлена ​​ здесь

Я бы предложил разобрать application.conf иустановить его на объект и отправить его всем исполнителям с помощью широковещательной

Означает ... вы можете отправить любой сериализуемый объект на широковещательную рассылку ... но в форме application.conf

...