数据仓库如何实现湖仓一体数据分析?

简介: 随着云计算的普及和数据分析需求的扩大,数据湖+数据仓库的湖仓一体分析能力成为下一代数据分析系统的核心能力。相对于数据仓库,数据湖在成本、灵活性、多源数据分析等多方面,都有着非常明显的优势。IDC发布的十项2021年中国云计算市场趋势预测中,有三项和数据湖分析有关。可以预见,跨系统集成能力、数据控制能力和更加全面的数据驱动能力,将会是未来数据分析系统重要的竞争领域。

一. 背景

随着云计算的普及和数据分析需求的扩大,数据湖+数据仓库的湖仓一体分析能力成为下一代数据分析系统的核心能力。相对于数据仓库,数据湖在成本、灵活性、多源数据分析等多方面,都有着非常明显的优势。IDC发布的十项2021年中国云计算市场趋势预测中,有三项和数据湖分析有关。可以预见,跨系统集成能力、数据控制能力和更加全面的数据驱动能力,将会是未来数据分析系统重要的竞争领域。

 

AnalyticDB PostgreSQL版(简称ADB PG)是阿里云数据库团队基于PostgreSQL内核(简称PG)打造的一款云原生数据仓库产品。在PB级数据实时交互式分析、HTAP、ETL、BI报表生成等业务场景,ADB PG都有着独特的技术优势。作为一个数据仓库产品,ADB PG是如何具备湖仓一体分析能力呢?本文将会介绍ADB PG如何基于PG外表、打造数据湖分析能力。

 

图片 1.png

ADB PG继承了PG的外表(Foreign Table)功能,目前ADB PG的湖仓一体能力主要是基于外表打造的。基于PG外表,ADB PG可以对其他数据分析系统的数据进行查询和写入,在兼容多种数据源的同时,复用ADB PG原有的优化器和执行引擎优势。ADB PG的湖仓一体分析能力目前已经支持OSS、MaxCompute、Hadoop、RDS PG、Oracle、RDS MySQL等多种数据源的分析或者写入。用户可以灵活地将ADB PG应用于数据存储、交互式分析、ETL等不同领域,可以在单个实例中实现多种数据分析功能。即可以用ADB PG完成数据分析的核心流程,也可以作为众多环节中的一环去搭建数据链路。

 

不过,外表数据的分析依赖于外部SDK和网络IO来实现数据读写,由于网络本身的特性与本地磁盘有巨大差异,因此需要在技术层面与本地存储不同、需要不同的性能优化方案。本文以OSS外表数据读写为例,介绍ADB PG在构建湖仓一体分析能力时,所遇到的一些重要问题和解决方案。

 

二. 问题分析

ADB PG内核可以分为优化器、执行引擎和存储引擎。外表数据分析可以复用ADB PG原有的优化器和执行引擎的核心部分,仅需少量修改。主要扩展是存储引擎层的改造,也就是通过外表接口对外表数据进行读写。外表数据是存储在另一个分布式系统当中,需要通过网络与ADB PG进行连接,这是和读取本地文件的最核心的区别。一方面,不同的外表数据会提供不同的远程访问接口,需要在工程上进行兼容,比如OSS、MaxCompute的数据读取接口都不相同。另一方面,通过网络访问远程机器上的数据有一定的共性,比如网络的延迟、网络放大、带宽限制、网络稳定性问题等。

 

2.png

 

本文将会围绕上述核心挑战,介绍ADB PG外表分析项目在支持OSS数据分析过程中的一些重要技术点。OSS是一种阿里云推出的一种低成本分布式存储系统,存储了大量的冷热数据,有较大的数据分析需求。为了方便开发者进行扩展,OSS提供了基于Java、Go、C/C++、Python等主流开发语言的SDK。ADB PG采用了OSS C SDK进行开发。目前ADB PG已经完美支持OSS外表分析的各项功能,除建表语句不同外,用户可以像访问本地表一样访问OSS外表。支持并发读取和写入,支持CSV、ORC、Parquet等常见数据格式。

 

3.png

 

三. 外表分析技术优化

 

接下来,我们介绍ADB PG在基于OSS C SDK开发OSS外表分析过程中,解决的一些核心技术问题。

 

