阿里云交互式分析与Presto对比分析及使用注意事项本文由阿里巴巴耿江涛带来以“阿里云交互式分析与Presto对比分析及使用注意事项”为题的演讲。文章首先介绍了Presto以及它的应用场景、特点、架构和原理、数据模型、数据类型,并且以Presto数据查询作为实例。然后介绍了阿里云交互式分析,同时列举了它的优势和典型应用场景,对权限、数据类型、实例对象层级进行讲解,并且对交互式分析的两大场景进行实践分析,列举了几种表的特征设置,以阿里云交互式分析开发作为示例展示其过程。最后,概括性的总结了阿里云交互式分析与Presto的区别。

以下为精彩视频内容整理:Presto介绍Presto的应用场景 Presto是定位在数据仓库和数据分析业务的分布式SQL引擎,比较适合的应用场景有ETL、Ad-Hoc查询、海量结构化数据与半结构化数据分析以及海量多维数据聚合与报表。特别需要注意的是,Presto是一个数仓类产品,其设计目标并不是为了替代MySQL、PostgreSQL等传统的RDBMS数据库,对事务支持有限,不适合在线业务场景。Presto的数据都是在内存中,限制了在内存中的数据集大小。比如多个大表的join,这些大表是不能完全放进内存的。实际应用中,对于在presto的查询是有一定规定条件的,一个查询在presto查询超过30分钟,就需要杀掉这个任务,这说明该查询不适合在presto上使用。主要原因是,查询过大的话,会占用整个集群的资源,这会导致后续的查询是没有资源进行查询的,这与presto的设计理念是冲突的。如果在进行一个查询时,要等5分钟才有资源继续查询,这是不合理的,达不到理想的效果。Presto的特点 Presto有以下几个特点:• 多数据源目前Presto可以支持Mysql、PostgreSQL、Cassanda、Hive、Kafka、JMX等多种Connector。 • 支持SQL Presto已经可以完全支持ANSI SQL,并提供一个SQL Shell给用户,用户可以直接使用ANSI SQL进行数据查询和计算。• 扩展性Presto有很好的扩展性,开发人员可以很容易地开发出适合于自己特定数据源的Connector,并且可以使用SQL语句查询和分析自定义Connector中的数据。• 混合计算在数据库中的每种数据源都对应一种特定的Connector,用户可以根据业务需要在Presto中针对一种类型的Connector配置一个或者多个Catalog并查询其中的数据,用户可以混合多个Catalog进行join查询和计算。• 高性能经测试,Presto的查询平均性能是Hive的10倍以上。• 流水线由于Presto是基于PipeLine进行设计的,因此在进行海量数据处理的过程中,终端用户不用等到所有的数据处理完毕才能看到结果,而是可以像自来水管道一样,一旦计算开始,就可以立即产生一部分结果数据,并且结果数据会一部分一部分地呈现在终端客户面前。Presto架构及其原理




presto 条件比较 presto对比_SQL


如上图所示为Presto的架构图,其中Coordinator表示中心的查询角色,作用是接收查询请求、解析SQL、生成执行计划、任务调度以及worker管理。coordinator进行是presto集群的master进程。Worker是执行任务的节点。Connector是presto以插件形式对数据存储层进行了抽象,称作连接器,不仅包含Hadoop相关组件的连接器,还包括RDBMS连接器。 Discovery service是将coordinator和worker结合在一起的服务;worker节点启动后向discovery service服务注册,coordinator通过discovery service获取注册的worker节点。从架构图可以看出,Presto具有混合计算的优势,可以连接多种connector。Presto的数据模型


presto 条件比较 presto对比_数据_02


Presto的数据模型主要分为三个层级,第一个层级为Catalog,一个 Catalog 可以包含多个 Schema,物理上指向一个外部数据源,可以通过Connector访问该数据源。此外,一次查询可以访问一个或多个Catalog。第二个层级为Schema,它相当于一个数据库示例,一个Schema包含多张数据表。第三个层级为Table,表示数据表,它与一般意义上的数据库表相同。


