本地数仓项目(四)—— 即席查询

Posted 不以物喜2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了本地数仓项目(四)—— 即席查询相关的知识,希望对你有一定的参考价值。

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
  1. 创建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
  1. etc目录下创建jvm.config文件
    并添加如下内容:
-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
  1. 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
  1. 分发presto安装包到集群各个节点
  2. 分发之后在各个节点etc目录下新建node.properties文件
    添加如下内容,注:不同节点的node.id设置为不同值,这里用的是十六进制。
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/opt/module/presto/data
  1. 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/

  1. 将下载的presto-cli-xxxx-executable.jar上传到主节点的安装presto文件夹下
  2. 修改名字并赋予可执行权限

    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 ./
  1. 启动
./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安装

  1. 上传yanagishima-18.0.zip到soft目录
  2. 解压缩
unzip yanagishima-18.0.zip
  1. 进入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 &
  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 创建工程

  1. 选择‘+’按钮
  2. 填写项目名称描述信息

4.5.2 获取数据源

  1. 选择datasource
    2) 选择导入表
  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对比

以上是关于本地数仓项目(四)—— 即席查询的主要内容,如果未能解决你的问题,请参考以下文章

实时即未来,大数据项目车联网之原始数据车辆指标即席查询

Flink实时数仓数据仓库项目实战 《四》日志数据分流 DWD

有道教育数仓建设实践

有道教育数仓建设实践

有道教育数仓建设实践

客快物流大数据项目(六十九):即席查询的背景介绍和业务处理流程