3.1 网络碎片请求问题

在分析型数据库场景,业界普遍认为列式存储在IO性能上强于行式存储。因为列式存储在扫描数据时,只需要扫描特定列,而行式存储毕竟扫描全量数据,因此列式存储可以节约一些IO资源。但是在开发过程中,团队发现在一些场景下,如字段较多的大宽表扫描,扫描性能较高的列存格式竟然比扫描CSV行存文本格式性能还要差。后经过定位发现一方面扫描ORC/PARQUET 格式时,客户端与OSS服务端交互次数过于频繁,另一方面ADB PG单次向OSS请求的数据量比较小。这两个原因带来了很大的性能问题。

 

我们知道,相比于本地磁盘IO,网络IO所产生的往返时延往往可以放大几个量级。因此,如果解析一些列存格式(如ORC/PARQUET)时,如果将网络请求当作本地磁盘请求处理,高压缩比所带来的网络带宽占用的减少不足以抵消碎片化请求带来的往返时延放大,因此性能测试结果低于预期。问题的解决方案,就是通过缓存来减少碎片化的网络请求。ADB PG每次扫描OSS数据都会“预加载”足够的数据并缓存,请求时,判定是否命中缓存,如果命中,则直接返回缓存;否则,继续下一轮次的“预加载”,从而降低网络请求次数,提高单次请求效率。“预加载”的缓存大小开放配置,默认大小为1MB。

5.png

3.2 列过滤与谓词下推

由于网络本身的IO性能往往是低于本地存储的IO性能的,因此在扫描外表数据时,要尽量减少IO的带宽资源消耗。ADB PG在处理ORC、Parquet格式的文件时,采用了列过滤和谓词下推技术,来达到这一目的。

 

列过滤,即外表只请求SQL查询所需的数据列、忽略不需要的数据列。因为ORC、Parquet都是列式存储格式,所以外表在发起网络请求时,只需请求所需列所在的数据范围即可,从而大幅减小网络I/O。同时,ORC、Parquet会对列数据进行压缩处理,进一步减小I/O。

 

谓词下推,是将执行计划里的上层的过滤条件(如WHERE子句中的条件),移动到下层的外表扫描节点,使外表扫描进行网络请求时,过滤掉不符合查询条件的数据块,从而减少网络I/O。在ORC/Parquet格式文件中,会在每一个block头部保存该block中每一列数据的min/max/sum等统计信息,当外表扫描时,会先读取该block的头部统计信息,与下推的查询条件进行比较,如果该列的统计信息不符合查询条件,则可以直接跳过该列数据。

 

这里简单介绍ORC格式的外表的谓词下推的实现方案。一个ORC文件按数据行分成若干个Stripe组成,Stripe中数据按列式存储。每个Stripe又分为若干个Row Group, 所有列的每10000行 组成一个Row Group。如下图所示。

6.png

 

ORC文件保存3个层次的统计信息,文件级别与Stripe级别的统计信息存储在ORC文件末尾,Row Group级别的统计信息在每个Stripe块头部存放。使用这3个层次的统计信息,ORC外表可以实现文件级过滤,Stripe级过滤以及Row Group级别过滤。具体做法是,每当扫描一个新的ORC文件,会先读取文件末尾的文件级统计信息,若不符合查询条件,则直接跳过整个文件的扫描;接着读取文件末尾所有Stripe级别的统计信息,过滤掉不符合条件的Stripe块;对于每个符合条件的Stripe块,读取块头部的Row Group 级别的统计信息,过滤掉不必要的数据。

 

3.3 “996”问题

OSS C SDK定义了一类错误代码,用于表示异常情况,这里的996是OSS C SDK中定义的错误码-996。类似的还有错误码-998、-995、-992等。这一类错误,通常都是网络异常导致的OSS外表导入导出失败。-996是最为常见的一种。

 

OSS C SDK内部使用CURL与OSS服务端进行网络交互,相应的CURL错误码,常见CURL 56(Connection reset by peer)、52等。这些网络异常,通常是由于OSS服务端在负载较高情况下,服务端主动剔除其认为“不活跃”的客户端连接所致。当需要导入或导出较大规模OSS数据时,由于客户端处于执行计划的不同阶段,不能长时间持有连接进行连续通信,从而被OSS服务端当作“不活跃”的客户端连接而关闭。

 

