一、常见疑问

1、为什么Hbase可以存取大数据,且存取各种快,还要使用慢的离线分析?

答:因为Hbase查询模式局限,不适合复杂查询(只能按照keyrows查询),不支持join,等。但是离线数据分析多是多个表复杂的逻辑,join等。

从技术上来说, HBase 更像是“Data Store(数据存储)”多于“Data Base(数据库)”,因为 HBase 缺少很多 RDBMS 的特性,如列类型、第二索引、触发器、高级查询语言等。

2、列存储和行存储的区别是什么?有什么特点?

列存储:按照每列的数据在磁盘上依次存储,相邻磁道上是逐列的信息。

行存储:逐行的字段在磁盘上存储,相邻磁道上是逐行的信息。

对于查询操作来言,select *的场景,两者的查询速率是一样的。但是select场景,一般select的是某几列,这个时候列存储的磁头就不用跳转,可以连续读取,读取的速度就比较快。

3、OLAP和OLTP的差异?

简单来言,OLAP场景为多读多写,小数量级;OLTP场景为一写多读,大数量级的场景。

OLAP(On-Line Analytical Processing)即联机分析处理,是数据仓库系统的主要应用,

OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。

二、Hbase和其他大数据的联系与区别

1、Hbase与关系型数据库

HBase和一般的关系型数据库同属于数据存储系统,那么它们有什么不同呢?

HBase无模式,它不具有固定列模式的概念;仅定义列族。 RDBMS有它的模式,描述表的整体结构的约束。
RDBMS是事务性的。没有任何事务存在于HBase
RDBMS具有规范化的数据。HBase存储反规范化的数据。
RDBMS用于结构化数据非常好。HBase用于半结构以及结构化数据是非常好的。

2、Hbase与hive

Hbase和hive都是架构在Hadoop之上的,它们有什么差一点呢?

Hbase和hive在本质上就是不同的,hive发挥的类似“工具”的功能,为了降低mapperReduce的开发学习成本而存在,将类sql语句转化为mapper任务的引擎。但是Hbase是KV数据存储数据库。

Hive适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。

Hbase非常适合用来进行大数据的实时查询。Facebook用Hbase进行消息和实时的分析。它也可以用来统计Facebook的连接数。

3、Hbase与hdfs

Hbase和hdfs都适合于大容量数据的存储,它们分别有什么特性呢?

HDFS是适于存储大容量文件的分布式文件系统。 HBase是建立在HDFS之上的数据库。
HDFS不支持快速单独记录查找。 HBase提供在较大的表快速查找
它提供了高延迟批量处理;没有批处理概念。 它提供了数十亿条记录低延迟访问单个行记录(随机存取)。
它提供的数据只能顺序访问。 HBase内部使用哈希表和提供随机接入,并且其存储索引,可将在HDFS文件中的数据进行快速查找。

三、Hbase的架构

hbase 查询速度 hbase为什么查询速度快_大数据


Hbase架构的简单而言,主要4部分组成,Client、Zookeeper、Hmaster、HRegionServer。

Client

整个HBase集群的入口,使用HBase RPC机制与HMaster和HRegionserver通信,与HMaster通信进行管理类的操作,与HRegionserver通信进行读写类操作。

Zookeeper

保证任何时候,集群中只有一个running master,Master与RegionServers启动时会向ZooKeeper注册,Zookeeper实时监控RegionServer 的状态,将Regionserver 的上线和下线信息,实时通知给Master。存储Hbase的schema和table元数据。

Master

管理用户对Table的增删改查操作;
    负责regionserver的负载均衡,调整region分布;
    在RegionServer停机后,负责失效Regionserver上region的重新分配;
  HMaster失效仅会导致所有元数据无法修改,表数据读写还是可以正常运行。

Region Server

Regionserver维护region,处理对这些region的IO请求。

总结

由上图可以看出,client 访问hbase上数据的过程并不需要master 参与,寻址访问先zookeeper再regionserver,数据读写访问regioneserver。

    HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。

根据上面架构,通俗来讲,各个组件如何协调实现首次读写的工作呢?

client从ZooKeeper中得到保存META table的Region server的信息。
client向该Region server查询负责管理自己想要访问的row key的所在的region的Region server的地址。客户会缓存这一信息以及META table所在位置的信息。
client与负责其row所在region的Region Server通信,实现对该行的读写操作。

四、Hbase的数据模型操作

Hbase提供多种java API,以方便对Hbase的数据模型进行操作。

1、建立连接

在Hbase进行数据操作之前,首先要与HBase建立连接,这个和使用JDBC与关系型数据库的原理类似,不同的是JDBC需要的是部署关系数据库的ip和端口号,而Hbase需要的是zookeeper的地址和端口号。那么,具体怎么建立连接呢?

实例化Hbase配置对象,将zk的地址和端口号写入config

Configuration config = HBaseConfiguration.create();
 config.set(“hbase.zookeeper.quorum”,hbaseZk);
 config.set(“hbase.zookeeper.property.clientPort”,hbaseZkPort);

通过配置,创建连接
Connection connection = ConnectionFactory.createConnection(config);
至此,则与Hbase建立起连接,其中hbaseZk是zk的地址,hbaseZkPort是zk的端口号。

2、新建表
实例化HBaseAdmin,以管理表信息
HBaseAdmin admin = new HBaseAdmin(connection);
实例化HTableDescriptor,指定表名

HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);

新增表的列族

tableDescriptor.addFamily(new HColumnDescriptor(“cfa”));
tableDescriptor.addFamily(new HColumnDescriptor("cfb"));

通过admin执行表的创建

admin.createTable(tableDescriptor);

但是有的表的创建会包含其他参数,详情见下面的实例说明。

3、获取数据

实例化获取类,且传入row值
Get get = new Get(rowkey); 后面可以通过,get.addFamily指定列族,或者get.addColumn指定列族下的列。

获取表

Table hTable = hBaseConnection.getTable(TableName)

获取结果

Result result =hTable.get(get);

获取的结果为result格式,可以根据自己的需要,转化为对应的格式。

4、删除数据

实例化删除类,传入row值

Delete del = new Delete(rowkey);

获取表

Table hTable = hBaseConnection.getTable(TableName)

删除数据

hTbale.delete(del);

删除的时候,也可以通过delete的方法根据自己的需要指定删除的列族或者列。

5、新增数据

实例化新增类,传入row值

Put put = new Put(rowkey);

获取表

Table hTable = hBaseConnection.getTable(TableName)

新增数据

hTbale.put(put)

新增的时候,也可以通过delete的方法根据自己的需要指定新增的列族或者列

更新也是使用put类,可以指定更新的列或者列族的值来执行更新。

疑问

Scan类也可用于查询,它和get有什么区别?

答:get和scan是hbase中访问数据最基本的两个操作。get访问一个指定key的数据,而scan可以设置begin和end来访问一个范围内所有的数据。

而通过查看相关代码,原来get操作就是一种特殊的scan,begin和end相同的scan操作。