初学大数据方面的知识,以前没有用过,只好找博客看教程一步一步的来,自己搭的虚拟机,配置如下:
系统:CentOS6.4,主机的hostname:hadoop
IP:192.168.1.108
JDK:1.8
hadoop:1.2,伪集群
hbase:1.1,伪集群
一开始是一路顺畅,先启动hadoop,hdfs,然后启动hbase,hbase连接用zookeeper是自带的,我自己没有单独配置zookeeper,都启动完成之后使用hbase shell命令操作建表,插入数据,查询数据都是可以的,然后就开始使用hbase的java api来进行简单的操作,代码如下:
Configuration configuration = HBaseConfiguration.create();
conf.set("hbase.rootdir", "hdfs://hadoop:9000/hbase");
conf.set("hbase.zookeeper.quorum", "hadoop");
HBaseAdmin admin = new HBaseAdmin(configuration);
String tableName = "student";
if (admin.tableExists(tableName)) {
System.out.println("表已存在,将进行删除");
admin.disableTable(tableName);
admin.deleteTable(tableName);
}
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
tableDesc.addFamily(new HColumnDescriptor("name"));
admin.createTable(tableDesc);
System.out.println("表已经创建");
admin.close();
结果刚一启动就报了异常:getMaster attempt 0 of 10 failed; retrying after sleep of 1000
看看控制台吧,zookeeper的日志输出了,确实是能连接上,就是连接不上hbase,然后就是开始搜索解决方式,解决方式大体是有这么几种,如下:
1、防火墙未关闭,我虚拟机刚装好就已经把防火墙彻底关了,以防万一又查了一次,确实是关闭了,跟防火墙没有关系
2、虚拟机的host加了主机映射,但是windows本机的host文件没有添加映射,我的host文件已经加了,如下:
192.168.1.108 hadoop
通过cmd命令行ping hadoop也是可以ping通过,说明没问题
3、在hbase-site.xml配置文件中增加如下配置,然后重启hbase:
<property>
<name>hbase.master</name>
<value>hadoop:60000</value>
</property>
然后在JAVA代码的中增加
conf.set("hbase.master","hadoop:60000");
此方法失败,还是报那个异常
4、禁上用IPV6,此方法无效
然后就开始漫长的调试,重启hadoop,hbase,重启虚拟机,结果还是一样,最后我把代码打成了jar包,传到虚拟里使用java来执行,结果一下子就成功了,我是一脸懵逼的,这TM到底是怎么回事,本机能访问,外部却不能,难道是IP绑定有问题?
又通过netstat命令查询当前端口占用情况,都是在127.0.0.1下,这时候我的虚拟host配置文件如下:
::1 localhost hadoop
127.0.0.1 localhost hadoop
因为在用java操作hdfs时也是这样的配置,是能成功的,到hbase就不行了,难道hbase使得127.0.0.1时外部不能访问?然后我就尝试着把hosts文件由
::1 localhost hadoop
127.0.0.1 localhost hadoop
改为
192.168.1.108 localhost hadoop
两行变一行
然后重新启动hadoop和hbase,再通过windows执行也成功了,应该是hadoop和hbase对外暴露的方式不一样的吧,hbase如果想让外部访问就要绑定到真实的IP下,如果绑定到127.0.0.1,则只能本机访问