在前文 BI系统与ClickHouse:探索式BI的OLAP技术演进之路 中已经涉及过OLAP的概念,这里再简要介绍下。
60年代,关系型数据库之父E.F.Codd提出了关系模型,促进了OLTP( OnLine Transaction Processing,联机事务处理)模型的发展。
1993年,E.F.Codd提出了OLAP(OnLine Analytical Processing,联机分析处理)概念,认为OLTP已不能满足终端用户对数据库查询分析的需要,SQL对大型数据库进行的简单查询也不能满足终端用户分析的要求。用户的决策分析需要对关系数据库进行大量计算才能得到结果,而查询的结果并不能满足决策者提出的需求。因此,E.F.Codd提出了多维数据库和多维分析的概念,即OLAP。
OLAP技术发展至今,已经是”百花齐放“之势:ROLAP(Relational OLAP,关系型OLAP)和MOLAP(Multidimensional OLAP,多维型 OLAP)两大流派各有建树;MPP(Massively Parallel Processing, 大规模并行处理)技术推陈出新。 本文首先为大家梳理下主流OLAP开源技术框架,让读者可以快速了解各种引擎特点。

SQL on Hadoop 的原理
讨论OLAP就不得不提 SQL on Hadoop, SQL on Hadoop系统是一类系统的统称,这类系统利用Hadoop实现大量数据的管理,具体是利用HDFS 实现高度可扩展的数据存储。在HDFS之上,实现SQL的查询引擎,使得用户可以使用SQL语言,对存储在HDFS上的数据进行分析。这实际上是一套计算和存储分离的方案,大名鼎鼎的MapReduce就是其基石。
Join 的实现原理
select u.name, o.orderid from order o join user u on o.uid = u.uid;

Group By 的实现原理
select rank, isonline, count(*) from city group by rank, isonline;

为了提高SQL on Hadoop的性能,第一个重要技术流派的就是MPP。MPP (Massively Parallel Processing),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和应用特点划分到各个节点上,每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供数据库服务。非共享数据库集群有完全的可伸缩性、高可用、高性能、优秀的性价比、资源共享等优势。
简单来说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果(与Hadoop相似)。 其中的代表就是 Presto & Impala。

Presto 是 Facebook 推出分布式SQL交互式查询引擎,完全基于内存的并行计算。其架构图如下:

Presto比Hive快的原因就在于不在落盘,而是全内存操作。

PrestoDB / PrestoSQL(Trion)
最早 Presto 由 Facebook 公司开源,Github链接为 https://github.com/prestodb/presto。但是因为 Facebook对 Presto 相关开发优先级为公司内部需求为主,导致社区活跃性和很多 Issues 得不到及时解决。
2019 年 Facebook 内部主要负责 Presto 的人单独出来成立了新公司。社区也重新创建,Github链接为 https://github.com/prestosql/presto。由 Facebook 主力维护的 Presto 称为 PrestoDB,从 Facebook 分道 扬镳出来的叫 PrestoSQL。
直到2020年底,Presto 品牌之争虽然以 PrestoDB 胜出落下了帷幕,PrestoSQL 改名为 Trion,GitHub 地址为
https://github.com/trinodb/trino
PrestoDB 和 PrestoSQL(Trion)的比较(2020.5):
http://armsword.com/2020/05/02/the-difference-between-prestodb-and-prestosql/
Presto的优缺点
优势:
缺点:
Impala 是 Cloudera 在受到 Google 的 Dremel 启发下开发的实时交互SQL大数据查询工具,其也是基于内存的并行计算框架且强依赖与HIVE生态。

Impala的优缺点
优势
缺点
Drill: Drill 是2012年,MapR 公司开源的一个低延迟的大数据集的分布式SQL查询引擎,是谷歌Dremel的开源实现。它支持对本地文件、HDFS、HBASE等数据进行数据查询。它与同是源自 Dremel 的 Impala 比较类似。
HAWQ:HAWQ(Hadoop With Query) 是 Pivotal 公司开源的一个 Hadoop 原生大规模并行SQL分析引擎,基于 GreenPlum 实现,采用主从改进MPP架构,将MPP与批处理系统有效的结合。
MPP技术的底层逻辑还是基于ROLAP出发的,另一个角度就是MOLAP(Multidimensional OLAP,多维型 OLAP)。它的出现是为了缓解ROLAP性能问题。MOLAP使用多维数组的形式保存数据,其核心思想是借助预先聚合结果,用更多的存储空间换得查询时间的减少。其中集大成则就是Kylin.

Kylin 是2014年由 eBay 中国研发中心开源的OLAP引擎,提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析能力以支持超大规模数据,它能在亚秒内查询巨大的Hive表。其核心技术点在于预计算和Cube(立方体模型)的设置:首先, 对需要分析的数据进行建模,框定需要分析的维度字段;然后通过预处理的形式,对各种维度进行组合并事先聚合;最后,将聚合结果以某种索引或者缓存的形式保存起来(通常只保留聚合后的结果,不存储明细数据)。这样一来,在随后的查询过程中,就可以直接利用结果返回数据。

维度预处理可能会导致数据膨胀。为了减少cube的计算量就需要cube剪枝。

Kylin的优缺点
优势
缺点
Druid是由广告公司 MetaMarkets 于2012年开源的实时大数据分析引擎.

