广播TypeSafe Config引发异常用户类引发异常:java.io.UTFDataFormatException:编码字符串太长:70601个字节?

时间:2019-06-27 02:40:03

标签: scala apache-spark spark-streaming

就像问题标题所说的那样,我正在尝试向执行者广播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
  }
}

当我在main方法中调用broadCastConfig时,它将引发以下异常

用户类引发异常:java.io.UTFDataFormatException:编码字符串太长:70601字节

我的application.conf的最终大小只有3KB或3000字节,这几乎不超过64KB的限制,所以我不是为什么要遇到此错误。

1 个答案:

答案 0 :(得分:3)

似乎您在application.conf中有 个长字符串 ,这是导致问题的原因。

通过this :64KB String limit in Java data streams示例,您可以证明这一点。

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();
}

所遇到的相似但不相同的问题已解决here

我建议解析application.conf并将其设置为对象,然后使用广播发送给所有执行者。

意味着..您可以发送任何可序列化的对象进行广播...但是格式为application.conf