通常对于这种情况,客户端需要尝试重试解决。实际开发过程中发现,即使客户端接口增加了自动异常重试机制,这种异常依然得不到改善。后经过定位发现,OSS C SDK为提高连接效率,增加了CURL句柄的连接池,但这些网络异常的CURL句柄,也会存放到池中,因此,即使重试,还是会使用异常的CURL句柄进行通信,所以996异常的问题得不到改善。

 

既然知道了根本原因,解决的方法也很直观。我们在CURL句柄的回收接口中,增加对CURL句柄状态检查,对于异常的CURL句柄进行销毁,而不是加回连接池中。这样避免了连接池中存在无效的CURL句柄。客户端接口重试时,选择有效的或者创建新的CURL连接再次通信即可。当然,自动异常重试机制只能针对那些可以重试解决的情况。

 

7.png

 

① ADB PG访问OSS外表时,先从CURL连接池中获取连接,若不存在则新建。

② ADB PG使用CURL连接句柄与OSS Server请求通信。

③ OSS Server通过CURL连接句柄返回通信结果。

④ 正常返回的CURL连接句柄使用完毕后加回连接池待下次使用。

⑤ 异常状态的CURL连接句柄销毁。

 

3.4 内存管理方案的兼容问题

ADB PG基于PostgreSQL内核打造,也继承了PostgreSQL的内存管理机制。PostgreSQL的内存管理采用了进程安全的内存上下文MemoryContext,而OSS C SDK是线程安全的内存上下文APR Pool。在MemoryContext内存环境下,每个已经分配的内存,都可以显式的调用free释放,由MemoryContext进行内存碎片的整理,但在APR Pool中,我们只看到内存池的创建、内存的申请和内存池的销毁等操作,却没有内存的显式释放接口。

 

这种情况意味着,我们需要对于OSS C SDK接口所持有的内存的生命周期有明确的了解,否则极易出现内存泄漏和访问已经释放的内存等问题。通常我们会按照如下两种方式申请APR Pool的内存。

· 方式一适用于重入低频的操作接口,如获取OSS文件清单列表。

· 方式二适用于多次重入的操作接口,如周期性向OSS请求指定文件指定范围的数据。

 

通过这种方法,可以很好地解决ADB PG与OSS C SDK在内存管理方面的不兼容问题。

8.png

3.5 数据格式的兼容和优化

OSS上的数据,大部分采用CSV、ORC、Parquet等格式。由于ORC/Parquet等格式对数据的底层存储编码,与ADB PG的数据编码并不一致,所以当进行外表扫描时,数据类型转换是必不可少的步骤。类型转换,本质上是将数据从一种编码,改变成另一种编码方式。例如ORC对于Decimal类型的表示方式和ADB PG不相同,在ORC中Decimal64类型由一个int64存放数据的数字值,再由precision和scale表示数字个数和小数点位数,而在ADB PG中, Decimal类型由int16 数组来存放数据的数字值。格式转换算法需要对每个数据进行循环的除法与取模操作,这是非常耗费CPU的。

 

为了减少类型转换带来的CPU消耗,进一步优化外表查询性能,ADB PG在使用外表进行导出数据时,跳过类型转换步骤,直接将ADB PG的数据,以二进制形式写入到外表文件中,这样在查询外表时,也无需进行任何数据类型转换。例如,在导出ORC外表时,外表可以将任意的数据类型,都直接写入为ORC的Binary类型,在ORC中存储的二进制数据,都是按照对应ADB PG的数据类型来编码,于是在查询该ORC外表时,可以直接省略类型转换步骤,减少了CPU消耗。根据TPCH查询测试结果,整体查询性能可以提升15%-20%左右。

 

四. 性能测试

