赞
踩
OLTP(On-Line Transaction Processing)联机事务处理,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。它具有FASMI(Fast Analysis of Shared Multidimensional Information),即共享多维信息的快速分析的特征。主要应用是传统关系型数据库。OLTP系统强调的是内存效率,实时性比较高。 Mysql、Oracle、Redis。
OLAP(On-Line Analytical Processing)联机分析处理,也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作快速响应的方式之一。应用在数据仓库,使用对象是决策者。OLAP系统强调的是数据分析,响应速度要求没那么高。目前市面上主流的开源OLAP引擎包含不限于:Hive、Presto、Doris、Kylin、Impala、Sparksql、Druid、Greenplum等。
OLAP按存储器的数据存储格式分为ROLAP(Relational OLAP)(关系型在线分析)、MOLAP(Multi-dimensional OLAP)(多维在线分析)和 HOLAP(Hybrid OLAP)。
按照查询类型划分,OLAP一般分为即席查询和固化查询,
数据轨迹现有的实现方式,从业务诉求看为:每账期按照指定的查询列取数据,进行分析未结算原因,偏向固化查询的方式。但现有的实现方式为先按照查询列值查询出主表数据,再根据主表附属表的关联字段,获取查询附属表的sql,sql为动态拼接出来,这种方式更偏向于即席查询的实现。
按照架构实现划分,主流的OLAP引擎主要有下面三点:
大数据查询目前来讲可以大体分为三类:
1.基于hbase预聚合的,比如Opentsdb,Kylin,Druid等,需要指定预聚合的指标,在数据接入的时候根据指定的指标进行聚合运算,适合相对固定的业务报表类需求,只需要统计少量维度即可满足业务报表需求
2.基于Parquet列式存储的,比如Presto, Drill,Impala等,基本是完全基于内存的并行计算,Parquet系能降低存储空间,提高IO效率,以离线处理为主,很难提高数据写的实时性,超大表的join支持可能不够好。spark sql也算类似,但它在内存不足时可以spill disk来支持超大数据查询和join
3.基于lucene外部索引的,比如ElasticSearch和Solr,能够满足的的查询场景远多于传统的数据库存储,但对于日志、行为类时序数据,所有的搜索请求都也必须搜索所有的分片,另外,对于聚合分析场景的支持也是软肋
需要从以下三个方面考虑框架选型:数据存储和构建、安装搭建、开发成本。
很容易可以看出,OLAP场景与其他通常业务场景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value数据库去高效的处理分析查询场景,并不是非常完美的适用方案。例如,使用OLAP数据库去处理分析请求通常要优于使用MongoDB或Redis去处理分析请求。
列式数据库更适合于OLAP场景(对于大多数查询而言,处理速度至少提高了100倍),下面详细解释了原因(通过图片更有利于直观理解):
行式
列式
看到差别了么?下面将详细介绍为什么会发生这种情况。
输入/输出
例如,查询«统计每个广告平台的记录数量»需要读取«广告平台ID»这一列,它在未压缩的情况下需要1个字节进行存储。如果大部分流量不是来自广告平台,那么这一列至少可以以十倍的压缩率被压缩。当采用快速压缩算法,它的解压速度最少在十亿字节(未压缩数据)每秒。换句话说,这个查询可以在单个服务器上以每秒大约几十亿行的速度进行处理。这实际上是当前实现的速度。
Druid同kylin一样,是采用预计算的方式。主要解决的是对于大量的基于时序的数据进行聚合查询。数据可以实时摄入,进入到Druid后立即可查,同时数据是几乎是不可变。通常是基于时序的事实事件,事实发生后进入Druid,外部系统就可以对该事实进行查询。
Druid是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,用于解决如何在大规模数据集下进行快速的、交互式的查询和分析。
是一个实时处理时序数据的OLAP数据库,因为它的索引首先按照时间分片,查询的时候也是按照时间线去路由索引。
Druid架构
Druid 是一个分布式的支持实时分析的数据存储系统,具有以下几个特点
实时数据分析是 Apache Druid 最典型的使用场景。该场景涵盖的面很广,例如:
Druid案例
知乎:技术选型上,知乎根据不同业务场景选择了HBase 和 Redis 作为实时指标的存储引擎,在OLAP选型上,知乎选择了Druid。
OPPO:而OPPO根据自身不同的业务场景,报表层选择了Druid,标签选择了ES,接口层选择了Hbase。
这些场景的特点都是拥有大量的数据,且对数据查询的时延要求非常高。在实时指标监控中,系统问题需要在出现的一刻被检测到并被及时给出报警。在推荐模型中,用户行为数据需要实时采集,并及时反馈到推荐系统中。用户几次点击之后系统就能够识别其搜索意图,并在之后的搜索中推荐更合理的结果
产品特性
kylin是一种OLAP数据引擎,支持大数据生态圈的数据分析业务,主要是通过预计算的方式将用户设定的多维度数据立方体(cube)缓存起来,达到快速查询的目的。应用场景应该是针对复杂sql join后的数据缓存。
核心是Cube,cube是一种预计算技术,基本思路是预先对数据作多维索引,查询时只扫描索引而不访问原始数据从而提速。
这种OLAP引擎,一般包括以下几部分:
a、REST 服务层:应用程序开发的入口点
b、查询引擎层:Cube准备就绪后,与系统中的其他组件进行交互,从而向用户返回对应的结果
c、路由层:将解析的SQL生成的执行计划转换成Cube缓存的查询,cube通过预计算缓存在hbase中,这些操作可以在毫秒级完成,还有一些操作使用的原始查询,这部分延迟较高(麒麟高版本中已删除该层)
d、元数据管理工具:kylin的元数据管理存储在hbase中
e、任务引擎:处理所有离线任务:包括shell脚本、javaAPI以及MapReduce任务等等
应用思路:将hive中的数据按照查询列构建成cube,存储到hbase中,数据轨迹连接kylin的jdbc接口实现快速查询。
适用范围
适用于:数据仓库,用户行为分析,流量(日志)分析,自助分析平台,电商分析,广告效果分析,实时分析,数据服务平台等各种场景
impala是Cloudera开发开源的,Impala是Cloudera开发并开源的,它提供SQL语义,能查询存储在HDFS和HBase中的PB级数据。同Hive一样,也是一种SQL on Hadoop解决方案。但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。Impala抛弃了MapReduce,使用更类似于传统的MPP数据库技术来提高查询速度。Impala的最大特点也是最大卖点就是它的快速。
产品特性
impala架构
impala是典型的mpp架构,采用了对等式架构,所有角色之间是对等的,没有主从之分。
impala主要由以下三个组件组成:
Impala daemon(守护进程);
Impala Statestore(存储状态);
Impala元数据或metastore(元数据即元存储)。
presto是Facebook开源的大数据查询引擎,为了解决hive查询慢产生。使用java编写,数据全部在内存中处理。Presto 的设计和编写完全是为了解决像 Facebook 这样规模的商业数据仓库的交互式分析和处理速度的问题。
产品特性
Facebook开源的一个java写的分布式数据查询框架,原生集成了Hive、Hbase和关系型数据库,Presto背后所使用的执行模式与Hive有根本的不同,它没有使用MapReduce,大部分场景下比hive快一个数量级,其中的关键是所有的处理都在内存中完成。
Presto架构
Presto 是一个运行在多台服务器上的分布式系统。完整安装包括一个 Coordinator 和多 个 Worker。由客户端提交查询,从 Presto 命令行 CLI 提交到 Coordinator。Coordinator 进行 解析,分析并执行查询计划,然后分发处理队列到 Worker 。
Presto也是一个master-slave架构的查询引擎。其架构图如下图所示:
Presto应用场景:
Presto 支持在线数据查询,包括 Hive,关系数据库(MySQL、Oracle)以及专有数据存储。一条 Presto 查询可以将多个数据源的数据进行合并,可以跨越整个组织进行分析(跨库执行)。Presto 主要用来处理 响应时间小于 1 秒到几分钟的场景 。
1、Presto 支持 SQL 并提供了一个标准数据库的语法特性,但其不是一个通常意义上的关系数据库。
2、Presto 是一个可选的工具,可以用来查询 HDFS
3、被设计为处理数据仓库和分析:分析数据,聚合大量的数据并产生报表,这些场景通常被定义为 OLAP
基于spark平台上的一个olap框架,本质上也是基于DAG的MPP, 基本思路是增加机器来并行计算,从而提高查询速度。
Spark SQL应该还是算做Batching Processing, 中间计算结果需要落地到磁盘,所以查询效率没有MPP架构的引擎(如Impala)高
Clickhouse是一个用于在线分析处理(OLAP)的列式数据库管理系统(DBMS)。是由俄罗斯的Yandex公司为了Yandex Metrica网络分析服务而开发。它支持分析实时更新的数据,Clickhouse以高性能著称。
场景特征:
clickhouse自身限制:
ClickHouse开源的出现让许多想做大数据并且想做大数据分析的很多公司和企业耳目一新。ClickHouse 正是以不依赖Hadoop 生态、安装和维护简单、查询速度快、可以支持SQL等特点在大数据分析领域披荆斩棘越走越远。
Greenplum 公司开发的GP(GreenPlum)是业界最快最高性价比的关系型分布式数据库,它在开源的PG(PostgreSql)的基础上采用MPP架构(Massive Parallel Processing,海量并行处理),具有强大的大规模数据分析任务处理能力。Greenplum 是全球领先的大数据分析引擎,专为分析、机器学习和AI而打造。
Greenplum是一种基于PostgreSQL的分布式数据库。其采用shared nothing架构(MPP),主机,操作系统,内存,存储都是自我控制的,不存在共享。也就是每个节点都是一个单独的数据库。节点之间的信息交互是通过节点互联网络实现。通过将数据分布到多个节点上来实现规模数据的存储,通过并行查询处理来提高查询性能。
这个就像是把小数据库组织起来,联合成一个大型数据库。将数据分片,存储在每个节点上。每个节点仅查询自己的数据。所得到的结果再经过主节点处理得到最终结果。通过增加节点数目达到系统线性扩展。
1、Cloudera带头开发的存储系统,其整体应用模式和HBase比较接近,即支持行级别的随机读写,并支持批量顺序检索功能。
2、Kudu管理的是类似关系型数据库的结构化的表。
3、Kudu底层核心代码使用C++开发,对外提供Java API接口。
适用范围
1、Kudu的定位是提供fast analytics on fast data,也就是在快速更新的数据上进行快速的查询。
2、它定位OLAP和少量的OLTP工作流,如果有大量的random accesses,官方建议还是使用HBase最为合适。不建议频繁的删改数据
产品特性
1、Kudu的集群架构基本和HBase类似,采用主从结构,Master节点管理元数据,Tablet节点负责分片管理数据。
2、Kudu采用了类似log-structured存储系统的方式,增删改操作都放在内存中的buffer,然后才merge到持久化的列式存储中。Kudu还是用了WALs来对内存中的buffer进行灾备。
6.1、Doris简介
Apache Doris (incubating)(原Palo)是一款百度大数据团队自主研发的MPP数据库,其功能和性能已达到或超过国内外同类产品。是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。
6.2、Doris应用场景
Apache Doris 能够较好的满足报表分析、即时查询、统一数仓构建、数据湖联邦查询加速等使用场景,用户可以在此之上构建用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用。
应用场景主要包括以下方面:
数据仓库:用于构建大规模的数据仓库,支持数据的存储、查询和分析等功能。
商业智能:用于支持商业智能和数据分析,包括多维分析、OLAP查询和报表功能等。
实时报表:用于构建实时报表系统,支持数据的实时同步和查询,满足实时报表和分析的需求。
物联网:用于物联网领域的数据处理和分析,支持海量数据的存储和查询,提供实时数据分析和决策支持。
6.3、Doris架构
Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,采用了对等式架构,所有角色之间是对等的,没有主从之分。
FE前端节点-主要负责元数据的管理、查询调度,解析sql的执行计划给BE,
BE-数据的存储和执行的引擎,这里存储和计算还是在一起的;
FE:leader 、follower(参与选举),水平扩容
对外提供了mysql兼容的协议;
跟传统架构的区别:
通过分布式拆分成不同的task,再在中心节点汇聚;
druid、clickhouse都是类型;
MR是任务的拆分、落盘;
doris是MPP架构,任务之间分成task、全都在内存中执行和传输,所有任务都是流水线,没有磁盘IO,适用于低延迟亚秒级查询;
这几种框架各有优缺点,存在就是合理,如何选型个人看法如下:
从成熟度来讲:kylin>spark sql>Druid>presto
从超大数据的查询效率来看:Druid>kylin>presto>spark sql
从支持的数据源种类来讲:presto>spark sql>kylin>Druid
与X沟通,建议使用impala或者spark做查询,于是查询对比各种开源的OLAP引擎。
特点 | Presto | Impala | Druid | Kylin | Doris | Clickhouse | GreenPlum |
查询延时 | 一般(秒) | 一般(秒) | 低(亚秒) | 非常低(亚秒) | 相较于Clickhouse,Doris还能支持各种主 流分布式join,不仅支持大宽表模型,还支 持星型模型和雪花模型 | 明细查询较低,单表查询性能 高,Join在一些情况下性能不佳 物化视图查询延迟非常低 | 一般,小查询会极大 消耗集群资源,无法 实现高效并发查询 |
SQL支持程度 |
非常完善
|
较完善
| 较完善 | 非常完善 |
较完善
| 较完善 |
非常完善
|
生产数据成本 |
低
|
低
|
中
|
高
|
中
|
中
|
中
|
发展定位 |
MPP系统,SQL on Hadoop | 是一种 SQL on Hadoop 解决方 案,使用 MPP 数据库技术来提 高查询速度 | 位图索引查询、编码。预聚合 技术,但是只聚合最细的维度 组合,在此基础进行聚合 | 完全预聚合立方体 | 一个 MPP 的 OLAP 系统,对多维查询分析 提供支持,主要整合了 Google Mesa(数 据模型),Apache Impala(MPP Query Engine) 和 Apache ORCFile (存 储格式,编码和压缩) 的技术 | 明细动态聚合查询 物化视图 | 一个开源的大规模并 行数据分析引擎 |
支持join |
支持
| 支持 | 不够成熟,维度lookup支持 |
支持
|
支持
|
有限支持
|
支持
|
➢ 单表查询:clickhouse > impala > presto > sparksql > greeplum > hive
➢ 关联查询: presto > impala > greeplum > clickhouse > sparksql > hive
(1)cloudera公司2014年做的性能基准对比测试,原文链接:Cloudera Blog -
下面看看这个测试是怎么做的。
配置:
所有测试都运行在一个完全相同的21节点集群上,每个节点只配有64G内存。之所以内存不配大,就是为了消除人们对于Impala只有在非常大的内存上才有好性能的错误认识:
对比产品:
查询:
结果:
单用户如下图所示。
多用户如下图所示。
查询吞吐率如下图所示。
Impala本身就是cloudera公司的主打产品,因此只听其一面之词未免有失偏颇,下面就再看一个SAS公司的测试
(2)SAS2013年做的Impala和Hive的对比测试
硬件:
刀片服务器配置
软件:
数据:
数据模型如下图所示。
查询:
使用了以下5条查询语句
- -- What are the most visited top-level directories on the customer support website for a given week and year?
- select top_directory, count(*) as unique_visits
- from (select distinct visitor_id, split(requested_file, '[\\/]')[1] as top_directory
- from page_click_flat
- where domain_nm = 'support.sas.com'
- and flash_enabled='1'
- and weekofyear(detail_tm) = 48
- and year(detail_tm) = 2012
- ) directory_summary
- group by top_directory
- order by unique_visits;
-
- -- What are the most visited pages that are referred from a Google search for a given month?
- select domain_nm, requested_file, count(*) as unique_visitors, month
- from (select distinct domain_nm, requested_file, visitor_id, month(detail_tm) as month
- from page_click_flat
- where domain_nm = 'support.sas.com'
- and referrer_domain_nm = 'www.google.com'
- ) visits_pp_ph_summary
- group by domain_nm, requested_file, month
- order by domain_nm, requested_file, unique_visitors desc, month asc;
-
- -- What are the most common search terms used on the customer support website for a given year?
- select query_string_txt, count(*) as count
- from page_click_flat
- where query_string_txt <> ''
- and domain_nm='support.sas.com'
- and year(detail_tm) = '2012'
- group by query_string_txt
- order by count desc;
-
- -- What is the total number of visitors per page using the Safari browser?
- select domain_nm, requested_file, count(*) as unique_visitors
- from (select distinct domain_nm, requested_file, visitor_id
- from page_click_flat
- where domain_nm='support.sas.com'
- and browser_nm like '%Safari%'
- and weekofyear(detail_tm) = 48
- and year(detail_tm) = 2012
- ) uv_summary
- group by domain_nm, requested_file
- order by unique_visitors desc;
-
- -- How many visitors spend more than 10 seconds viewing each page for a given week and year?
- select domain_nm, requested_file, count(*) as unique_visits
- from (select distinct domain_nm, requested_file, visitor_id
- from page_click_flat
- where domain_nm='support.sas.com'
- and weekofyear(detail_tm) = 48
- and year(detail_tm) = 2012
- and seconds_spent_on_page_cnt > 10;
- ) visits_summary
- group by domain_nm, requested_file
- order by unique_visits desc;
结果:
Hive与Impala查询时间对比如下图所示。
可以看到,查询1、2、4Impala比Hive快的多,而查询3、5Impala却比Hive慢很多。这个测试可能更客观一些,而且也从侧面说明了一个问题,不要轻信厂商宣传的数据,还是要根据自己的实际测试情况得出结论。
机器环境:
4个slave节点
10.200.187.86 cslave1 4核 3G
10.200.187.87 cslave2 2核 4G
10.200.187.88 cslave3 2核 4G
10.200.187.89 cslave4 2核 6G
测试效果:
总结:
1.在内存够用并且是简单sql条件下,impala相比hive执行效率高很多,简单的sql在百万级别数据中运行,耗时几秒甚至不用一秒。
2.impala性能如何,与数据的存储格式关系很大,百万级别text格式与hbase格式相差十几倍,千万级别parquet格式与text格式相差百倍。
3.在当前集群配置下,百万级别impala join略比hive性能高(3~4倍),但在千万级别时impala大表的join执行失败(内存不足)。
4.impala采用parquet存储(列式),select部分字段+where条件查询效率很高。
ERRORS报错情况
create table testjoinparquet as
> select a.tid,a.buyer_nick,b.status,b.adjust_fee,b.buyer_email
> from (select tid,buyer_nick from s_trade_big_parquet) a
> join
> (select tid,status,adjust_fee,buyer_email from s_trade_big_parquet) b
> on (a.tid=b.tid);
- Query: create table testjoinparquet as select a.tid,a.buyer_nick,b.status,b.adjust_fee,b.buyer_email from (select tid,buyer_nick from s_trade_big_parquet) a join (select tid,status,adjust_fee,buyer_email from s_trade_big_parquet) b on (a.tid=b.tid)
- Query aborted.
- ERRORS ENCOUNTERED DURING EXECUTION:
- Backend 3:Memory Limit Exceeded
- Query Limit: Consumption=1.35 GB
- Fragment dd496e82ab98ee40:19f71d48047534a2: Consumption=16.00 KB
- UDFs: Consumption=0.00
- EXCHANGE_NODE (id=4): Consumption=0.00
- DataStreamMgr: Consumption=0.00
- HdfsTableSink: Consumption=0.00
- Fragment dd496e82ab98ee40:19f71d48047534a6: Consumption=1.27 GB
- UDFs: Consumption=0.00
- HASH_JOIN_NODE (id=2): Consumption=1.07 GB
- HDFS_SCAN_NODE (id=0): Consumption=207.88 MB
- EXCHANGE_NODE (id=3): Consumption=1.70 MB
- DataStreamMgr: Consumption=1.70 MB
- DataStreamSender: Consumption=2.45 KB
- Fragment dd496e82ab98ee40:19f71d48047534aa: Consumption=82.39 MB
- UDFs: Consumption=0.00
- HDFS_SCAN_NODE (id=1): Consumption=82.19 MB
- DataStreamSender: Consumption=8.00 KB
说明:内存已经用完,导致部分节点读取异常,parquet格式表写入很耗内存,因为parquet以1G为单位,1G得全部加载到内存中再写入。
kylin:2秒
impala完成只要1分半
hive:31分钟
对比项目/引擎 | Greenplum | Kylin | ElasticSearch | ClickHouse |
亚秒级响应 | Y | Y | N | 单表查询Y,多表查询N |
高并发 | N | Y | N | N |
百亿数据集 | N | Y | Y | Y |
SQL支持 | Y | Y | N | Y(支持Sql中基本语法,window函数还不支持) |
离线 | Y | Y | Y | Y |
实时 | N | N(开发中,目前主要支持Kafka 流构建 Cube) | Y | Y |
精准去重能力 | Y | Y | N | Y |
是否支持明细查询 | Y | N | Y | Y |
多表join | Y | Y | N | Y |
能否更改模型 | N | N | N | Y(更换表引擎) |
JDBC/ODBC for BI集成 | N | Y | N | N |
WEB GUI | 商业收费 | Y | N | Y |
REST API | 未知 | Y | Y | N |
社区活跃度 | 活跃 | 活跃 | 活跃 | 不太活跃 |
存储能力 | 计算+存储 | shared nothing | 计算+存储 | 计算+存储 |
成本 | 未知 | 中 | 中 | 高 |
易用性 | 未知 | 安装简单快捷,轻量级,简单,选择维度表和度量即可构建Cube | 部署较简单,但是难用目前发展趋向于专人专岗 | 简单易用 |
监控成本 | 未知 | 自带监控组件、运维成本低 | 可以使用Kibana实现 | Graphite、Grafana、prometheus、nagios、zabbix、sematext |
大规模并行处理(MPP) | Y | N | N | Y |
列式存储 | Y | Y | N(倒排索引) | Y |
数据压缩 | Y | Y | Y | Y |
基于hadoop | Y | Y | N | N |
弹性伸缩成本 | 低 | 低 | 低 | 高 |
ad-hoc | Y | N | N | Y |
容器化 | Y | Y | Y | Y |
Shared Everthting | N | N | N | N |
Shared Nothing | Y | N | N | N |
Shared Disk | N | Y | Y | Y(默认单磁盘存储) |
Master-Slave | Y | Y | Y | N |
Multi-Master | N | N | N | Y |
1、Impala
Impala和 presto, spark sql等相比,确实是查询性能最快的(注意,我单单说的是查询性能)。Impala最大的问题在于catalogd是个单点,元数据多了后会遇到各种问题。
Catalogd进程是Impala中用来传递Impala SQL导致的元数据变化的组件,它把这些变化传递给集群中所有的节点。一个集群中只需要一个节点上有这个守护进程,因为请求是通过Statestore传递的,因此Statestored和Catalogd 服务应当运行在同一节点上。
引入Catalogd进程的目的就是减少执行REFRESH和INVALIDATE METADATA语句,当在Impala中执行 CREATE TABLE 、 INSERT 或其他表修改、数据修改操作时,不再需要执行 REFRESH 或INVALIDATE METADATA 语句,但是在Hive中执行这些操作,或者直接在HDFS操作数据,这两个语句仍然需要,但是只需要在其中一个节点上运行,不再需要在所有节点上都运行。
本质上,Presto、Impala等是一个MPP engine,各节点不共享资源,每个executor可以独自完成数据的读取和计算,缺点在于怕stragglers,遇到后整个engine的性能下降到该straggler的能力,所谓木桶的短板,这也是为什么MPP架构不适合异构的机器,要求各节点配置一样。
2、Spark SQL
Spark SQL应该还是算做Batching Processing, 中间计算结果需要落地到磁盘,所以查询效率没有MPP架构的引擎(如Impala)高。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。