配置HADOOP_HOME 指向安装目录
HBase对比MySQL的优势在哪里?
可以准确的来说HBase替换MySQL的一部分应用,这些应用当然要符合HBase的应用场景(与MySQL对比),
比如对数据量大,对线性拓展有需求,对自动化运维(负载均衡)有要求而且应用模式简单。
其业务长速度快,业务量大,造成了很多应用都是数据量庞大而且速度增长快,
因此有一些应用迫切需要一个数据库能够支撑现在的业务而降低对关系型的需求,所以使用HBase的解决方案。
一.Hbase的优点:
1.列的可以动态增加,并且列为空的情况下就不存储数据,节省空间
2.Hbase自动切分数据,使得数据存储自动具有水平scalability(可扩展性)
3.Hbase可以提供高并发读写操作的支持
二.Hbase缺点(感觉两个缺点都很致命,第一个应该可以通过自身去改进,从底层的方式去添加,
第二个缺点....1 master N slave。。。我自己理解的也不是很理解,感觉很奇怪);
1.不能支持条件查询,只支持按照Row key来查询.
2.暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉.
三.HBase的RowKey设计
首先明白Hbase是一个三维有序存储的,通过rowKey(行键)column key(column family和qualifier)
和TimeStamp(时间戳)这个三个维度可以对HBase中的数据进行快速定位。
HBase中的rowkey可以唯一标识一行记录,在HBase查询的时候,有两种方式:
1.通过get方式,指定rowkey获取唯一一条记录
2.通过scan方式,设置startRow和stopRow参数进行范围匹配
3.全表扫描,即直接扫描整张表中所有行记录
rowkey长度原则:
rowkey是一个二进制码流,可以是任意字符串,最大长度64kb,实际应用中一般为10-100bytes以 byte[] 形式保存,一般设计成定长
个人建议(*****)
建议越短越好,不要超过16个字节,原因如下;
1.数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,
光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率;
2.MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,
系统不能缓存更多的数据,这样会降低检索效率。
3.目前操作系统都是64位系统,内存8字节对齐,控制在16个字节,8字节的整数倍利用了操作系统的最佳特性。
rowkey散列原则;
如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,
建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,
以实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息,
所有的数据都会集中在一个RegionServer上,
这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率。
rowkey唯一原则;
必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的,因此,
设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,
将最近可能会被访问的数据放到一块。
四,hbase常用命令;
进入命令行 hbase shell
创建表 create 'order','info'
添加列簇 alter 'order', 'add' => 'info2'
删除列簇 alter 'order', 'delete' => 'info2'
查看表详情 describe order
插入数据
格式:put <table>,<rowkey>,<family:column>,<value>
put 'order', '000000010000000101555555', 'info:order_name', '移动硬盘'
put 'order', '000000010000000101555555', 'info:consignee_mobile', '18919848321'
put 'order', '000000010000000201555555', 'info:order_name', '洗衣机'
例子中rowkey规则:前8位为用户编写,中间8位为订单编号,再下来2位为订单状态,后面6位为随机数
根据rowKey查询某个记录
格式:get <table>,<rowkey>,[<family:column>,....]
get 'order', '000000010000000101555555'
查询所有记录
格式:scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num}
扫描所有记录
scan 'order'
扫描前2条 scan 'order', {LIMIT => 1}