presto 条件比较 presto对比_SQL_03


对于使用Presto,首先登录服务器客户端,输入hive命令并创建数据库为git_database。然后在客户端输入命令,可以连接到在hive创建的数据库git_database,连接命令为presto --server emr-header-1:9090 --catalog hive --schema --user hadoop。


presto 条件比较 presto对比_数据_04


上图为连接Presto的命令以及相应参数解释。Presto的数据类型Presto的数据类型分为数值类型、字符类型、日期和时间和复杂类型。其中数值类型有BOOLEAN,表示一个二值选项,值为TRUE或FALSE。TINYINT表示一个8位有符号整型,以二进制补码形式存储。SMALLINT表示一个16位有符号整型,以二进制补码形式存储。INTEGER表示一个32位有符号整型,以二进制补码形式存储。BIGINT表示一个64位有符号整型,以二进制补码形式存储。DOUBLE表示一个64位多精度的二进制浮点数值类型。 DECIMAL表示一个固定精度的数值类型,最大可支持38位有效数字,有效数字在17位以下性能最好。定义DECIMAL类型字段时需要确定两个字面参数:一是精度(precision)数值总的位数,不包括符号位,二是范围(scale)小数位数,可选参数,默认为0。示例:DECIMAL '-10.7'该值可用DECIMAL(3,1)类型表示。字符类型有VARCHAR表示一个可变长度的字符串类型,可以设置最大长度。示例:VARCHAR,VARCHAR(10)。CHAR表示一个固定长度的字符串类型,使用时可以指定字符串的长度,不指定则默认为1。示例:CHAR,CHAR(10)。日期和时间有DATE,表示一个日期类型的字段,日期包括年、月、日,但是不包括时间。示例:DATE ‘1988-01-30’。TIME表示一个时间类型,包括时、分、秒、毫秒。时间类型可以加时区进行修饰。示例:TIME '18:01:02.345',无时区定义,使用系统时区进行解析。TIME '18:01:02.345 Asia/Shanghai',有时区定义,使用定义的时区进行解析。TIMESTAMP表示一个时间戳类型的字段,时间戳包含了日期和时间两个部分的信息,取值范围为'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC,支持使用时区进行修饰。示例:TIMESTAMP '1988-01-30 01:02:03.321',TIMESTAMP '1988-01-30 01:02:03.321 Asia/Shanghai’ 。INTERVAL主要用于时间计算表达式中,表示一个间隔,单位可以是如下几个:YEAR-年、QUARTER-季度、MONTH-月、DAY-天、HOUR-小时、MINUTE-分钟、SECOND-秒、MILLISECOND-毫秒。示例:DATE '2012-08-08' + INTERVAL '2' DAY。复杂类型有JSON,表示字段为一个JSON字符串,包括JSON对象、JSON数组、JSON单值(数值或字符串),还包括布尔类型的true、false以及表示空的null。示例:JSON '[1,null, 1988]'JSON '{"k1":1,"k2": "abc"}’。ARRAY表示一个数组,数组中各个元素的类型必须一致。示例:ARRAY[1,2,3]。MAP表示一个映射关系,由键数组和值数组组成。示例:MAP(ARRAY['foo','bar'],ARRAY[1,2])。ROW表示一行数据,行中每个列都有列名对应,可以使用运算符+列名的方式来访问数据列。示例:CAST(ROW(1988,1.0,30) AS ROW(y BIGINT,m DOUBLE,d TINYINT ))。IPADDRESS表示一个IPv4或IPv6地址。内部实现上,将IPv4处理成IPv6地址使用(IPv4到IPv6映射表)。示例:IPADDRESS '0.0.0.0', IPADDRESS '2001:db8::1'。Presto数据查询示例 在hive中创建分区表和非分区表,并创建库和表:• 非分区表创建CREATE TABLE weather (

city STRING ,temp_lo int, -- 最低温度temp_hi int -- 最高温度

); INSERT INTO weather VALUES

('beijing',40,50),('hangzhou',46,55);

