A HostProvider may not be empty --记一次线上配置问题的来龙去脉和解决方案
起源公元XXX年,新上线的mapreduce任务在线上执行时遇到问题,主要报错如下:A HostProvider may not be empty,根据报错信息,定位到如下代码:org.apache.zookeeper.client.StaticHostProvider#StaticHostProvider,截图如下:转存失败重新上传取消经过判断,发现是zkClient最终...
起源
公元XXX年,新上线的mapreduce任务在线上执行时遇到问题,主要报错如下:
A HostProvider may not be empty,
根据报错信息,定位到如下代码:
org.apache.zookeeper.client.StaticHostProvider#StaticHostProvider,截图如下:
经过判断,发现是zkClient最终解析到的ip地址列表为空导致的问题,但是zkClient为什么解析不了zk地址呢,带着疑惑,点开了java.net.InetAddress#getAllByName(java.lang.String)方法,签名如下:
映入眼帘的第一个就是该方法可能抛出UnknownHostException异常,看到这里,笔者心中已经有了个大概的推断,跟同事拿到最终执行的Jar包以及执行的命令,再次进行分析。
为了区分线上环境和测试环境,在启动任务时带上了spring配置文件的路径,-Dspring.xxxx=xxxx , 并且配置文件中会指定zk的链接地址,如下
线上的配置文件格式相同,地址不同。
hadoop属于典型的单线程多进程应用,为了让应用能在多台机器上运行,hadoop会进行jar包的分发,但是不会将配置文件一并分发过去。
Main方法只会执行一次,mapper 以及reduce分别属于不同的进程,无法获取main方法的配置
终结
未来
更多推荐
所有评论(0)