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) from on_hbase;

query2(根据key过滤)

  • select * from on_hdfs where key = ‘13400000064_1388056783_460095106148962′;
  • select * from on_hbase where key = ‘13400000064_1388056783_460095106148962′;

query3(根据value过滤)

  • select * from on_hdfs where value = ‘XXX‘;
  • select * from on_hbase where value = ‘XXX‘;

on_hdfs (20万记录,150M,TextFile on HDFS)
on_hbase(20万记录,160M,HFile on HDFS)

   

on_hdfs (2500万记录,2.7G,TextFile on HDFS)
on_hbase(2500万记录,3G,HFile on HDFS)

小结:

  • 对于全表扫描,hive_on_hbase查询时候如果不设置caching,性能远远不及hive_on_hdfs;
  • 根据rowkey过滤,hive_on_hbase性能上略好于hive_on_hdfs,特别是数据量大的时候;
  • 设置了caching之后,尽管比不设caching好很多,但还是略逊于hive_on_hdfs;

Hive over HBase原理



Hive与HBase利用两者本身对外的API来实现整合,主要是靠HBaseStorageHandler进行通信,利用 HBaseStorageHandler,Hive可以获取到Hive表对应的HBase表名,列簇以及列,InputFormat和 OutputFormat类,创建和删除HBase表等。

Hive访问HBase中表数据,实质上是通过MapReduce读取HBase表数据,其实现是在MR中,使用HiveHBaseTableInputFormat完成对HBase表的切分,获取RecordReader对象来读取数据。

对HBase表的切分原则是一个Region切分成一个Split,即表中有多少个Regions,MR中就有多少个Map;

读取HBase表数据都是通过构建Scanner,对表进行全表扫描,如果有过滤条件,则转化为Filter。当过滤条件为rowkey时,则转化为对rowkey的过滤;

Scanner通过RPC调用RegionServer的next()来获取数据;

性能瓶颈分析



1、Map Task            

  • Hive读取HBase表,通过MR,最终使用HiveHBaseTableInputFormat来读取数据,在getSplit()方法中对 HBase表进行切分,切分原则是根据该表对应的HRegion,将每一个Region作为一个InputSplit,即,该表有多少个Region,就 有多少个Map Task;
  • 每个Region的大小由参数hbase.hregion.max.filesize控制,默认10G,这样会使得每个map task处理的数据文件太大,map task性能自然很差;
  • 为HBase表预分配Region,使得每个Region的大小在合理的范围;

   下图是给该表预分配了15个Region,并且控制key均匀分布在每个Region上之后,查询的耗时对比,其本质上是Map数增加。

2. Scan RPC 调用:

  • 在Scan中的每一次next()方法都会为每一行数据生成一个单独的RPC请求, query1和query3中,全表有2500万行记录,因此要2500万次RPC请求;
  • 扫描器缓存(Scanner Caching):HBase为扫描器提供了缓存的功能,可以通过参数 hbase.client.scanner.caching 来设置;默认是1;缓存 的原理是通过设置一个缓存的行数,当客户端通过RPC请求RegionServer获取数据时,RegionServer先将数据缓存到内存,当缓存的数 据行数达到参数设置的数量时,再一起返回给客户端。这样,通过设置扫描器缓存,就可以大幅度减少客户端RPC调用RegionServer的次数;但并不 是缓存设置的越大越好,如果设置的太大,每一次RPC调用将会占用更长的时间,因为要获取更多的数据并传输到客户端,如果返回给客户端的数据超出了其堆的 大小,程序就会终止并跑出OOM异常;所以,需要为少量的RPC请求次数和客户端以及服务端的内存消耗找到平衡点。
  • rpc.metrics.next_num_ops 未设置caching, 每个RegionServer上通过next()方法调用RPC的次数峰值达到1000万:
  • 设置了caching=2000,每个RegionServer上通过next()方法调用RPC的次数峰值只有4000:
  • 设置了caching之后,几个RegionServer上的内存消耗明显增加:
  • 扫描器批量(Scanner Batch):缓存是面向行一级的操作,而批量则是面向列一级的操作。批量可以控制每一次next()操作要取回多少列。比如,在扫描器中设置setBatch(5),则一次next()返回的Result实例会包括5列。
  • RPC请求次数的计算公式如下:  RPC请求次数 = (表行数 * 每行的列数)/ Min(每行的列数,批量大小)  / 扫描器缓存

3、小结:在使用Hive over HBase,对HBase中的表做统计分析时候,需要特别注意以下几个方面

  • 对HBase表进行预分配Region,根据表的数据量估算出一个合理的Region数;
  • rowkey设计上需要注意,尽量使rowkey均匀分布在预分配的N个Region上;
  • 通过set hbase.client.scanner.caching设置合理的扫描器缓存;
  • 关闭mapreduce的推测执行:
  1. set mapred.map.tasks.speculative.execution = false;
  2. set mapred.reduce.tasks.speculative.execution = false;
