背景介绍
(一)课程预览
What?
基于HBase存储的应用数据,构建一套大数据处理框架, 使用不同方式对HBase数据进行分析。
Why?
HBase作为开源分布式数据库,具备高性能,高可用,海量无限扩展的特点。然而HBase查询接口较简单,无法满足数据分析的需求,但HBase具有丰富数据生态,可以结合大量开源的组件对HBase进行数据分析。
Who?
大数据开发,希望了解HBase数据分析及大数据生态的用户。
How?
本课程将从原理到代码编写,手把手教用户构建基于HBase的大数据分析系统。
(二)HBase数据访问概览
下面介绍一下HBase的数据访问方式,上方为整体架构图。
HBase的访问方式主要有三种。第一种是通过API访问,主要是 Put/Get/Scan这三个接口。对数据过滤、聚合等稍微复杂一点的需求,可以用“filter+coprocessor”的方式结合API来处理。
第二种是通过HFile Reader/Writer。因为HBase是存储计算分离的架构,它的数据文件存在HDFS上,可以直接用HBase提供的HFile Reader/Writer来读写HBase上的数据文件,然后通过Bulkload到HBase表中。
第三种是通过MapReduce框架封装,它提供了几个常用的工具类,API封装是TableInputFormat和 TableOutputFormat。因为框架需要切分任务,它底层会按照HBase表的分区来自动为每个分区并发带来访问数据,HFile的封装也是一样的。
(三)准备工作
1. 购买HBase实例
·购买Lindorm单机版
·Lindorm控制台 -> 实例详情 -> 访问控制 -> 添加开发服务器IP到白名单
2. 配置客户端
·Lindorm控制台 -> 数据库连 接 -> 宽表引擎 -> Lindorm shell下载
·从控制台数据库链接页面,获取到hbase-site.xml配置
3. 配置开发环境
·下载安装IDE开发环境
·安装配置好Java环境
注:详细操作步骤和代码,请下载Demo工程。
在线交互式分析
下面进行HBase数据在线交互系统分析,这里的在线交互分析是指在移动HBase数据的场景下,直接对数据进行访问与分析。
(一)在线分析HBase数据 - Spark
1. Spark + HBase 架构
首先可以用“Spark+HBase”架构。
Spark是一个专门为大规模数据处理而设计的快速通用计算引擎。如上图所示,它上面有Spark RDD与Spark SQL这些引擎可以使用。
Spark连接HBase的方式有两种,一种是通过HBaseClient直接访问HBase。第二种是Spark引入HBase Connector之后,通过Spark SQL/Spark RDD就可以直接操作这个数据。
2.流程概览
·准备Spark
下载安装Spark
·开发
1)配置开发环境
2)下载demo工程
3)开发Spark作业
·打包运行
1)打包项目
2)提交Spark作业
3. HadoopRDD – InputFormat
首先看HadoopRDD的方式,上方为一个样例的代码。
依赖HBase客户端,底层用TableInputFormat,底层Spark作业会自动把任务切分成Region的并发,然后对每个Region计算,然后获取最终结果。
4. Spark Connector - SparkSQL
第二种是用SparkSQL访问HBase。SparkSQL依赖Spark Hbase Connector,像这个代码里面会直接建一张Spark的 表,表建好之后,就可以执行一些SQL去访问HBase的数据。
5. 直接使用HBase客户端读写数据
除了上述方式,也可以直接使用HBase客户端读写数据。
(二)在线分析HBase数据 - Hive
1. Hive + HBase 架构
Hive是一个基于Hadoop的数据仓库工具,用来对大规模数据进行处理。它也提供了SQL的查询功能,底层是将对应的SQL转换成MapReduce的任务来执行,所以它会依赖于关系型数据库作为MetaStore。
把整个架构搭起来之后,就可以通过SQL来执行HBase的数据分析。
2.准备工作
·安装Hadoop
1)下载安装Hadoop
2)设置环境变量
3)配置Hadoop
4)启动hdfs和yarn
5)验证
·安装MySQL
1)安装MySql
2)准备好Hive使用MySql用户和数据
·安装配置Hive
1)下载安装Hive
2)配置Hive
3)添加和替换hbase依赖
4)添加Hbase配置
5)验证
3.操作过程
1)建HBase外表:
CREATE EXTERNAL TABLE hbase_hive_table (key int, value string) STORED BY ‘org.apache.hadoop.hive. hbase.HBaseStorageHandler’ WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key,cf1:val”) TBLPROPERTIES (“hbase.table.name” = “hbase_hive_table”, “hbase.mapred.output.outputtable” = “hbase_hive_table”);
2)SQL查询:
select count(*) from hbase_hive_table ;
4.在线分析的弊端
弊端一:影响在线
占用HBase在线服务资源 影响应用对HBase的正常访问。
弊端二:存储格式 相对列存,HBase存储格式对分析不友好,分析性能差。 弊端三:数据变化
分析过程中,数据一直在变化。
离线及流式分析
除了在线分析,还有另外两种方式,分别是离线以及流式分析。
(一)HBase数据离线处理分析
1.完整步骤
首先使用LTS (Lindorm Tunnel Service)将Hbase数据全量导出到HDFS,存储为Parquet格式,接着开发Spark作业分析导出的Parquet文件数据。
2. 全量导出到HDFS - Parquet格式
在HDFS页面上可以直接创建一个任务,然后从某一个集群把某一张表数据全量导出到一个目标的HDFS上面,格式默认为Parquet。
参考文档:https://help.aliyun.com/document_detail/156428.html#title-ofz-4ah-45z
3. 使用Spark分析Parquet文件
当数据导完后,下一步就是写一个Spark作业来分析这个Parquet文件,上方是一个样例的代码。
4. 离线分析的弊端
弊端一:实时性差
全量导出代价大,数据量越大数据产出越困难。
弊端二:存储冗余
数据在离线重复存储。
弊端三:重复导出
识别增量较难,历史数据重复导出。
(二)HBase数据流式处理分析
1.完整步骤
首先使用LTS增量订阅HBase 数据,写入到Kakfa,接着使用Spark Streaming对接Kafka,进行流式计算。
2. 导出到Kafka
同样,这里使用的也是阿里云的LTS产品。
LTS里有Lindorm Streams模块,它可以订阅某一张或者某些表的数据,然后写到对应的消息存储里面去。当这个任务建起来之后,HBase写入数据就会实时同步到Kafka里。底层实现原理是订阅HBase日志,同步延迟在秒级别。
3. 使用Spark对接Kafka进行实时计算
数据增量同步到Kafka之后,使用Spark对接Kafka进行实时计算。
总结
如上图所示,整个HBase的数据生态十分丰富,可以看到有很多开源产品,首先上游APP、日志、数据库等高并发写入到HBase之后,Spark、Flink等可以直接读取HBase数据做分析。同时它们的结果也可以批量写入/Bulkload到HBase。
然后通过同步工具,如LTS、Kettle等,可以把HBase的数据全量同步到离线分析系统。 也可以通过增量订阅工具,如LTS、Replication,订阅到消息队列,下游再对接实时计算的产品,如Flink、Spark。
以上就是HBase的大致生态环境。