hbase,Hbase和传统数据库的区别

时尚网,时尚女装,时尚杂志

Hbase和传统数据库的区别

HBase与传统关系数据库的区别?

答:主要体现在以下几个方面:1.数据类型。关系数据库采用关系模型,具有丰富的数据类型和储存方式。HBase则采用了更加简单的数据模型,它把数据储存为未经解释的字符串,用户可以把不同格式的结构化数据和非结构化数据都序列化成字符串保存到HBase中,用户需要自己编写程序把字符串解析成不同的数据类型。

2.数据操作。关系数据库中包含了丰富的操作,如插入、删除、更新、查询等,其中会涉及复杂的多表连接,通常是借助多个表之间的主外键关联来实现的。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表与表之间的关系,通常只采用单表的主键查询,所以它无法实现像关系数据库中那样的表与表之间的连接操作。

3.存储模式。关系数据库是基于行模式存储的,元祖或行会被连续地存储在磁盘页中。在读取数据时,需要顺序扫描每个元组,然后从中筛选出查询所需要的属性。如果每个元组只有少量属性的值对于查询是有用的,那么基于行模式存储就会浪费许多磁盘空间和内存带宽。HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的,它的优点是:可以降低I/O开销,支持大量并发用户查询,因为仅需要处理可以回答这些查询的列,而不是处理与查询无关的大量数据行;同一个列族中的数据会被一起进行压缩,由于同一列族内的数据相似度较高,因此可以获得较高的数据压缩比。

4.数据索引。关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。与关系数据库不同的是,HBase只有一个索引——行键,通过巧妙的设计,HBase中所有访问方法,或者通过行键访问,或者通过行键扫描,从而使整个系统不会慢下来。由于HBase位于Hadoop框架之上,因此可以使用Hadoop MapReduce来快速、高效地生成索引表。

6.数据维护。在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍旧保留。

7.可伸缩性。关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,因此能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩。

但是,相对于关系数据库来说,HBase也有自身的局限性,如HBase不支持事务,因此无法实现跨行的原子性。

注:本来也想来问这个问题,然后复制一下的。结果找不到,只好自己手打了,麻烦复制拿去用的同学点下赞呗。

hbase2.0强制删除一张表

由于内网测试环境hbase并没有安装“SNAPPY”压缩,而建表时执行了

alter 'TrojanInfo', {NAME => 'i', COMPRESSION => 'SNAPPY'}

强制删除表:

1、强制删除该表在hdfs上的所有文件(路径根据实际情况而定):

./hadoop fs -rmr /hbase/TrojanInfo

2、删除该表在HBase系统表.META.中的记录:

A、首先从.META.中查询出表 TrojanInfo在.META.中的rowkey,这可以通过scan '.META.',然后手动筛选;

B、然后删除该rowkey下的3个字段(假设查询出的rowkey为TrojanInfo,,1361433390076.2636b5a2b3d3d08f23d2af9582f29bd8.)

delete 'TrojanInfo','TrojanInfo,,1361433390076.2636b5a2b3d3d08f23d2af9582f29bd8.','info:server'

delete 'TrojanInfo','TrojanInfo,,1361433390076.2636b5a2b3d3d08f23d2af9582f29bd8.','info:serverstartcode'

delete 'TrojanInfo','TrojanInfo,,1361433390076.2636b5a2b3d3d08f23d2af9582f29bd8.','info:regioninfo'

C、重启hbase即可删除表 TrojanInfo

HBase来自谁的论文

Apache HBase? is the Hadoop database, a distributed, scalable, big data store. --来自Apache HBase官网 HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop 项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。 --来自百度百科

hbase预分区与region切割的关系

一张表预分区N个,那就是一开始就设定了N个region;

hbase.hregion.max.filesize 设定的region大小,超过了就会split,就会增加一个region,对预分区没什么影响。

一张表假如不预分区,那么数据超过region最大值才会拆分,比如你1天10G数据,设定5G才split,两天内写数据都写在一个region里,没有分布式效果,改region就是热点。

预设分区一般配合rowkey设计解决热点,例如预分区5个,rowkey可设置前最A、B、C、D、E,程序里面随机的加其中的一个前缀,那么就会随机插入到各个region中,但是一般又会和业务系统需求有些矛盾。例如rowkey按时间戳字符串加盐,那么就只有一各个region scan再合起来统计会比较快,直接scan “A20181111”到“D20181128”很慢很麻,还有按用户ID、手机号等等做rowkey加盐或者hash散列可能都会在设计上有热点和业务需求的矛盾点。

java api操作hbase存储数据为16进制如何设置存储为正常数值

一般情况下,我们使用Linux的shell命令,就可以非常轻松的操作Hbase,例如一些建表,建列簇,插值,显示所有表,统计数量等等,但有时为了提高灵活性,我们也需要使用编程语言来操作Hbase,当然Hbase通过Thrift接口提供了对大多数主流编程语言的支持,例如C++,PHP,Python,Ruby等等,那么本篇,散仙给出的例子是基于Java原生的API操作Hbase,相比其他的一些编程语言,使用Java操作Hbase,会更加高效一些,因为Hbase本身就是使用Java语言编写的。转载

下面,散仙给出源码,以供参考:

package com.hbase;

import java.util.ArrayList;

import java.util.List;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.HColumnDescriptor;

import org.apache.hadoop.hbase.HTableDescriptor;

import org.apache.hadoop.hbase.KeyValue;

import org.apache.hadoop.hbase.client.Delete;

