一、常见疑问
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架构的简单而言,主要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操作。