HBase相对Hive查询速度快的对比

  首先Hive的底层首先是MR,是属于批处理处理时间相对较长,不属于实时读写。在其架构上HBase和Hive有很大的区别.

  

  架构介绍:

  Hive架构

  –(1)用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至HiveServer。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive。

  –(2)Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

  –(3)解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。

  –(4)Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select* from tbl不会生成MapRedcue任务)。

  

  HBase 架构

  Client

  包含访问HBase的接口并维护cache来加快对HBase的访问

  Zookeeper

  保证任何时候,集群中只有一个master

  存贮所有Region的寻址入口。

  实时监控Region server的上线和下线信息。并实时通知Master

  存储HBase的schema和table元数据

  Master

  为Region server分配region

  负责Region server的负载均衡

  发现失效的Region server并重新分配其上的region

  管理用户对table的增删改操作

  RegionServer

  Region server维护region,处理对这些region的IO请求

  Region server负责切分在运行过程中变得过大的region

  Memstore 与 storefile

  一个region由多个store组成,一个store对应一个CF(列族)

  store包括位于内存中的memstore和位于磁盘的storefile写操作先写入memstore,当memstore中的数据达到某个阈值,hregionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile

  当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile

  当一个region所有storefile的大小和数量超过一定阈值后,会把当前的region分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡

  客户端检索数据,先在memstore找,找不到再找storefile

  – HBase能提供实时计算服务主要原因是由其架构和底层的数据结构决定的,即由LSM-Tree(Log-Structured Merge-Tree) +HTable(region分区) + Cache决定——客户端可以直接定位到要查数据所在的HRegion server服务器,然后直接在服务器的一个region上查找要匹配的数据,并且这些数据部分是经过cache缓存的。

  –前面说过HBase会将数据保存到内存中,在内存中的数据是有序的,如果内存空间满了,会刷写到HFile中,而在HFile中保存的内容也是有序的。当数据写入HFile后,内存中的数据会被丢弃。

  

  –多次刷写后会产生很多小文件,后台线程会合并小文件组成大文件,这样磁盘查找会限制在少数几个数据存储文件中。HBase的写入速度快是因为它其实并不是真的立即写入文件中,而是先写入内存,随后异步刷入HFile。所以在客户端看来,写入速度很快。另外,写入时候将随机写入转换成顺序写,数据写入速度也很稳定。

  –而读取速度快是因为它使用了LSM树型结构,而不是B或B+树。磁盘的顺序读取速度很快,但是相比而言,寻找磁道的速度就要慢很多。HBase的存储结构导致它需要磁盘寻道时间在可预测范围内,并且读取与所要查询的rowkey连续的任意数量的记录都不会引发额外的寻道开销。比如有5个存储文件,那么最多需要5次磁盘寻道就可以。而关系型数据库,即使有索引,也无法确定磁盘寻道次数。而且,HBase读取首先会在缓存(BlockCache)中查找,它采用了LRU(最近最少使用算法),如果缓存中没找到,会从内存中的MemStore中查找,只有这两个地方都找不到时,才会加载HFile中的内容,而上文也提到了读取HFile速度也会很快,因为节省了寻道开销。

  –如果快速查询(从磁盘读数据),hbase是根据rowkey查询的,只要能快速的定位rowkey,就能实现快速的查询,主要是以下因素:

  1、hbase是可划分成多个region,并且到达一定界限会将region横向切分

  2、键是排好序的

  3、按列存储的

  –列如:能快速找到行所在的region(分区),假设表有10亿条记录,占空间1TB,分列成了500个region,1个region占2个G.最多读取2G的记录,就能找到对应记录;

  –其次,是按列存储的,其实是列族,假设分为3个列族,每个列族就是666M,如果要查询的东西在其中1个列族上,1个列族包含1个或者多个HStoreFile,假设一个HStoreFile是128M,该列族包含5个HStoreFile在磁盘上.剩下的在内存中。

  然后,排好序了的,你要的记录有可能在最前面,也有可能在最后面,假设在中间,我们只需遍历2.5个HStoreFile共300M。

  最后,每个HStoreFile(HFile的封装),是以键值对(key-value)方式存储,只要遍历一个个数据块中的key的位置,并判断符合条件可以了。一般key是有限的长度,假设跟value是1:20(忽略HFile其他快,只需要15M就可获取的对应的记录,按照磁盘的访问100M/S,只需0.15秒。加上块缓存机制(LRU原则),会取得更高的效率。

  实时查询,可以认为是从内存中查询,一般响应时间在1秒左右。HBase的机制是将数据先写入到内存中(缓存Buffer中),当数据量达到一定的量(如128M),产生溢写磁盘操作,在内存中,是不进行数据的更新或合并操作的,只增加数据,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBaseI/O的高性能。

?

原文地址:https://www.cnblogs.com/qfdsj/p/9662819.html

时间: 2024-11-09 06:44:22

HBase相对Hive查询速度快的对比的相关文章

Hive over HBase和Hive over HDFS性能比较分析

转载至: http://lxw1234.com/archives/2015/04/101.htm   mark - 参考学习 环境配置: hadoop-2.0.0-cdh4.3.0 (4 nodes, 24G mem/node) hbase-0.94.6-cdh4.3.0 (4 nodes,maxHeapMB=9973/node) hive-0.10.0-cdh4.3.0 查询性能比较: query1: select count(1) from on_hdfs; select count(1)

Hbase和Hive之间的区别知多少?

Hive是为了简化编写MapReduce程序而生的,使用MapReduce做过数据分析的人都知道,很多分析程序除业务逻辑不同外,程序流程基本一样.在这种情况下,就需要Hive这样的用戶编程接口.Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑,就是些表的定义等,也就是表的元数据.使用SQL实现Hive是因为SQL大家都熟悉,转换成本低,类似作用的Pig就不是SQL. HBase为查询而生的,它通过组织起节点內所有机器的內存,提供一個超大的內存Hash表

Hive整合HBase——通过Hive读/写 HBase中的表

写在前面一: 本文将Hive与HBase整合在一起,使Hive可以读取HBase中的数据,让Hadoop生态系统中最为常用的两大框架互相结合,相得益彰. 写在前面二: 使用软件说明 约定所有软件的存放目录: /home/yujianxin 一.Hive整合HBase原理 Hive与HBase整合的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive-hbase-handler-0.9.0.jar工具类,如下图 Hive与HBase通信示意图 二.具体步骤 安装前说明 1.关

HAWQ与Hive查询性能对比测试

一.实验目的 本实验通过模拟一个典型的应用场景和实际数据量,测试并对比HAWQ内部表.外部表与Hive的查询性能. 二.硬件环境 1. 四台VMware虚机组成的Hadoop集群.2. 每台机器配置如下:(1)15K RPM SAS 100GB(2)Intel(R) Xeon(R) E5-2620 v2 @ 2.10GHz,双核双CPU(3)8G内存,8GSwap(4)10000Mb/s虚拟网卡 三.软件环境 1. Linux:CentOS release 6.4,核心2.6.32-358.el

hbase与hive 小结

1. 两者区别是什么? Apache Hive是一个构建在Hadoop基础设施之上的数据仓库.通过Hive可以使用HQL语言查询存放在HDFS上的数据.HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive不能够进行交互查询--因为它只能够在Haoop上批量的执行Hadoop. Apache HBase是一种Key/Value系统,它运行在HDFS之上.和Hive不一样,Hbase的能够在它的数据库上实时运行,而不是运行MapRedu

面试:Hbase和Hive的区别

区别: 1. Hive是一个构建在Hadoop基础设施之上的数据仓库,通过HQL查询存放在HDFS上的数据,不能交互查询.HBase是一种Key/Value系统,它运行在HDFS之上,可以交互查询. 2. Hive只是一种类SQL的引擎,运行MapReduce任务,不能更新数据.Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库,可以增删改查. 3. Hive表的创建类似MySQL,需要定义表和列.Hbase的schema仅仅有表格和列簇就足够了. 4. Hive适合离线分

基于Solr的HBase多条件查询测试

转自:http://www.cnblogs.com/chenz/articles/3229997.html 背景: 某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询.HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力.针对HBase的多条件查询也有多种方案,但是这些方案要么太复杂,要么效率太低,本文只对基于Solr的HBase多条件查询方案进行测试和验证. 原理: 基于Solr的HBase多条件查询原理很简单,将HBas

php+mysql预查询prepare 与普通查询的性能对比

prepare可以解决大访问量的网站给数据库服务器所带来的负载和开销,本文章通过实例向大家介绍预查询prepare与普通查询的性能对比,需要的朋友可以参考一下. 实例代码如下: <?php class timer { public $StartTime = 0; public $StopTime = 0; public $TimeSpent = 0; function start(){ $this->StartTime = microtime(); } function stop(){ $th

使用shell+awk完成Hive查询结果格式化输出

好久不写,一方面是工作原因,有些东西没发直接发,另外的也是习惯给丢了,内因所致.今天是个好日子,走起! btw,实际上这种格式化输出应该不只限于某一种需求,差不多是通用的. 需求: --基本的:当前Hive查询结果存在数据与表头无法对其的情况,不便于监控人员直接查看,或者导出到excel中,需要提供一个脚本,将查询结果处理下,便于后续的查看或者操作. --额外的:A.每次查询出来的结果字段数.字段长度不固定:B.每个数据文件中可能包含不只一套查询结果,即存在多个schema. 想法: 对于基本需