所有配置文件配置好后,写了个简单的测试代码,结果问题频出。
问题一:而且导入依赖的jar包中部分标红线。重新导入模块依赖和更新项目都无法解决。
问题二:java.io.IOException: java.lang.reflect.InvocationTargetException。
测试代码只调用了几个API确保没问题,而系统代码又不会出错。因而我猜测是版本不兼容导致。去官网看了下版本兼容关系表后验证了我的猜想,把jdk版本换成了1.8,以上两个问题得以解决。
问题三:org.apache.hadoop.hbase.client.RetriesExhaustedException: Can’t get the locations。
网上查了好多方法都无法解决后怒看了一个上午的源码,虽然不能完全理解但是能看懂个大概,经过多次调试,最终的结论是:在HBase客户端对象与zookeeper集群通信,获取meta表的位置信息时,获取到的rs==null。我查看了zookeeper的文件系统。知道meta表由hadoop0104上的RegionServer维护。我猜测HBase的客户端对象在与此RegionServer通信获取meta表时出现问题。于是我想通过HBase的web界面查看hadoop0104上的RegionServer的状态,但在查看时无法访问,我在Windows的cmd中ping主机名hadoop0104后ping不通。到此我找到了问题的根源,就是在Windows的hosts文件中,没有配置ip与主机名的映射,通过主机名无法访问hadoop0104,当然就会出现org.apache.hadoop.hbase.client.RetriesExhaustedException: Can’t get the locations。修改C:\Windows\System32\drivers\etc\hosts后问题解决。
最后附上个人建议:有时问题无法解决时,在网络上盲目的寻找解决办法可能会白白浪费时间,因为每个人可能出现的问题相同,但是原因不同,别人的解决办法不一定适合你。不如深入源码细心分析,逐步具体化问题,提出猜想并加以验证,寻求解决方案,这样也会有更深刻的理解。