Druid 作为MOLAP引擎,也是对数据进行预聚合。只不过预聚合的方式与Kylin不同,Kylin是Cube化,Druid的预聚合方式只是全维度进行Group-by,相当于是Kylin Cube 的 base cuboid。

更多关于Kylin和Druid的对比:https://www.shulanxt.com/doc/encyc/cy-dkdb
Druid的优缺点:
优势
缺点
如果单纯从模型角度考虑,和MOLAP相比,很明显ROLAP架构更胜一筹。因为关系模型拥有最好的“群众基础”,也更简单且容易理解。它直接面向明细数据查询,由于不需要预处理,也就自然没有预处理带来的负面影响(维度组合爆炸、数据实时性、更新问题)。
那是否存在这样一种技术,它既使用ROLAP模型,同时又拥有比肩MOLAP的性能呢? 答案就是MPPDB。

在前文六千字呕心沥血深度总结,为您揭秘ClickHouse为什么查询这么快 中,笔者已经深入介绍了CH的特性,这里不再赘述,只是简单总结下其优缺点:
优势
缺点
Apache Doris是由百度开源的一款MPP数据库,实现了MySQL协议,集成Google Mesa 和Apache Impala 的技术。
DorisDB是基于 Apache Doris 做的闭源商业化产品,后该产品又基于Elastic License 2.0开源并更名为StarRocks。

关于这两家的一些历史纠葛,可以参考
Apache Doris声明: ApacheDoris:你们想知道的 一切,都在这里了。 https://zhuanlan.zhihu.com/p/408644772StarRocks回应: 关于StarRocks相关疑问的解答 https://mp.weixin.qq.com/s/r8pL5v2Yw1l9iQxhDWaW3w
Doris的优缺点:
优势
缺点
细心的读者可以已经发现了,上面的提到的技术都是在特定场景下增强的,单有的时候我们其实场景还不是很明确,有没有稍微通用的“万金油”方案,方便我们以后扩展和演进呢,这就需要回到Hadoop生态的通用方案了。

由 Facebook 开源,用于解决海量日志数据的分析,是一个构建于Hadoop顶层的数据仓库工具。


Spark是UC Berkeley AMP lab开源的类MapReduce的通用的并行计算框架。SparkSQL 是 Spark 处理结构化数据的模块。本质上也是基于 DAG (有向无环图,Directed Acyclic Graph的缩写,常用于建模) 的 MPP。


SparkSQL的优缺点
优势
缺点
说了这么多,到底该怎么选择呢?正所谓“一图胜千言”,笔者直接给出决策路径。

Presto特别适合小型Query,Presto对小型任务也有比较好的性能表现。
维度不确定的即席查询(adhoc),满足秒级或分钟级返回。
一般用于报表(BI报表、自定义报表),数据质量检测,活动营销。
Aapche Impala强依赖于CDH的生态,Apache Drill和Apache HAWQ社区都不太活跃。因此现在Presto风头强于 Impala;
个人理解可以认为是Presto的加速版,一站式OLAP实时分析数据库。
数据不直接依赖HDFS,接受MySQL标准,有适量join和大量聚合操作。
一般用于新业务场景,无Hadoop数仓历史背景,一站式OLAP数据库和实时数据仓库
Apache Doris和ClickHouse的深度分析:https://zhuanlan.zhihu.com/p/421469439
超大规模复杂多表数据分析,数仓ETL,自定义复杂作业和python数据科学;
数据存在HDFS或其他数据湖,标准Hive数仓,T+1场景和其他非实时分析。
一般用于其他OLAP引擎的Fallback,数仓ETL不二之选,机器学习相关的数据分析,数据科学。
“世间没有万全策”。高性能OLAP技术虽然足够优秀,但也不是万能的,我们还需根据实践情况组合使用。下面读者将从几个实战落地场景介绍下OLAP的应用。


方案分析:
提供面向数据湖场景的数据分析和计算能力,主打数据湖分析和联邦分析两个场景。
DLA 提供了 SQL (Presto) 计算引擎和 Spark计算引擎,无论是 SQL还是Spark引擎,都和 Meta data catalog 深度集成,能方便的获取元数据信息。基于 Presto,DLA 可以支持 Ad-hoc Query。基于 Spark ,DLA 支持批处理、流计算和机器学习等计算模式。

和阿里DLA类似

推荐系统实时指标
无论字节还是在快手内部,“AB实验”应用非常广泛,特别是在验证推荐算法和功能优化的效果方面。 而推荐系统需要更快地观察算法模型、或者某个功能的上线效果,因此需要一份能够实时反馈的数据作为补充(需求):

方案分析
广告投放实时数据场景
场景需求特点:

方案分析
最后的最后,笔者根据个人经验和目前看到的行业发展趋势,将上文的决策路径再次简化,仅代表一家之言。

当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我想为我的Rails网络应用程序提供推荐功能。特别是,我想向新注册的用户推荐他可能想要关注的其他用户。Rails中是否有用于此目的的引擎/gem?如果没有,我应该从哪里开始构建它?谢谢。 最佳答案 有Coletivogemhttps://github.com/diogenes/coletivo我试了一下。在MySQL上运行。Neo4jhttp://neo4j.org真的很容易实现一个“跟随谁”。事实上,大多数展示其能力的样本都涉及“跟随谁”。快速提示-只有在JRuby上运行时,Neo4j.rb才会很酷。如果不是-使用Neograph
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------