使用场景
熟悉大数据的同学应该都知道,Hive是一个分布式的数据仓库,它能够将海量数据,结构化存储到HDFS上,然后通过SQL的方式对这些海量数据进行业务处理。而且,Hive学习成本很低,熟悉SQL的同学,很快就能编写一个Hive应用程序。
我们通过Hive把数据加载到HBase表中时,数据源可以是文件,也可以是表。当HBase集群集成Hive后,如果对Hive表追加数据的同时,HBase表中的数据也会增加。在原生的HBase集群中,HBase表不支持连接查询或是分组查询等,但是我们可以通过Hive On HBase的方式来让HBase集群支持这些功能。比如,事先将数据加载到Hive表中,然后通过Hive SQL的JOIN、GROUP BY等语法来操作。
参考这:
https://www.cnblogs.com/smartloli/p/11747324.html
原理
Point 4: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性能自然很差;
参考:https://blog.csdn.net/joeyon1985/article/details/78356588