1 背景
本文描述本地数仓项目即席查询相关内容,主要涉及即席查询工具包括Presto、Druid、Kylin。
本文基于文章《本地数据仓库项目(一) —— 本地数仓搭建详细流程》 和《本地数仓项目(二)——搭建系统业务数仓详细流程》以及《本地数仓项目(三)—— 数据可视化和任务调度》
2 Presto
2.1 Presto概念
Presto是一个开源的分布式SQL查询引擎,数据量支持GB到PB,主要用于处理秒级查询的场景。
2.2 Presto架构
2.3 Presto优缺点
2.4 Presto安装
2.4.1 Presto Server安装
官网地址
https://prestodb.github.io/
下载地址
https://repo1.maven.org/maven2/com/facebook/presto/presto-server/
1) 上传安装包并解压,修改解压后目录名
tar -zxvf presto-server-0.196.tar.gz
mv presto-server-0.196 presto-server
- 创建data和etc目录
[root@wavehouse-1 presto-server]# pwd
/root/soft/presto-server
[root@wavehouse-1 presto-server]# mkdir data
[root@wavehouse-1 presto-server]# mkdir etc
- etc目录下创建jvm.config文件
并添加如下内容:
-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
- Presto可以支持多个数据源,在Presto里面叫catalog,这里我们配置支持Hive的数据源,配置一个Hive的catalog
mkdir etc/catalog
vim catalog/hive.properties
hive.properties添加如下内容:
connector.name=hive-hadoop2
hive.metastore.uri=thrift://wavehouse-1:9083
- 分发presto安装包到集群各个节点
- 分发之后在各个节点etc目录下新建node.properties文件
添加如下内容,注:不同节点的node.id设置为不同值,这里用的是十六进制。
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/opt/module/presto/data
- Presto是由一个coordinator节点和多个worker节点组成。在主节点上配置成coordinator,在其他节点上配置为worker
vim etc/config.properties
主节点添加如下内容
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8881
query.max-memory=50GB
discovery-server.enabled=true
discovery.uri=http://wavehouse-1:8881
其他节点添加如下内容
coordinator=false
http-server.http.port=8881
query.max-memory=50GB
discovery.uri=http://wavehouse-2:8881
8)启动Hive Metastore
nohup bin/hive --service metastore >/dev/null 2>&1 &
9)所有安装presto的节点启动presto
#前台启动
bin/launcher run
或
#后台启动
bin/launcher start
2.4.2 Presto命令行Client安装
下载地址:
https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/
- 将下载的presto-cli-xxxx-executable.jar上传到主节点的安装presto文件夹下
- 修改名字并赋予可执行权限
3)放入支持lzo压缩的jar包
由于数仓数据采用了lzo压缩,Presto去读数据时需要读取lzo格式数据,因此需要将lzo的jar包放入presto
cp /root/soft/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar ./
- 启动
./presto-cli --server wavehouse-1:8881 --catalog hive --schema default
5)Presto命令行操作
Presto的命令行操作,相当于Hive命令行操作。每个表必须要加上schema。
select * from hive.gmall.ads_back_count limit 10;
2.4.3 Presto可视化Client安装
- 上传yanagishima-18.0.zip到soft目录
- 解压缩
unzip yanagishima-18.0.zip
- 进入conf文件夹,编写yanagishima.properties
添加如下内容
jetty.port=7080
presto.datasources=chen-presto
presto.coordinator.server.chen-presto=http://wavehouse-1:8881
catalog.chen-presto=hive
schema.chen-presto=default
sql.query.engines=presto
4)启动
nohup bin/yanagishima-start.sh >y.log 2>&1 &
- 访问http://wavehouse-1:7080
2.4.4 效率对比
执行同样的sql,分别在hive端执行和Presto端执行
2.4.4.1
select count(*) from hive.gmall.dws_uv_detail_day
hive使用TEZ引擎
忽略TEZ第一次启动耗时,hive的TEZ查询时间为6.89秒
Presto查询
presto耗时0.99秒,性能提升,秒级查询。
2.4.4.2
select max(dt) from hive.gmall.dws_uv_detail_day
hive查询耗时4.65秒
Presto查询
presto耗时0.92秒,性能提升,秒级查询。
注:由于当前本地虚拟机,内存给的是4G,性能有所限制,如果是实际生产环境内存64G+情况下,性能更优!
2.5 Presto优化
2.5.1 合理设置分区
与Hive类似,Presto会根据元数据信息读取分区数据,合理的分区能减少Presto数据读取量,提升查询性能。
2.5.2 使用列式存储
Presto对ORC文件读取做了特定优化,因此在Hive中创建Presto使用的表时,建议采用ORC格式存储。相对于Parquet,Presto对ORC支持更好。
2.5.3 使用压缩
数据压缩可以减少节点间数据传输对IO带宽压力,对于即席查询需要快速解压,建议采用Snappy压缩。
3 Druid
3.1 Druid简介
Druid是一个快速的列式分布式的支持实时分析的数据存储系统。它在处理PB级别数据、毫秒级查询、数据实时处理方面,比传统的OLAP系统又显著性能提升。
3.2 Druid特点和应用场景
① 列式存储
② 可扩展的分布式系统
③ 大规模的并行处理
④ 实时或批量摄取
⑤ 自愈,自平衡,易操作
⑥ 数据进行有效的语句和或预计算
⑦ 数据结果应用Bitmap压缩算法
应用场景:
① 适用于清洗好的记录实时录入,但不需要更新操作
② 适用于支持宽表,不用Join的方式(即就是一张表)
③ 适用于可以总结出基础的统计指标,用一个字段表示
④ 适用于实时性要求高
3.3 Druid框架
3.4 Druid数据结构
与Druid架构相辅相成的是其基于DataSource与Segment的数据结构,它们共同成就了Druid的高性能优势。
3.5 Druid安装
3.5.1 安装包下载
从https://imply.io/get-started 下载最新版本安装包
3.5.2 安装部署
1)将imply-2.7.10.tar.gz上传到hadoop102的/opt/software目录下,并解压
tar -zxvf imply-2.7.10.tar.gz
2)修改imply-2.7.10名称为imply
3)修改配置文件
(1)修改Druid的ZK配置
vim imply/conf/druid/_common/common.runtime.properties
(2)修改启动命令参数,使其不校验不启动内置ZK
vim imply/conf/supervise/quickstart.conf
4)启动
(1)启动Zookeeper
./zkServer.sh statrt
(2)启动imply
bin/supervise -c conf/supervise/quickstart.conf
3.5.3 Web页面使用
1)登录wavehouse-1:9095查看
2)点击Load data->点击Apache Kafka
设置kafka集群和主题
3)确认数据样本格式
4) 加载数据,必须要有时间字段
5)选择需要加载的项
6)创建数据库表名
7) 确认一下配置
8)连接Kafka的topic_start
9) 选择SQL,查询指标
select sum(uid) from "topic_start"
4 Kylin
4.1 Kylin介绍
Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。
4.2 Kylin架构
1)REST Server
REST Server是一套面向应用程序开发的入口点,旨在实现针对Kylin平台的应用开发工作。 此类应用程序可以提供查询、获取结果、触发cube构建任务、获取元数据以及获取用户权限等等。另外可以通过Restful接口实现SQL查询。
2)查询引擎(Query Engine)
当cube准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其它组件进行交互,从而向用户返回对应的结果。
3)路由器(Routing)
在最初设计时曾考虑过将Kylin不能执行的查询引导去Hive中继续执行,但在实践后发现Hive与Kylin的速度差异过大,导致用户无法对查询的速度有一致的期望,很可能大多数查询几秒内就返回结果了,而有些查询则要等几分钟到几十分钟,因此体验非常糟糕。最后这个路由功能在发行版中默认关闭。
4)元数据管理工具(Metadata)
Kylin是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存在Kylin当中的所有元数据进行管理,其中包括最为重要的cube元数据。其它全部组件的正常运作都需以元数据管理工具为基础。 Kylin的元数据存储在hbase中。
5)任务引擎(Cube Build Engine)
这套引擎的设计目的在于处理所有离线任务,其中包括shell脚本、Java API以及Map Reduce任务等等。任务引擎对Kylin当中的全部任务加以管理与协调,从而确保每一项任务都能得到切实执行并解决其间出现的故障。
4.3 Kyllin特点
Kylin的主要特点包括支持SQL接口、支持超大规模数据集、亚秒级响应、可伸缩性、高吞吐率、BI工具集成等。
1)标准SQL接口:Kylin是以标准的SQL作为对外服务的接口。
2)支持超大数据集:Kylin对于大数据的支撑能力可能是目前所有技术中最为领先的。早在2015年eBay的生产环境中就能支持百亿记录的秒级查询,之后在移动的应用场景中又有了千亿记录秒级查询的案例。
3)亚秒级响应:Kylin拥有优异的查询响应速度,这点得益于预计算,很多复杂的计算,比如连接、聚合,在离线的预计算过程中就已经完成,这大大降低了查询时刻所需的计算量,提高了响应速度。
4)可伸缩性和高吞吐率:单节点Kylin可实现每秒70个查询,还可以搭建Kylin的集群。
5)BI工具集成
Kylin可以与现有的BI工具集成,具体包括如下内容。
ODBC:与Tableau、Excel、PowerBI等工具集成
JDBC:与Saiku、BIRT等Java工具集成
RestAPI:与JavaScript、Web网页集成
Kylin开发团队还贡献了Zepplin的插件,也可以使用Zepplin来访问Kylin服务
4.4 Kylin安装
安装Kylin前需先部署好Hadoop、Hive、Zookeeper、HBase,并且需要在/etc/profile中配置以下环境变量HADOOP_HOME,HIVE_HOME,HBASE_HOME,记得source使其生效。
HBASE安装详细见这篇文章
1)下载Kylin安装包
下载地址:http://kylin.apache.org/cn/download/
2)解压apache-kylin-2.5.1-bin-hbase1x.tar.gz
3)启动
(1)启动Kylin之前,需先启动Hadoop(hdfs,yarn,jobhistoryserver)、Zookeeper、Hbase
(2)启动Kylin
bin/kylin.sh start
看到如下页面说明kylin启动成功
4) 访问URL
在http://wavehouse-1:7070/kylin查看Web页面
用户名为:ADMIN,密码为:KYLIN(系统已填)
4.5 Kylin使用
以gmall数据仓库中的dwd_payment_info作为事实表,dwd_order_info_his、dwd_user_info作为维度表,构建星型模型,并演示如何使用Kylin进行OLAP分析。
4.5.1 创建工程
- 选择‘+’按钮
- 填写项目名称描述信息
4.5.2 获取数据源
- 选择datasource
2) 选择导入表
- 选择所需数据表,并点击Sync按钮
4.5.3 创建model
1)点击Models,点击"+New"按钮,点击"★New Model"按钮。
2)填写Model信息,点击Next
3)指定事实表
4)选择维度表,并指定事实表和维度表的关联条件,点击Ok
维度表添加完毕之后,点击Next
5)指定维度字段,并点击Next
6)指定度量字段,并点击Next
7)指定事实表分区字段(仅支持时间分区),点击Save按钮,model创建完毕
4.5.4 构建cube
1)点击new, 并点击new cube
2)填写cube信息,选择cube所依赖的model,并点击next
3)选择所需的维度,如下图所示
4)选择所需度量值,如下图所示
5)cube自动合并设置,cube需按照日期分区字段每天进行构建,每次构建的结果会保存在
Hbase中的一张表内,为提高查询效率,需将每日的cube进行合并,此处可设置合并周期。
6)Kylin高级配置(优化相关,暂时跳过)
7)Kylin相关属性配置覆盖
8)Cube信息总览,点击Save,Cube创建完成
9)构建Cube(计算),点击对应Cube的action按钮,选择build
10)选择要构建的时间区间,点击Submit
11)点击Monitor查看构建进度
4.5.6 使用进阶
执行上述流程之后,发现报错如下:
错误原因:上述错误原因是由于model中的维度表dwd_order_info_his为拉链表,dwd_user_info为每日全量表,故使用整张表作为维度表,必然会出现同同一个order_id或user_id对应多条数据的问题.又两种解决方案:
方案一:在hive中创建维度表的临时表,该临时表中只存放维度表最新的一份完整的数据,在kylin中创建模型时选择该临时表作为维度表。
方案二:与方案一思路相同,但不使用物理临时表,而选用视图(view)实现相同的功能。
4.5.7 采用方案二
(1)创建维度表视图
CREATE VIEW dwd_user_info_view as select * from dwd_user_info
WHERE dt='2023-01-04';
CREATE VIEW dwd_order_info_view as select * from dwd_order_info
WHERE dt='2023-01-04';
(2)在DataSource中导入新创建的视图,之前的维度表,可选择性删除。
修改后:
(3)重新创建model、cube
(4)等待重新构建
(5)查询结果
例1:
select user_level,sum(TOTAL_AMOUNT) from DWD_PAYMENT_INFO t1 join DWD_USER_INFO_VIEW t2 on t1.USER_ID = t2.ID
group by user_level
可发现当前耗时0.15秒,可以在在亚秒级别返回。
例2:增加一个性别维度查询
select user_level,gender,sum(TOTAL_AMOUNT) from DWD_PAYMENT_INFO t1 join DWD_USER_INFO_VIEW t2 on t1.USER_ID = t2.ID
group by user_level,gender
只需要0.09秒,可以在在亚秒级别返回。
4.5.8 Kylin BI工具
4.5.8.1JDBC
项目中导入maven依赖,即可开发,这里不再赘述
<dependencies>
<dependency>
<groupId>org.apache.kylin</groupId>
<artifactId>kylin-jdbc</artifactId>
<version>2.5.1</version>
</dependency>
</dependencies>
4.5.8.2 Zepplin
1)Zepplin安装与启动
(1)将zeppelin-0.8.0-bin-all.tgz上传至Linux
(2)解压zeppelin-0.8.0-bin-all.tgz
(3)修改名称
(4)启动
bin/zeppelin-daemon.sh start
可登录网页查看,web默认端口号为8080
http://wavehouse-1:8080
2)配置Zepplin支持Kylin
(1)点击右上角anonymous选择Interpreter
(2)搜索Kylin插件并修改相应的配置
(3)修改完成点击Save完成
3) 创建新的note
(2)填写Note Name点击Create
(3) 输入SQL进行查询
(4 )查看查询结果
5 总结
5.1 即席查询对比
Druid/Impala/Presto/Es/Kylin/Spark SQL对比