关于在ADB PG中如何使用外表分析功能,请参考阿里云产品手册(https://help.aliyun.com/document_detail/164815.html?spm=a2c4g.11186623.6.602.78db2394eaa9rq)。除建表语句不同外,对外表的操作和对本地表的操作几乎没有区别,学习难度很低。我们在这里对比一下OSS外表分析场景,与本地表分析场景的性能问题。

 

环境配置。我们测试采用的机器是阿里云ECS d1ne.4xlarge机型,单机配置16个Intel Xeon E5-2682v4核心、64GB内存,每台ECS配置4块HDD本地磁盘,每块盘读写速度约200MB/s。测试一共用了4台ECS,两台用于做Master节点、4台用于做Segment节点,共部署16个segment。本次测试使用的是TPCH查询,使用了官方工具生成的1TB数据集。

 

本地表我们测试了经过压缩的列存表(AOCS)和HEAP表两种格式, OSS外表我们测试了CSV、ORC、Parquet和JSON四种格式。TPCH 22条查询的总执行时间见下表。从测试数据可以看出,两种本地表中,AOCS表的查询性能略优于HEAP表。外表方面,CSV格式、ORC格式和Parquet格式的外表查询性略慢于本地表的查询性能,差距在50%左右。JSON格式的外表查询性能明显慢于其他格式,这主要是由于JSON格式本身解析速度慢导致的,与外表无关。

9.png

下图是TPCH 22条查询的详细时间。本地表与外表的性能差距在不同的查询上差距有所不同。考虑到外表在存储成本、灵活性、扩展能力方面的优势,ADB PG外表分析在应用场景的潜力是巨大的。

10.png

五. 总结

湖仓一体是下一代数据仓库产品的一个重要能力,ADB PG作为一款功能强大、扩展性强的数据仓库产品,基于PG 外表开发了多种数据源的分析和写入能力,并且沉淀了很多性能优化技术。未来ADB PG将继续在产品功能、性价比、云原生能力、湖仓一体等方向继续发力,为用户提供更多的功能、性能和成本优化。

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java应用全链路启动速度提升至15s,阿里云SAE能力再升级

简介: Java 作为一门面向对象编程语言,在性能方面的卓越表现独树一帜。但在高性能的背后,Java 的启动性能差也令人印象深刻,大家印象中的 Java 笨重、缓慢的印象也大多来源于此,高性能和快启动速度似乎有一些相悖。 近…

到底什么是“无源物联网”?

作者 | 小枣君来源 | 鲜枣课堂继Cat.1之后,2021年的物联网行业,又“喜提”了一个新的“风口”。这个“风口”的名字,叫做“无源物联网”。无源物联网,到底是个啥东东?它和现有的物联网技术之间,有什么区别&…

Gartner魔力象限到底有何“魔力”?

简介: Gartner魔力象限到底有何“魔力”?近日,Gartner发布了一系列最新魔力象限报告,在IT圈掀起了阵阵“龙卷风”,谁跻身全球第一阵营,谁跌出“领导者”象限,权威定调,众说纷纭&…

K8s 原生 Serverless 实践:ASK 与 Knative

简介: K8s 处在一个承上启下的位置,云原生用户使用 K8s 的目的是为了交付和管理应用,也包括灰度发布、扩容缩容等。但是对用户来说,实现这些能力,通过直接操作 K8s API 难免有些复杂。另外节省资源成本和弹性对于用户来…

react安装_前端大牛进阶---gt;React必会教程

一、背景介绍01React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源…

透过 3.0 Preview 看 Dubbo 的云原生变革

简介: 做过微服务开发的开发者相信对 Dubbo 都不陌生,Dubbo 是一款能帮助我们快速解决微服务开发、通信以及流量治理的框架。相比于之前只限定在 Java 语言范围内,Dubbo 的多语言版本在这两年呈现了良好的发展势头,其中&#xff0…

扩展云存储边界,阿里云推出全球首个云定义存储产品

云计算正带来一场消除线上线下存储边界的革命。 9月22日,阿里云宣布云存储服务全面升级,包括性能大幅提升300%、时延降低70%的ESSD云盘;可兼容HDFS的数据湖存储OSS,同时推出一款全新产品“云定义存储”(Cloud Defined…

Go Mysql Driver 集成 Seata-Golang 解决分布式事务问题

简介: 2020 年 4 月,我们开始尝试实现 go 语言的分布式事务框架 Seata-Golang。众所周知,Seata AT 模式以无业务代码侵入的特点,被广大开发者推崇。Java 版 Seata AT 模式通过对 DataSource 数据源进行代理,在 sql 语句…

安装redis提示[test] error 2_技术干货分享:一次flask+redis的微服务实战

先说一下需求的场景,策划部门想做一个垂直领域的社区产品,类似与知乎那种,但受益人群是金融行业的从业人员。产品中有一个搜索问题的需求,搜索的问题去题库中进行模糊匹配,终端支持H5/APP/小程序,甚至是微信…

实现阿里云容器镜像服务反向访问代理

简介: 本文会先介绍镜像推送/拉取过程的交互逻辑来梳理需要代理的所有服务,再通过搭建一个公网 HTTPS 反向代理来访问容器镜像服务来向您展示多场景代理访问模式原理。 真实业务场景可能很复杂,因安全、合规、访问限制等原因可能需要&#x…

数字基础设施开源操作系统欧拉全新发布

在华为全联接2021上,面向数字基础设施的开源操作系统欧拉(openEuler)全新发布。欧拉操作系统可广泛部署于服务器、云计算、边缘计算、嵌入式等各种形态设备,应用场景覆盖IT(Information Technology)、CT&am…

mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...

阅读文本大概需要3分钟。MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes )。以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引。如果表上定义有主…

共筑计算新生态 共赢数字新时代

[中国,深圳,2021年9月25日] 在华为全联接2021上,华为副总裁、计算产品线总裁邓泰华分享了六大数字生态的最新进展,并携手生态伙伴为计算产业带来一系列重磅内容:欧拉开源操作系统(openEuler)全新…

数据湖,已成为海量数据存储与分析的重要承载方式

简介: 在云计算和大数据时代,基于数据开展生产、运营、决策成为常态,根据Gartner报道,2019年数据基建方面的采购费用飙升到660亿美元,占据基础架构类软件费用的24%。数据的存储及应用体系是企业生态运转的中枢神经&…

Fluid 0.5 版本发布:开启数据集缓存在线弹性扩缩容之路

简介: 为了解决大数据、AI 等数据密集型应用在云原生场景下,面临的异构数据源访问复杂、存算分离 I/O 速度慢、场景感知弱调度低效等痛点问题,南京大学PASALab、阿里巴巴、Alluxio 在 2020 年 6 月份联合发起了开源项目 Fluid。 作者 | 顾荣 …

php生成cookie在哪,php程序中cookie的使用方法

Cookie 可以翻译为“小甜品,小饼干” ,Cookie 在网络系统中几乎无处不在,当我们浏览以前访问过的网站时,网页中可能会出现 :你好 XXX,这会让我们感觉很亲切,就好像吃了一个小甜品一样。这其实是…

c#类属性和实例属性_Visual C#类和对象的创建方式,定义类,实例化对象,实例讲解...

定义类类由class member类成员组成,包含字段、属性、方法和事件。其中字段和属性为类的数据成员,用来存储数据;方法负责数据的传递和运算。使用类之前,要进行声明,声明的语法如下:Class 类名称{访问权限 数…

面对不可避免的故障,我们造了一个“上帝视角”的控制台

简介: 混沌工程随着云原生的发展逐渐进入大家的视野,通过混沌工程可以很好地发现和解决在云原生化过程中的高可用问题。阿里巴巴在 2019 年开源了底层的混沌工程工具 - chaosblade,今年年初再次开源混沌工程控制台 chaosblade-box&#xff0c…

腾讯云鼎实验室发布云安全攻防矩阵,绘制九大攻防路径全景图

随着云计算技术和产业的蓬勃发展,企业上云已是数字化转型的必然趋势。但云上千般好,却也给企业带来了全新的安全挑战。云平台不仅要应对传统网络架构中存有的DDoS、入侵、病毒等常态问题,还要高度重视技术架构中虚拟机逃逸、资源滥用、横向穿…

Knativa 基于流量的灰度发布和自动弹性实践

简介: Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量,在高峰时自动扩容实例数;当请求量减少以后,自动缩容实例,做到自动化地节省资源成本。此外,Knative 还提供了基于流量的灰度…