时间: 2024-12-16 14:33:46

Hive over HBase和Hive over HDFS性能比较分析的相关文章

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.关

hadoop三----基于hadoop伪分布式整合hive和hbase

hadoop的生态圈: ETL 数据的抽取.转换.加载 1)安装hive 1.解压   # tar zvxf hive-0.13.0.tar.gz -C /usr/local   # cd /usr/local   # ln -sv  /usr/local/hive-0.12.0 /usr/local/hive 2.替换jar包,保持hbase0.98与hadoop1.2一致   # cd /usr/hive/lib   # rm -rf hbase-0.94*   # find /usr/hb

Hive与Hbase关系整合

近期工作用到了Hive与Hbase的关系整合,虽然从网上参考了很多的资料,但是大多数讲的都不是很细,于是决定将这块知识点好好总结一下供大家分享,共同掌握! 本篇文章在具体介绍Hive与Hbase整合之前,先给大家用一个流程图介绍Hadoop业务的开发流程以及Hive与Hbase的整合在业务当中的必要性.  其中在数据存入hbase—>Hive对数据进行统计分析的这个步骤中就涉及到了Hive与Hbase的整合,所以了解Hive与Hbase的整合是很有必要的. 1.Hive与Hbase整合的必要性 

Hive On HBase实战

1.概述 HBase是一款非关系型.分布式的KV存储数据库.用来存储海量的数据,用于键值对操作.目前HBase是原生是不包含SQL操作,虽然说Apache Phoenix可以用来操作HBase表,但是需要集成对应的Phoenix依赖包到HBase集群中,同时需要编写对应的Schema才能实现SQL操作HBase. 本篇博客,笔者将为大家介绍另一位一种SQL方式来操作HBase,那就是Hive. 2.内容 2.1 使用场景 熟悉大数据的同学应该都知道,Hive是一个分布式的数据仓库,它能够将海量数

sqoop命令,mysql导入到hdfs、hbase、hive

1.测试MySQL连接 bin/sqoop list-databases --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username 'mysql' --password '111111' 2.检验SQL语句 bin/sqoop eval --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username 'mysql' --password '111111' --quer

Hive(五):hive与hbase整合

配置 hive 与 hbase 整合的目的是利用 HQL 语法实现对 hbase 数据库的增删改查操作,基本原理就是利用两者本身对外的API接口互相进行通信,两者通信主要是依靠hive_hbase-handler.jar工具类. 但请注意:使用Hive操作HBase中的表,只是提供了便捷性,前面章节已经介绍,hiveQL引擎使用的是MapReduce,对于性能上,表现比较糟糕,在实际应用过程中可针对不同的场景酌情使用. 注意:本文介绍的内容适用的版本见我前面章节,HDP2.4.2 ( HBase

hive 与 hbase 结合

一.hive与hbase的结合Hive会经常和Hbase结合使用,把Hbase作为Hive的存储路径,所以Hive整合Hbase尤其重要.使用Hive读取Hbase中的数据,可以使用HQL语句在HBase表上进行查询.插入操作:甚至是进行Join和Union等复杂查询.此功能是从Hive 0.6.0开始引入的.Hive与HBase整合的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive-hbase-handler-*.jar工具里面的类实现的.使用Hive操作HBase中

hadoop、hive、hbase的理解

hadoop是一个分布式计算+分布式文件系统,前者其实就是MapReduce,后者是HDFS.后者可以独立运行,前者可以选择性使用,也可以不使用. hive是一个构建在Hadoop基础设施之上的数据仓库. hbase是一种Key/Value系统,它运行在HDFS之上,是一个分布式的.面向列的开源数据库. 特点: hive把数据文件加载进来作为一个hive表(或者外部表),它支持类似sql语句的功能,你可以通过该语句完成分布式环境下的计算功能,hive会把语句转换成MapReduce,然后交给ha

HBase 与Hive数据交互整合过程详解

Hive和Hbase整合理论 1.为什么hive要和hbase整合 2.整合的优缺点 优点: (1).Hive方便地提供了Hive QL的接口来简化MapReduce的使用, 而HBase提供了低延迟的数据库访问.如果两者结合,可以利 用MapReduce的优势针对HBase存储的大量内容进行离线的计算和分析. (2).操作方便,hive提供了大量系统功能 缺点: 性能的损失,hive有这样的功能, 他支持通过类似sql语句的语法来操作hbase 中的数据, 但是速度慢. 3.整合需要做什么样的