• 分区表创建 create table odps_test2( shop_name string, customer_id string, total_price INT )partitioned by (sale_date string);INSERT overwrite table odps_test2 partition (sale_date='2013')values ('shop', '1234', 12);INSERT overwrite table odps_test2 partition (sale_date='2014')values ('rest', '1111', 13);INSERT overwrite table odps_test2 partition (sale_date='2015')values ('texy', '2222', 14);


presto 条件比较 presto对比_SQL_05


上图所示为Presto非分区表查询。


presto 条件比较 presto对比_presto 条件比较_06


上图所示为Presto分区表查询。阿里云交互式分析介绍什么是交互式分析 交互式分析是大数据生态体系下的实时交互式分析产品,支持PB级数据高并发实时写入实时查询,完全兼容PostgreSQL协议,可以使用主流BI工具(如Tableau、帆软等)或SQL客户端轻松访问数据、开展BI分析或者即席查询分析。 在离线大数据场景上,交互式分析(Interactive Analytics)与MaxCompute无缝打通,为MaxCompute提供交互式查询服务,真正实现“一套数据,两种计算”。使用熟悉的工具以标准SQL查询分析MaxCompute项目中的数据,快速获取查询结果。也可使用主流BI工具(如Tableau、帆软等)或SQL客户端轻松连接到MaxCompute项目,开展BI分析或即席查询。也可以利用交互式分析(Interactive Analytics)的快速查询特性,将项目表数据封装成API对外服务,无需数据迁移就能够支持更丰富的应用场景。 交互式分析(Interactive Analytics)提供无服务器计算(Serverless)的服务方式,无需管理任何基础设施,只需为运行的查询付费。交互式分析的优势 交互式分析(Interactive Analytics)兼容PostgreSQL生态、支持MaxCompute数据直接查询分析,支持实时写入实时查询,实时离线联邦分析,低成本、高时效、快速构筑企业实时数据仓库。 • 极速响应 PB级数据亚秒级查询响应,满足用户实时多维分析透视和业务探索需求。支持向量化计算及列存储智能索引,性能大幅领先于开源系统。 • MaxCompute加速查询 无缝对接MaxCompute,无需移动数据,直接交互式分析,快速获取查询结果。可以单独查询MaxCompute,也可以与实时数据结合进行联合计算。 • 高并发实时写入和查询 支持高并发实时数据的实时写入和实时查询,写入速度可达数亿TPS,写入即可查。 • 统一引擎架构 采用统一的引擎架构,支持行存和列存两种存储模式,同时满足点查询、即席查询及OLAP场景。 • 简单易用 兼容PostgreSQL生态,与大数据计算引擎及智能云研发平台DataWorks无缝链接。交互式分析典型应用场景


presto 条件比较 presto对比_数据_07


实时数仓场景如上图所示。业务数据实时写入实时计算,并将数据进行ETL处理,再由交互式分析实时查询,最终输出到第三方分析工具,实现实时数据的实时分析。该场景下的典型应用有:数据部门的实时数仓、实时大屏、实时Reporting报表分析。也用于运维和数据应用的实时监控、实时异常检测预警、实时Debug。同时用于业务部门的实时风控、实时推荐、实时效果分析、实时训练等。


presto 条件比较 presto对比_分区表_08


MaxCompute加速查询场景如上图所示。业务数据写入离线数仓MaxCompute,由交互式分析直接加速查询或导入查询,再对接BI分析工具,轻松实现离线数据的实时分析。该场景下的典型应用有:MaxCompute离线数据的实时查询。此外,也用于MaxCompute离线数据报表分析以及MaxCompute离线数据的在线应用输出(例如RESTful API)。


presto 条件比较 presto对比_数据_09


实时离线联邦分析场景如上图所示。业务数据按冷热分开存储,冷数据存储在离线数仓MaxCompute,热数据存储在交互式分析,通过交互式分析实现实时离线数据联邦分析,再对接BI分析工具,快速响应简单查询与复杂多维分析的业务要求。 交互式分析权限介绍


