昨天(2023-02-22)开始发现公司Spark集群上有些任务执行时间过长,最后失败。具体表现为:大量失败的Task,最终的任务也失败了在SparkMaster管理界面上,可以看到任务的Driver地址并不是真实的IP地址,而是一个名为“host”的主机名.containers.internal";在Spark的worker节点上,可以观察到不断创建Java进程,然后进程瞬间结束;进入worker节点的日志目录查看日志内容,发现异常信息为地址“host.containers.internal”连接失败。所以很明显,当前的问题与“host.containers.internal”有关。背景说明:我们的Spark集群在podman容器中运行,并且在非root用户下运行。在网上搜索后发现这个主机名是容器分配给内部进程连接到容器所在主机本身的。进一步查看podman参考文档。据此,只有容器运行网络模式为slirp4netns,即带参数“--network=slirp4netns”时,主机名host.containers.internal才会可用。但是当我运行容器时,参数是“--network=host”。仔细看文档发现slirp4netns模式是非root运行容器的默认模式。根据我遇到的实际情况,是不是我给的“--network=host”参数不起作用?但是使用podmaninspectxxx|grepNetworkMode命令查看容器,得到结果:"NetworkMode":"host"没看懂,先把这个放一边,再说怎么访问host.containers.internal,有两种方式:把参数改成"--network=slirp4netns:allow_host_loopback=true"修改/usr/share/containers/containers.conf,修改或增加配置network_cmd_options的值到["allow_host_loopback=true"]而不修改--network参数接下来,我将尝试第二种方法。修改配置文件,重启各个worker容器,故障消失,Spark任务可以成功执行。但是需要一些时间来观察。
