前几篇文章讲述了 hbase的安装、hbase命令和api的使用、hbase简单的优化技巧,《hbase入门篇4》这篇文章是讲述把hbase的数据放在hdfs上的点滴过程。目前对与hbase我是一个绝对的新手,如果在文章中有任何我理解有错误的地方请各位指正,谢谢。 ok,进行正题
前几篇文章讲述了 hbase的安装、hbase命令和api的使用、hbase简单的优化技巧,《hbase入门篇4》这篇文章是讲述把hbase的数据放在hdfs上的点滴过程。目前对与hbase我是一个绝对的新手,如果在文章中有任何我理解有错误的地方请各位指正,谢谢。
ok,进行正题 ………
在hbase中创建的一张表可以分布在多个hregion,也就说一张表可以被拆分成多块,每一块称我们呼为一个hregion。每个hregion会保 存一个表里面某段连续的数据,用户创建的那个大表中的每个hregion块是由hregion服务器提供维护,访问hregion块是要通过 hregion服务器,而一个hregion块对应一个hregion服务器,一张完整的表可以保存在多个hregion 上。hregion server 与region的对应关系是一对多的关系。每一个hregion在物理上会被分为三个部分:hmemcache(缓存)、hlog(日志)、hstore(持久层)。
上述这些关系在我脑海中的样子,如图所示:
1.hregionserver、hregion、hmemcache、hlog、hstore之间的关系,如图所示:
2.hbase表中的数据与hregionserver的分布关系,如图所示:
hbase读数据
hbase读取数据优先读取hmemcache中的内容,如果未取到再去读取hstore中的数据,提高数据读取的性能。
hbase写数据
hbase写入数据会写到hmemcache和hlog中,hmemcache建立缓存,hlog同步hmemcache和hstore的事务日志,发起flush cache时,数据持久化到hstore中,并清空hmemecache。
客户端访问这些数据的时候通过hmaster ,每个 hregion 服务器都会和hmaster 服务器保持一个长连接,hmaster 是hbase分布式系统中的管理者,他的主要任务就是要告诉每个hregion 服务器它要维护哪些hregion。用户的这些都数据可以保存在hadoop 分布式文件系统上。 如果主服务器hmaster死机,那么整个系统都会无效。下面我会考虑如何解决hmaster的spfo的问题,这个问题有点类似hadoop的spfo 问题一样只有一个namenode维护全局的datanode,hdfs一旦死机全部挂了,也有人说采用heartbeat来解决这个问题,但我总想找出 其他的解决方案,多点时间,总有办法的。
昨天在hadoop-0.21.0、hbase-0.20.6的环境中折腾了很久,一直报错,错误信息如下:
exception in thread main java.io.ioexception: call to localhost/serv6:9000 failed on local exception: java.io.eofexception
10/11/10 15:34:34 error master.hmaster: can not start master
java.lang.reflect.invocationtargetexception
at sun.reflect.nativeconstructoraccessorimpl.newinstance0(native method)
at sun.reflect.nativeconstructoraccessorimpl.newinstance(nativeconstructoraccessorimpl.java:39)
at sun.reflect.delegatingconstructoraccessorimpl.newinstance(delegatingconstructoraccessorimpl.java:27)
at java.lang.reflect.constructor.newinstance(constructor.java:513)
at org.apache.hadoop.hbase.master.hmaster.domain(hmaster.java:1233)
at org.apache.hadoop.hbase.master.hmaster.main(hmaster.java:1274)
死活连接不上hdfs,也无法连接hmaster,郁闷啊。
我想想啊,慢慢想,我眼前一亮 java.io.eofexception 这个异常,是不是有可能是rpc 协定格式不一致导致的?也就是说服务器端和客户端的版本不一致的问题?换了一个hdfs的服务器端以后,一切都好了,果然是版本的问题,最后采用 hadoop-0.20.2 搭配hbase-0.20.6 比较稳当。
最后的效果如图所示:
查看大图请点击这里, 上图的一些文字说明:
1.hadoop版本是0.20.2 ,
2.hbase版本是0.20.6,
3.在hbase中创建了一张表 tab1,退出hbase shell环境,
4.用hadoop命令查看,文件系统中的文件果然多了一个刚刚创建的tab1目录,
以上这张图片说明hbase在分布式文件系统apache hdfs中运行了。
相关文章:
hbase入门6 -白话mysql(rdbms)与hbase之间
lily-建立在hbase上的分布式搜索
mysql向hive/hbase的迁移工具
hbase入门5(集群) -压力分载与失效转发
hive入门3–hive与hbase的整合
hbase入门篇4
hbase入门篇3
hbase入门篇2-java操作hbase例子
hbase入门篇
基于hbase存储的分布式消息(im)系统-jabase
–end–