日期:2014-05-17  浏览次数:20844 次

Windows下访问VM中HBase
资源所限,只能先在本机上模拟hadoop集群。(见文章:http://blackwing.iteye.com/admin/blogs/1502476)

开动之前,需要启动hadoop,并且创建好一个hbase目录:

hadoop fs -mkdir hbase


这样就能在hadoop中开辟一个hbase存放数据的地方。

可以通过命令
hadoop fs -ls /


查看到刚才创建的目录。

hbase的主要配置文件:

1. hbase-site.xml
<configuration>
  <property>
    <name>hbase.rootdir</name>
   <value>hdfs://namenode.blackwing.com:8020/hbase/</value>
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>namenode.blackwing.com</value>
  </property>
</configuration>

其中的fs.default.name,指向hadoop的namenode所在uri。当然,后面的/hbase是我们希望在hdfs的哪个路径下保存数据。fs.default.name需要跟hadoop中的fs.default.name配置一样。也就是说这部分要一样:
hdfs://namenode.blackwing.com:8020/


zookeeper的集群列表:hbase.zookeeper.quorum,因为要对外,所以这里不能填localhost。

2. hbase和hadoop都配置好后,需要在程序中进行访问地址设置:

public InsertData(String tableName)
	{
		rowList = new ArrayList<Row>();
		this.conf = HBaseConfiguration.create();
		this.conf.set("hbase.zookeeper.quorum","192.168.128.140");
		System.out.println("hbase.master = "+conf.get("hbase.master"));
		System.out.println("hbase.zookeeper.quorum = "+conf.get("hbase.zookeeper.quorum"));
		
		try {
			this.table=new HTable(this.conf,tableName.getBytes());
		} catch (IOException e) {
			e.printStackTrace();
			logger.info("errors occur while creating table : "+tableName);
		}
	}


其中的192.168.128.140,就是hbase中zookeeper的运行地址,因为zookeeper会根据.META.和ROOT得到hbase的所在等信息,所以只需设置hbase.zookeeper.quorum程序就能工作。

当然,也可以把hbase-site.xml拷贝到项目的src目录下,在HBaseConfiguration.create()的时候,程序会自动读取src下的hbase-site.xml。

3. 一些莫名其妙的小问题集合

1)windows能ping通虚拟机,但不能访问虚拟机hbase,或者打不开hbase的web界面。
原因:因为linux的防火墙缘故,暴力点的解决办法是chkconfig iptables off。而最好是修改/etc/sysconfig/iptables添加允许访问的规则。

2)jps时,发现少了某个(某些)进程,例如本应该有tasktracker好datanode进程的,却只有datanode。

先检查hadoop中slaves中是否正确列出主机名,一行一个。
我遇到这个问题,是因为hadoop的fs.default.name设置成了跟hbase的hbase.rootdir一样了,也就是:

hdfs://namenode.blackwing.com:8020/hbase/

正确来说,hadoop中的配置应该是这样的:
hdfs://namenode.blackwing.com:8020/



3)在windows下,eclipse后台输出显示连接不到namenode
原因:很大程度上是因为windows中没写host。解决办法是在:
C:\WINDOWS\system32\drivers\etc\hosts

中,添加vm中3台机器的ip及名称:
192.168.128.140 namenode.blackwing.com
192.168.128.136 jobtracker.blackwing.com
192.168.128.141 datanode.blackwing.com


PS:为了确定hbase的数据是否真的保存到hadoop中,可以通过:
hadoop fs -ls /hbase

查看到在通过hbase创建的表,都会在hadoop的hbase目录下生成对应文件夹。