import org.apache.hadoop.hbase.client.Get;

import org.apache.hadoop.hbase.client.HBaseAdmin;

import org.apache.hadoop.hbase.client.HTable;

import org.apache.hadoop.hbase.client.Put;

import org.apache.hadoop.hbase.client.Result;

import org.apache.hadoop.hbase.client.ResultScanner;

import org.apache.hadoop.hbase.client.Scan;

import org.apache.hadoop.hbase.util.Bytes;

/**

* @author 三劫散仙

*

* **/

public class Test {

static Configuration conf=null;

static{

conf=HBaseConfiguration.create();//hbase的配置信息

conf.set("hbase.zookeeper.quorum", "10.2.143.5"); //zookeeper的地址

}

public static void main(String[] args)throws Exception {

Test t=new Test();

//t.createTable("temp", new String[]{"name","age"});

//t.insertRow("temp", "2", "age", "myage", "100");

// t.getOneDataByRowKey("temp", "2");

t.showAll("temp");

}

/***

* 创建一张表

* 并指定列簇

* */

public void createTable(String tableName,String cols[])throws Exception{

HBaseAdmin admin=new HBaseAdmin(conf);//客户端管理工具类

if(admin.tableExists(tableName)){

System.out.println("此表已经存在.......");

}else{

HTableDescriptor table=new HTableDescriptor(tableName);

for(String c:cols){

HColumnDescriptor col=new HColumnDescriptor(c);//列簇名

table.addFamily(col);//添加到此表中

}

admin.createTable(table);//创建一个表

admin.close();

System.out.println("创建表成功!");

}

}

/**

* 添加数据,

* 建议使用批量添加

* @param tableName 表名

* @param row 行号

* @param columnFamily 列簇

* @param column 列

* @param value 具体的值

*

* **/

public void insertRow(String tableName, String row,

String columnFamily, String column, String value) throws Exception {

HTable table = new HTable(conf, tableName);

Put put = new Put(Bytes.toBytes(row));

// 参数出分别:列族、列、值

put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column),

Bytes.toBytes(value));

table.put(put);

table.close();//关闭

System.out.println("插入一条数据成功!");

}

/**

* 删除一条数据

* @param tableName 表名

* @param row rowkey

* **/

public void deleteByRow(String tableName,String rowkey)throws Exception{

HTable h=new HTable(conf, tableName);

Delete d=new Delete(Bytes.toBytes(rowkey));

h.delete(d);//删除一条数据

h.close();

}

/**

* 删除多条数据

* @param tableName 表名

* @param row rowkey

* **/

public void deleteByRow(String tableName,String rowkey[])throws Exception{

HTable h=new HTable(conf, tableName);

List<Delete> list=new ArrayList<Delete>();

for(String k:rowkey){

Delete d=new Delete(Bytes.toBytes(k));

list.add(d);

}

h.delete(list);//删除

h.close();//释放资源

}

/**

* 得到一条数据

*

* @param tableName 表名

* @param rowkey 行号

* ***/

public void getOneDataByRowKey(String tableName,String rowkey)throws Exception{

HTable h=new HTable(conf, tableName);

Get g=new Get(Bytes.toBytes(rowkey));

Result r=h.get(g);

for(KeyValue k:r.raw()){

System.out.println("行号: "+Bytes.toStringBinary(k.getRow()));

System.out.println("时间戳: "+k.getTimestamp());

System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily()));

System.out.println("列: "+Bytes.toStringBinary(k.getQualifier()));

//if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){

// System.out.println("值: "+Bytes.toInt(k.getValue()));

//}else{

String ss= Bytes.toString(k.getValue());

System.out.println("值: "+ss);

//}

}

h.close();

}

/**

* 扫描所有数据或特定数据

* @param tableName

* **/

public void showAll(String tableName)throws Exception{

HTable h=new HTable(conf, tableName);

Scan scan=new Scan();

//扫描特定区间

//Scan scan=new Scan(Bytes.toBytes("开始行号"),Bytes.toBytes("结束行号"));

ResultScanner scanner=h.getScanner(scan);

for(Result r:scanner){

System.out.println("==================================");

for(KeyValue k:r.raw()){

System.out.println("行号: "+Bytes.toStringBinary(k.getRow()));

System.out.println("时间戳: "+k.getTimestamp());

System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily()));

System.out.println("列: "+Bytes.toStringBinary(k.getQualifier()));

//if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){

// System.out.println("值: "+Bytes.toInt(k.getValue()));

//}else{

String ss= Bytes.toString(k.getValue());

System.out.println("值: "+ss);

//}

}

}

h.close();

}

}

Hbase与HDFS是什么关系?

HDFS是GFS的一种实现,他的完整名字是分布式文件系统,类似于FAT32,NTFS,是一种文件格式,是底层的,Hadoop HDFS为HBase提供了高可靠性的底层存储支持。

HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统。

扩展资料

Hadoop 中各模块的作用:

1、Hadoop HDFS为HBase提供了高可靠性的底层存储支持。

2、Hadoop MapReduce为HBase提供了高性能的计算能力。

3、Zookeeper为HBase提供了稳定服务和failover机制。

4、Pig和Hive还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的非常简单。

5、Sqoop则为HBase提供了方便的RDBMS(关系型数据库)数据导入功能,使得传统数据库数据向HBase中迁移变的非常方便。

参考资料:百度百科-HBase

>>>>全文在线阅读<<<<

标签: 区别 传统

相关阅读