部分异常: Service 'sparkDriver' failed after 16 retries.......correct binding address.
2 解决方法云平台发放的虚拟机包含两个IP,包含虚拟机内部实际的网络地址(ifconfig查看到的内网IP:192.168.xx.xx)和对方访问的IP(绑定的外网虚拟IP:11.11.xx.xx),想要在云平台外访问虚拟机需要使用外网IP经过一次网络地址转换,直接使用内部IP是无法访问的。
所以在当任务提交的时候实际使用的是内部IP提交任务到spark集群,当spark集群与客户端交互时,也是访问这个内部IP地址,这显然是不可达的。从而导致任务无法正常执行下去。
3 分析原因手动在客户端的spark-default.conf文件上加两个配置,即在提交任务时使用内部IP,接收spark集群的信息时,使用外部IP:
--------
spark.driver.host 外部IP // spark.driver.host 11.11.xx.xx
spark.driver.bindAddress 内部IP // spark.driver.bindAddress 192.168.xx.xx
具体可以参考下面这段源码:
(1)Driver绑定的地址:DRIVER_BIND_ADDRESS:
优先获取顺序依次是:spark.driver.bindAddress-》spark.driver.host-》Utils.localHostName()
(2)Driver对外宣称的地址:DRIVER_HOST_ADDRESS
优先获取顺序依次是:spark.driver.host-》Utils.localHostName()-------
解释: DRIVER_BIND_ADDRESS默认会取/etc/hosts里配置的外网IP,如果不加上述spark.driver.bindAddress 的配置,那内部IP就无法获取到,而默认的外部IP没有转换是无法直接联通客户端的。
private[spark] def createDriverEnv(
conf: SparkConf,
isLocal: Boolean,
listenerBus: LiveListenerBus,
numCores: Int,
mockOutputCommitCoordinator: Option[OutputCommitCoordinator] = None): SparkEnv = {
assert(conf.contains(DRIVER_HOST_ADDRESS),
s"${DRIVER_HOST_ADDRESS.key} is not set on the driver!")
assert(conf.contains("spark.driver.port"), "spark.driver.port is not set on the driver!")
val bindAddress = conf.get(DRIVER_BIND_ADDRESS)
val advertiseAddress = conf.get(DRIVER_HOST_ADDRESS)
val port = conf.get("spark.driver.port").toInt
val ioEncryptionKey = if (conf.get(IO_ENCRYPTION_ENABLED)) {
Some(CryptoStreamUtils.createKey(conf))
} else {
None
}
create(
conf,
SparkContext.DRIVER_IDENTIFIER,
bindAddress,
advertiseAddress,
port,
isLocal,
numCores,
ioEncryptionKey,
listenerBus = listenerBus,
mockOutputCommitCoordinator = mockOutputCommitCoordinator
)
}
【Spark内核源码】Spark执行环境,SparkEnv_lazy_moon的博客-CSDN博客



