起源

公元XXX年,新上线的mapreduce任务在线上执行时遇到问题,主要报错如下:

A HostProvider may not be empty,

根据报错信息,定位到如下代码:

org.apache.zookeeper.client.StaticHostProvider#StaticHostProvider,截图如下:

image2020-3-4_10-14-45.png?version=1&modificationDate=1583288087281&api=v2uploading.4e448015.gif转存失败重新上传取消

经过判断,发现是zkClient最终解析到的ip地址列表为空导致的问题,但是zkClient为什么解析不了zk地址呢,带着疑惑,点开了java.net.InetAddress#getAllByName(java.lang.String)方法,签名如下:

image2020-3-4_10-17-24.png?version=1&modificationDate=1583288246599&api=v2uploading.4e448015.gif转存失败重新上传取消

映入眼帘的第一个就是该方法可能抛出UnknownHostException异常,看到这里,笔者心中已经有了个大概的推断,跟同事拿到最终执行的Jar包以及执行的命令,再次进行分析。

 

为了区分线上环境和测试环境,在启动任务时带上了spring配置文件的路径,-Dspring.xxxx=xxxx , 并且配置文件中会指定zk的链接地址,如下

image2020-3-4_10-25-15.png?version=1&modificationDate=1583288717469&api=v2uploading.4e448015.gif转存失败重新上传取消

线上的配置文件格式相同,地址不同。

hadoop属于典型的单线程多进程应用,为了让应用能在多台机器上运行,hadoop会进行jar包的分发,但是不会将配置文件一并分发过去。

Main方法只会执行一次,mapper 以及reduce分别属于不同的进程,无法获取main方法的配置

 

 

 

 

image2020-3-4_10-34-20.png?version=1&modificationDate=1583289262641&api=v2uploading.4e448015.gif转存失败重新上传取消

终结

 

未来

 

 

 

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