云HBase具有很好的在线入库和查询能力,不过在分析上面有比较大的欠缺,这篇文章主要介绍如何使用Spark对云HBase中数据做复杂分析。
1 云HBase查询分析的现状
- HBase原生API:HBase原生API适合基于row key做点查,这个是HBase最擅长的查询场景
- Phoenix:Phoenix作为HBase的SQL层,使用二级索引的技术,擅长多条件组合查询;Phoenix没有自己的计算资源,类似groupby这样的复杂查询需要借助HBase的协处理器来完成,这样一方面性能不好,同时会影响HBase集群的稳定性;
- Spark:具有丰富的算子支持复杂分析,使用Spark集群的计算资源,通过并发分析的方式可以提高性能,同时不影响HBase集群的稳定性。
2 Spark分析HBase的方式对比
Spark分析HBase数据有“RDD API”、“SQL API”、“HFILE”三种方式,相关对比如下:
方式 | 特点 | 优点 | 缺点 |
RDD API | 1、使用hadoop 社区的TableInputFormat、TableRecordReader工具类,来做split、数据scan; 2、具体API为 newAPIHadoopRDD(); | 1、spark、HIVE都集成了TableInputFormat、 TableRecordReader工具类 | 1、这种方式需要把表的所有数据全部scan到spark计算引擎做过滤、复杂计算等; 2、不支持HBase scan API中blockcache的开关以及cachesize的配置,在高并发scan大表时会影响HBase集群的稳定性 |
SQL API | 1、通过spark的sql 优化器,支持谓词下推、列裁剪、分区裁剪等优化,尽可能的把优化下推到存储端,从而提高性能; 2、 具有sql的schema到HBase column的映射,不用写复杂的类型转换; 3、支持HBase scan API中blockcache的开关以及cachesize的配置,用户可以根据场景调整,从而保证云Hbase的稳定性 | 1、充分列用HBase的存储特性,将优化下推到数据源端提高性能 | 1、使用scan API在分析大表时会增加HBase集群的load以及memory使用 |
HFILE | 1、spark直接分析表的HFILE,直读HDFS,完全不用使用HBase集群资源; 2、spark直接分析表的HFILE与Scan的方式对比,可以减少一次对HFile中数据的序列化和反序列化,提高性能; | 1、可以有效解决在高并发scan时导致HBase集群load高以及内存消耗; 2、直读HFILE有较好的性能表现 | 1、spark分析HFILE需要结合HBase的snapshot表的方式来保证分析数据的一致性 |
对于数据动态更新增加的小表推荐使用SQL API的方式,可以有效的优化分析,减少对HBase集群稳定性的影响;对于静态表或者全量静态表的分析推荐使用分析HFILE的方式直读HDFS,这样可以完全不影响HBase集群稳定性;不推荐使用RDD API 的方式,这种方式一方没有优化性能差,同时在高并发以及表数据量大时,会严重影响HBase集群的稳定性,从而影响在线业务。
3 三种方式的具体使用
云HBase团队为大家提供了一个github项目供大家参考使用上面的三种方式来开发Spark分析HBase的程序,项目地址
- 依赖项:需要下载云HBase及云Phoenix的client包
-
分析HFILE:
- 需要先开通云HBase的HDFS访问权限,参考文档
- 在hbase shell中对表生成snapshot表“snapshot 'sourceTable', ‘snapshotName'”
- 在项目中配置自己的hdfs-sit.xml文件,然后通过直读HDFS的方式分析snapshot表
-
具体的example
- RDD API对应:org.apache.spark.hbase.NativeRDDAnalyze
- SQL API对应:org.apache.spark.sql.execution.datasources.hbase.SqlAnalyze
- 分析HFILE对应:org.apache.spark.hfile.SparkAnalyzeHFILE