【IT168 专稿】本文根据【2016 第七届中国数据库技术大会】(微信搜索DTCC2014,关注中国数据库技术大会公众号)现场演讲嘉宾张琪老师分享内容整理而成。录音整理及文字编辑IT168@田晓旭@老鱼。
嘉宾介绍:
张琪,百度高级产品经理、百度开放云(bce.baidu.com)大数据平台的产品负责人,热爱数据热衷布道,希望打造良心产品以及交流核心技术,帮助中国企业充分发挥其数据的商业价值。
正文:
我今天要和大家分享的主题是大数据时代的数据仓储。大数据和数据仓储,大家都耳熟能详,今天我换一个角度来和大家分享一下。
依靠科学方法来获得洞察力
首先我要和大家讲的是科学方法。下图是维基百科对此做出的解释。最开始是我们要在自然界中寻找一些现象,例如猜测DNA是不是一个双螺旋的结构,接下来可以提一些有趣的问题,如果DNA是双螺旋结构那么从上往下看应该是×形状。然后就是能够用实验来验证,比如使用X衍射的方法来证明DNA果然呈现了×形状,从而推断出DNA确实是一个双螺旋的形状。
在科学方法提出来之前,知识的传授更多的是靠口口相传。亚里士多德曾经在他的书里写到:男人的牙齿要比女人多三颗,因为他的老师是这么教他的。但是亚里士多德其实结过两次婚,他只要找他任何一个太太,张嘴,数一数他俩的牙齿是不是一样多,就能够验证这个定理是不是真的。但是很可惜,虽然他经历了两次婚姻,他也没有去做这个。所以我们现在非常强调科学方法,因为有了科学方法才能够帮助你去验证一个理论是不是正确,才能够获得最终的洞察力。
其实在整个科学方法里面最重要的就是这个小三角,即数据分析。你要开发一套可以检测的方法,收集数据来验证、推翻或者改良你的假设,这样你就能找到真的洞察力了。
根据维基百科来看数据分析其实是比较简单的三步。第一步收集原始数据,在这个大漏斗中,最左边的是自然环境中的各种信号、逻辑,通过收集把它转换成data,有了data之后进行各种的加工处理,把它变成计算机可以解决的一些信息,我们叫它information,在information的基础上再去进行分析,得到最后的洞察力,那就是intelligence。
第一步我们拿到的是data,第二步产生的是information,但是有一些说法是解决information的技术——information technology,IT过时了,而date technology是流行的,DT要比IT好。但大家看这个是不是倒过来了,因为DT是比较初等的,而IT比较高级。但是其实这个时代真正的IT应该是最右边的intelligence technology,就是你获得的真正的洞察力。这里还有一个例子可以证实我的观点。大家想一想乔丹当时为耐克作代言说的什么话?Just do IT,他并没有说Just do DT。希望大家把整个的数据分析的因和果、纲和目搞清楚,我们最终目标是要获得洞察力,而前面处理数据信息只是我们的方法而已。
OLAP vs OLAP
其实使用MySQL这样的OLTP是可以获得洞察力的,但是可以做并不代表它是优化的。其实我们现在讲得更多的是一个OLAP。我们做一个简单的对比,OLTP做的是什么?就是一些日常的事务处理,比如说你在ATM机上存取钱,这样一些小的CRUD的操作。而OLAP更多的是什么?分析。大家知道企业里面有一些数据科学家,在做分析的时候,它更多的是关于复杂的查询和机器的查询,你直接去发一个查询,它很快会把结果给你。
1.访问模式上,OLTP更多的是少量操作的数据,因为你的增删改,大多数时候都是一行的数据,而OLAP由于做复杂的查询,它会一下子跳出来很多很多的数据,有时候可能是全表查询。
2.数据类型,OLTP更多的是最新状态的切片,历史的数据都被覆写掉了,只有在你的日志里才能找到,而OLAP因为是要查询到整个状态,所以它就会带上时间标签,是完整的时间数据。
3.数据规模,MySQL这样子的数据库一般是到GB级,但是如果要做OLAP分析,数据规模少则是TB级,多则上就会到PB级。
4.数据更新,OLTP一般都是实时更新,进行数据操作以后,数据就已经进去了,但是OLAP可能会有一些延迟,例如ATM机器的状态更新了,但是它需要一定的时间把数据拉到数据仓库里面做分析,所以它会有一定的延迟,当然现在有越来越多的技术使时间窗口越来越小。
5.数据组织方式,OLTP大多采用的是第三范式,而OLAP更多的采用的数据结构是星型模型或扁平数据,会有一张很长的流水表作为它的维度表,有一些具体信息会放在组件里面,这样可以减少冗余。还有另一种做法,大数据时代来了,要做join其实还是很痛苦的,那么我们也允许一部分的数据冗余,索性就把这些数据打散,放到一张大表里面。
6.工具支持,数据分析其实是一个非常高大上的工作,会玩SQL是件好事,但是更多的情况下,能不能用一些业界非常流行的BI工具跟背后的系统进行整合,用户通过拖拖拽拽,就可以作出很多很漂亮的报表,获得最终的洞察力。大家要记得洞察力才是我们的终极目标,技术只是锦上添花。传统的OLTP的BI工具都会支持内存里的基于列的压缩技术,因为只有把数据打到内存里面来,并且以列的形式压缩好,交互速度才会非常快,同时也不会影响数据库的性能。但是反观OLAP,因为背后的数据量都是TB级到PB级的,传统的BI工具几乎都无法实现将这样的数据量压缩到内存,所以BI工具都是直接访问数据的。
应时代两大变化:大数据and云计算
OLTP、OLAP技术和很多的传统工具其实已经做得很好了,但为什么今天我们还要来讲这样的东西呢?这里我想引用的一句名言,就是格罗姆·地狱咆哮说的“时代变了”。
我们现在什么时代变了呢?在这里我主要强调两点,一个是大数据来了,数据量大和多样性是这个时代的鲜明特征。现在的数据时代,规整的结构化的数据是少量的,大量的是IOT互联网数据,社交数据,用户日志、行为。第二个时代变化就是云计算,虽然现在很多企业基于数据安全、企业技术倾向、历史问题等等原因还在做私有云,但是云计算还是势不可挡的来了。
云计算带来很多的好处,下面着重为大家讲一下托管服务。现在开源产品很受欢迎,大部分的商业产品都跟开源产品接口是兼容的。但是在运维产品的时候,大家不可避免的都会碰到各种各样的坑,若是要雇佣一个有开源产品运维能力的人,难度较大、薪资也会比较高。所以托管服务是很有优势的。例如现在要建一个Hadoop集群或者Spark集群,你要先审批,然后买硬件,装软件、部署、测试,如果将来业务量大了,还得重新去扩容。但是对于托管服务来说,在云端一键部署,几分钟就可以建一个集群。而且它除了快速开发还可以按需购买,你只需支付你使用期间的费用即可。它也可以支持弹性扩容,同时也具有高可用性和低运维成本,托管服务可以将运维交给团队工程师来做,大家只需专注于自己的业务就可以了。
大数据的问题怎么解决呢?现在基本上有两套技术,一套是Hadoop,这是大家非常熟悉的,这里只讲跟OLAP分析相关的Hadoop技术:底层的HDFS和YARN分别能够把存储、计算这两部分调动起来,我们上面有Hive、Pig可以做查询和批处理,右边的Spark SQL可以做内存查询,HBase是用来存储的。
接下来介绍一下Hadoop在存储引擎方面的特性:
1.Hadoop除了有HDFS之外,其实很多Hadoop的发行版本都是能跟云端的存储进行交互的,比如BOS。对象存储BOS是百度开发的一个对象存储用的HDFS接口。这样做的好处是你的存储不一定要放在自己的集群里,你可以做到存储与计算分离,大量的历史数据可以放到存储里面,然后直接从上面获取数据处理就可以了。
2.高效压缩的列存储,在分析型的场景里数据如果按照一行行存很是浪费,我们一般会对列做压缩存储。
3.数据分区,我把前天的业务数据放一个文件里面,昨天的业务数据放一个文件里面,那么在做查询的时候就不用对所有数据进行查询,只对需要的数据进行处理。
4.智能索引,现在一些开源产品引入了索引,很明显的提高了查询效率。
5.分布式数据库导入,对于Hadoop来说,底下的存储即使是S3、Azure Storage,不是本地的HDFS,它也是一个集群的结点,所以如果你从数据库导入的话,集群计算的效率是非常高的。
Hadoop查询引擎特性:
1.使用HiveQL、Spark SQL这些最常用的一些查询语言。
2.扩展性好,这本来就是Hadoop的特性。
3.基于价值的优化器,这项技术在传统的数据库和数据仓库里是非常常见的,现在Hadoop也在慢慢使用。
4.大表分布式join。
5.谓词下推。
总体来讲,Hadoop虽然不是天生为了OLAP而生的,但是上面有越来越多的技术能够在存储和查询上进行演化,同时它也借鉴了很多传统的数据库或数据仓库的分析型技术,正在向前发展。
术业有专攻,Hadoop虽然是一个非常好的技术,但是MPP仍然有它的优势。这里我们只讲一个非常特定的MPP实现。所谓MPP就是Massive Parallel Processing即大规模的分布式处理,下面我们讲其中一个架构——Shared Nothing。Shared Nothing架构从结构上看除了网络,节点之间的计算内容和磁盘是不共享的,它的好处也很明显,扩展性非常好。
有的数据仓储支持数据一条一条的增删改,但是Columnar Store不支持数据一条条地插入,只支持一大把数据录进去,录进去以后,数据是按照列存储的。列存储有很多的优势,例如在select几个列的时候,和别的列基本就没关系,而且当我往一个列存的时候,如果列里面相邻的数据都是一样的话,那么就会很容易做压缩,同时在查询的时候也有很大的优势。
所以MPP + Shared Nothing + Columnar Store这种关系数据仓储其实也能解决大数据的问题,打个比方,百度有一个Palo的产品,百度统计和百度搜索的背后都是这个Palo系统做支持,所以MPP也是一个非常好的解决大数据的方法。
MPP在存储方面的优势
1.支持分区与指派。分布式系统有很多物理的节点,我可以对数据可以进行一部分的分区,但是这个partition要落到哪个物理节点,我们是可以进行指派的。这样做的好处是当你做数据join的时候,如果组件相同但属于不同表的数据在一个物理节点的情况下,本地就可以操作。而Hadoop最早的HDFS是一个文件系统,它没有为多表数据join进行任何的优化。
2.单表容量上限到TB级。
3.复合分区是指很多的数据仓库会利用磁盘上不同性质的磁盘。
4.高效压缩的列仓储。
5.少批量导入和批量原子提交。
6.多版本并发控制MVCC。
7.高效的数据分布导入。
8.完善的分布式框架关系。
MPP本身就是关系型数据仓库,在查询方面有着得天独厚的优势。
1.完全兼容MySQL ,使用任何一个MySQL的工具都能够连上这个关系性数据仓库。
2.MPP架构扩展性非常好,但是MPP架构扩展性要比MapReduce差一些,PB级就是它的瓶颈,但是PB级以下MPP还是很有优势的。
3.大表分布式join,由于可以分区和指派,所以join性能是非常好的。
4.复杂谓词下推。
5.分区剪枝。
6.向量执行引擎。
7.库内分析。
8.丰富的SQL表达式。
下面对比一下Hadoop和MPP的相同点和不同点,帮助大家做技术架构的选型。
1.架构,Hadoop有非常流行的两个架构,一个是传统的Hadoop MapReduce,另一个是Spark Dataflow,而MPP比较流行的是MPP + Shared Nothing + Columnar。
2.数据,Hadoop能够处理结构化、半结构化,甚至是非结构化的数据。而MPP只能处理结构化关系型数据。
3.存储,Hadoop除了能够支持HDFS之外,它还有分区、压缩、索引这样的技术。MPP基本上跟它一样,唯一不一样的就是数据近邻。
4.查询接口,Hadoop上比较流行的是HiveQL、Spark SQL,但是传统的关联数据库一般都是兼容SQL的。
5.查询引擎,Hadoop和MPP基本上都是差不多的,但是传统的MPP架构的数据仓库分布式join和基于成本的优化器方面有得天独厚的优势。
大数据时代很多人都在关注Hadoop,对MPP关注不多,其实MPP和Hadoop是互补的技术,大家可以根据自己的业务需求来选择。
云时代的来临给我们带来了哪些变化呢?
1.随着大数据时代的来临,网站日志、用户行为数据、社交媒体、传感器等等都在云端产生了海量非结构化数据。
2.与企业外的云端数据交互获取更强的竞争力。
3.传统的数据仓库或者Hadoop集群建设,需要经过采购硬件、部署软件、开发运维等步骤,周期冗长,而且无法随着业务动态伸缩。
4.运维集群的IT成本日益凸显。
云端托管服务成功解决了上述问题。我们认为大数据时代的数据仓储应该是这样一个架构:
1.大数据时代来了以后,企业有很多非关系型数据,例如日志、图片、视频等,这样的数据是非常合适像Hadoop这样的大数据平台来处理,在云端我们有一个基于Hadoop的托管服务,叫做BMR,一键生成以后可以在里面做各种各样的应用。
2.如果企业内部的数据是一些强关系型的结构化数据,那么推荐大家放到关系型的数据仓库里面。将结构化数据通过ETL载入Palo中,Palo跟MySQL是完全兼容的,只要把数据放进去,原来所有的报表一行代码都不用改,就能够进行查询,速度也非常快。
3.通过Hive或者Spark SQL交互式查询BMR中的数据,用来做原型测试或者即席查询。这些组件支持运行时定义表模式(Schema on Read),方便处理弱结构化数据。非结构化数据可以通过MapReduce或Spark加工成结构化数据。
4.变形完成的结构化数据载入Palo,作为企业唯一真实版本(Single Version of the Truth),帮助企业部门之间协作。
5.通过SQL与Palo通讯,使用BI工具进行即席查询或者交互式分析,或者产生数字面板提供自动报表,以获取洞察力。
集成BI工具
现代商务要使用漂亮的界面来赢得客户,这就要求我们不单是提供数据仓储的技术,还要把整个环节打通,特别是和BI工具的集成。例如有两张表,表里各有3个列,把所有的数据都打到内存里面。在传统数据仓库背景下,MySQL的数据打到BI的报表里面进行交互式查询是可以的,但是在大数据时代的Hadoop或者MPP架构的数据仓库,它根本没有能力把所有的数据都加载进去。数据仓库更适合当中有一张很大的流水表,周围有很多的维度表这样的模式。我们可以把维度表的数据放到内存里面,但是那张巨大的流水表应该放到背后的数据仓库。
我在这里有一个demo可以和大家分享一下,这是一个产生Palo数据仓库的实例。 Palo的用法跟传统的关系数据库比较像,先建数据库和表,然后将数据批量导入进去,现在我背后的数据库差不多是有一张大表,大概600万条记录,总体是在500G,周围的维度表相应来说就小一点。这里有两个维度,是根据年和国家能够做一个利润统计,差不多一秒的时间查询结果就出来了。查询速度快的主要原因是它部分的维度数据是在内存里面,而真正的流水表数据已经放到我们的数据库进行查询。
数据仓库有Hadoop或MPP架构的产品,但是其实前台一定要想办法跟一个BI工具能够打通,因为在做商务分析的时候,写SQL当然是没有问题。但是数据分析是一个高冷的职业,要求员工既要懂业务,也要懂技术。我们应该把难度降下来,让更多的懂业务的人自己去操作自己去分析,如果我们能够跟一些世界优异的产品,特别是免费产品打通的话,那么对于企业应用数据仓库有很大的帮助。
百度开放云大数据平台
百度开放云在整个数据分析产品站上的产品还是比较全的,收集层我们提供公网上传、一部分硬盘上传,除此之外,还有一个原生的互联网的基于NQTT协议的IOT托管服务,如果你有设备想要定点上传,就可以使用这个服务。在存储上,除了传统的对象仓储之外,它还提供了HDFS接口。上面主要是BMR和Palo,还有一个机器学习BML,里面的深度学习模块应该是国内比较先进的。最上面,我们在这个产品上加入了商务智能、商品推荐、数字广告营销、设备预测性维保等等这些产品,你可以使用这些产品打造服务,给客户创造更多的价值。
展望数据仓储新未来
现在数据仓储的技术是基于Hadoop或者MPP,但是将来更多的会往逻辑数据仓库这个方向走。之前的逻辑仓库是先将数据定义一个schema,开始运算后把数据拿出来,虽然有很多传统公司这么做,但是因为技术不到位,所以不是那么主流。但是现在,像数据虚拟化这样的技术越来越成熟,这可能成为一个现实,它的好处就是每次查询的时候总是最新的数据,没有陈旧数据的缓存。另外我还可以对我的元数据进行管理,如果这个数据只是到我的Hive表里,除了这个表名大家可以进行搜索,能不能通过别的一些关键词描绘性地把它搜索出来,能不能做一些分类等。以前这些需求都是没有的,但是现在我们看到越来越多的客户在提这方面的需求。另外一个就是数据湖,不管是Hadoop还是Palo,都是一个托管的集群概念,你还是能够看到里面的节点,但是像数据湖的话,它是允许用户存在裸数据,不用ETL的过程,只存一个结果。另外我能不能把前面的查询做成一个全托管的服务,不生成集群,数据就放在存储里面,随时查询,随时就出结果。这样的话,我不使用集群,我也不为集群付钱,只为查询付钱。但是这里要强调一点,在用这样集群服务的时候一定要注意自己的语法兼容性,最好不要用一些私有的SQL语法,容易被绑定,要多考虑一些像Spark SQL这样开源的一些语言。
总而言之,大数据时代除了Hadoop还有MPP,只有这两者结合才会是一个比较好的解决方案。