presto 条件比较 presto对比_presto 条件比较_10


实例内的角色层级关系和权限介绍如上图所示。以下为交互式分析(Interactive Analytics)中常用的角色名称定义。 Cluster Admin:管理整个集群。可创建、销毁instance。阿里云内部管理人员,权限不对外。 superuser:某个项目内的实例(instance)内的管理员,系统默认将实例申请账号的拥有者设定为superuser。拥有整个实例的权限,可创建、销毁DB,也可创建角色以及为角色授权等。 DB owner:某个DB的owner。系统默认superuser是DB的Owner,但superuser可授权给某个用户,让其成为DB Owner。 普通用户:经过授权后,可在某个DB里执行普通的SQL。需要更多的权限,需要向superuser申请。交互式分析数据类型介绍


presto 条件比较 presto对比_数据_11


上表为基本类型介绍。其中重点为double precision、text、timestamp with time zone以及date。


presto 条件比较 presto对比_presto支持标准sql吗_12


presto 条件比较 presto对比_presto 条件比较_13


上图所示为基础简单操作。需要注意的是:对于timestamp with time zone类型,SQL标准通过判断timestamptz类型数据的“+”或者“-”符号以及符号后面的时区偏移来识别时区,如果未表明时区偏移,将会有一个默认时区添加到数据上。交互式分析支持precision的范围从0到38,scale范围支持从0到precision。交互式分析的decimal需要明确指定precision和scale信息,不能使用省略的方式。


presto 条件比较 presto对比_数据_14


数组类型包括int4[]、int8[]、float4[]、float8[]、boolean[]、text[]。上图所示为插入数据和查询数组类型的数据示例。


presto 条件比较 presto对比_数据_15


在插入数据时,例如,ARRAY可以使用ARRAY关键字,如上图所示。


presto 条件比较 presto对比_数据_16


也可以使用{}表达式,如上图所示。


presto 条件比较 presto对比_presto 条件比较_17


查询数组中单个元素,如上图所示。


presto 条件比较 presto对比_presto支持标准sql吗_18


查询数组中部分元素,如上图所示。交互式分析实例对象层级介绍


presto 条件比较 presto对比_分区表_19


交互式分析新增schema功能之后,表的存储结构从database.table改变为database.schema.table。每一张表归属于一个schema,一个Database可以有多个schema。不同的schema下可以有相同的对象(表名、数据类型等)。 交互式分析当前版本主要支持create schema,alter schema rename以及在schema的建表功能。暂时不支持drop schema。交互式分析场景分类 交互式分析场景分为MaxCompute直接分析使用场景和MaxCompute导入查询使用场景。MaxCompute直接分析使用场景作为首选方案,查询数据量小于100GB(经过分区过滤后,命中分区的大小,与查询相关字段的大小无关)。MaxCompute导入查询使用场景指单表查询数据量大于100GB、复杂查询、含索引的查询、数据需更新、insert操作的场景。针对MaxCompute直接分析使用场景,MaxCompute非分区表数据查询过程如下:


presto 条件比较 presto对比_presto 条件比较_20


首先在MaxCompute中创建非分区表。


presto 条件比较 presto对比_presto支持标准sql吗_21


然后建立交互式分析与MaxCompute的映射表。针对MaxCompute直接分析使用场景,MaxCompute分区表数据直接查询过程如下:


presto 条件比较 presto对比_presto 条件比较_22


首先在MaxCompute中创建分区表。


presto 条件比较 presto对比_SQL_23


然后建立交互式分析与MaxCompute的映射表。针对MaxCompute导入查询使用场景,MaxCompute非分区数据导入查询过程如下:


presto 条件比较 presto对比_分区表_24


首先在MaxCompute中创建非分区表并插入数据。


presto 条件比较 presto对比_presto 条件比较_25


然后建立交互式分析与MaxCompute的映射表。


presto 条件比较 presto对比_presto 条件比较_26


在交互式分析中创建真实存在的表。


