就像问题标题所说的那样,我正在尝试向执行者广播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的限制,所以我不是为什么要遇到此错误。
答案 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