presto 条件比较 presto对比_数据_27


最后,将MaxCompute源头表中的数据导入到交互式分析。针对MaxCompute导入查询使用场景,MaxCompute分区数据导入查询过程如下:


presto 条件比较 presto对比_presto支持标准sql吗_28


首先在MaxCompute中创建非分区表并插入数据。


presto 条件比较 presto对比_presto 条件比较_29


然后建立交互式查询与MaxCompute的映射表。


presto 条件比较 presto对比_数据_30


在交互式分析中创建真实存在的表。


presto 条件比较 presto对比_presto支持标准sql吗_31


在交互式分析中建立子分区。


presto 条件比较 presto对比_数据_32


最后,将MaxCompute中的数据导入交互式分析的子分区表。表的特征设置


presto 条件比较 presto对比_分区表_33


上图所示为orientation的设置,在交互式分析(Interactive Analytics)中,数据库表默认为列存(column store)形式。列存对于OLAP场景较好,适合各种复杂查询,行存对于kv场景较好,适合基于primary key的点查和扫描scan。


presto 条件比较 presto对比_分区表_34


上图所示为clustering key的设置,互式分析(Interactive Analytics)会在聚簇索引上对数据进行排序,建立聚簇索引能够加速用户在索引列上的range和filter查询。clustering_key指定的列必须满足非空约束(not null)。clustering_key指定列时,可在列名后添加 :desc或者asc来表明构建索引时的排序方式。排序方式默认为asc,即升序。数据类型为float或double的列,不能设置为clustering_key。


presto 条件比较 presto对比_分区表_35


上图所示为bitmap columns的设置,bitmap_columns指定比特编码列,交互式分析(Interactive Analytics)在这些列上构建比特编码。bitmap可以对segment内部的数据进行快速过滤,所以建议用户把filter条件的数据建成比特编码。设置bitmap_columns要求orientation为 column,即列存表。bitmap_columns适合无序且取值不多的列,对于每个取值构造一个二进制串,表示取值所在位置的bitmap。bitmap_columns指定的列可以为null。默认所有text列都会被隐式地设置到bitmap_columns中。


presto 条件比较 presto对比_分区表_36


上图所示为dictionary encoding columns的设置,dictionary_encoding_columns指定字典编码列,交互式分析(Interactive Analytics)为指定列的值构建字典映射。字典编码可以将字符串的比较转成数字的比较,加速group by、filter等查询。设置dictionary_encoding_columns要求orientation为column,即列存表。dictionary_encoding_columns指定的列可以为null。无序但取值较少的列适合设置dictionary_encoding_columns,可以压缩存储。默认所有text列都会被隐式地设置到dictionary_encoding_columns中。


presto 条件比较 presto对比_presto支持标准sql吗_37


上图所示为time to live in seconds的设置,time_to_live_in_seconds指定了表的生存时间,单位为秒,必须是非负数字类型,整数或浮点数均可。


presto 条件比较 presto对比_数据_38


上图所示为distribution_key的设置,distribution_key属性指定了数据库表分布策略。columnName部分如设置单值,不要有多余空格。如设置多值,则以逗号分隔,同样不要有多余的空格。distribution_key指定的列可以为null。交互式分析中,数据库表默认为随机分布形式。数据将被随机分配到各个shard上。如果制定了分布列,数据将按照指定列,将数据shuffle到各个shard,同样的数值肯定会在同样的shard中。当以分布列做过滤条件时,交互式分析可以直接筛选出数据相关的shard进行扫描。当以分布列做join条件时,交互式分析不需要再次将数据shuffle到其他计算节点,直接在本节点join本节点数据即可,可以大大提高执行效率。 交互式分析开发实例购买交互式分析实例如下所示:


presto 条件比较 presto对比_presto支持标准sql吗_39


点击链接,进入购买实例界面,选择对应的交互式分析region,公测阶段主要是华东1、华东2、华北2、华南1,然后选择购买的计算资源,并对实例命名,选择购买时长,最后点击购买。


presto 条件比较 presto对比_presto支持标准sql吗_40


确认交互式分析的地域,计算资源,以及设置的实例名称,最后点击去支付。查看交互式分析实例如下所示:


presto 条件比较 presto对比_SQL_41


进入控制台点击DataWorks,选择左侧列表中的计算引擎列表,选择交互式分析,查看当前购买交互式分析实例。创建项目空间如下所示:


presto 条件比较 presto对比_presto 条件比较_42


选择左侧列表中的工作空间列表,并点击页面的创建工作空间。


presto 条件比较 presto对比_数据_43


填写相应的工作空间名称,显示名,以及模式选择。


presto 条件比较 presto对比_SQL_44


选择引擎为交互式分析,点击下一步。 创建工作空间如下所示:


presto 条件比较 presto对比_分区表_45


选择实例显示名称以及选择交互式分析实例名称,数据库名默认为postgres。添加子账户到到该项目空间如下所示:


presto 条件比较 presto对比_presto支持标准sql吗_46


选择新建的项目空间点工作空间配置,选择左侧列表中的成员管理将需要添加到该项目空间的子账户添加到该项目空间。交互式分析开发如下所示:


presto 条件比较 presto对比_数据_47


进入Dataworks界面,点击该交互式分析的项目空间,点击左侧的全部产品,选择Holo Studio,进行开发。


presto 条件比较 presto对比_presto支持标准sql吗_48


创建新的文件夹,并创建节点名称,默认数据库为postgres。


presto 条件比较 presto对比_分区表_49


进入Holo Studio点击新建文件夹,创建交互式分析的节点,在此创建新的数据库为git_database。


presto 条件比较 presto对比_分区表_50


点击右上角的配置按钮,进入工作空间管理,进入管理界面。实例开通成功后,系统会默认生成一个名为postgres的数据库,但该数据库分配的资源小,若需要走生产任务,建议创建一个新的业务数据库。


presto 条件比较 presto对比_presto支持标准sql吗_51


进入工作空间配置,点击计算引擎信息中的的交互式分析,可以查看到交互式分析实例的相关信息,在这里点击绑定交互式分析DB。


presto 条件比较 presto对比_数据_52


点击绑定交互式分析按钮,填写在Holo Studio中的创建的数据库git_database,然后点击测试联通性,点击确定。交互式分析子账户授权如下所示:


presto 条件比较 presto对比_数据_53


使用主账号登录控制台,点右侧人像,点击访问控制,查看当前所有用户。


presto 条件比较 presto对比_分区表_54


选择左侧列表中的用户管理需要添加到Holo Studio的用户,并点击。


presto 条件比较 presto对比_数据_55


点击用户名称,可以查看到用户的基本信息,在UID字段中可以看到一串数字,将这UID记录下来。


presto 条件比较 presto对比_分区表_56


进入所开发的Holo Studio的界面,在所建立的文件夹下,点击Holo节点,输入图片中的语句create user “p4_” SUPERUSER,这里的UID即是上页保存的UID。 阿里云交互式分析与Presto的区别总之,阿里云交互式分析的适用场景为实时数仓和联邦查询(MaxCompute、Mysql、OSS…),实例架构对应飞天操作系统(内存+存储混合型),操作方式为HoloStudio界面开发,也支持其他bi工具,并且兼容Postgres。数据模型层级分为Instance、database、schema和table。权限控制为简单或复杂模型+Grant语句。数据类型支持复杂类型,支持表属性设置。SQL为Postgres SQL,支持数据存储,可以实时写入、实时更新。生态(BI工具)为Tableau、帆软主流BI+云QuickBI。 而Presto的适用场景为联邦查询(Hive、Mysql、MongoDB…)。实例架构对应Presto架构(MPP),操作方式为客户端操作。数据模型层级分为Catalog、Schema和Table。权限控制为Grant语句,数据类型支持复杂类型,不支持表属性设置,SQL是Presto SQL,不支持数据存储,不支持数据更新,生态(BI工具)为Tableau、帆软等主流BI。