阿里云MaxCompute存取性能测试报告

article/2025/8/15 6:49:57

阿里云MaxCompute存取性能测试报告

文章目录

  • 阿里云MaxCompute存取性能测试报告
    • 前言
    • MaxCompute介绍
    • 查询测试报告
      • 测试方案一
      • 测试方案二
      • 使用建议
    • 写入测试报告
      • 测试方案一
        • 生成SQL的类
      • 测试方案二
      • 测试方案三
      • 测试方案四
      • 使用建议
    • 后记


前言

前几天公司给我安排了个任务,让我去测试一下阿里云DataWork下的MaxCompute的存取性能,这不,测试报告来了。

MaxCompute介绍

MaxCompute(ODPS)是适用于数据分析场景的企业级SaaS(Software as a Service)模式云数据仓库,以Serverless架构提供快速、全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使用户可以经济并高效地分析处理海量数据。

MaxCompute适用于100 GB以上规模的存储及计算需求,最大可达EB级别,并且MaxCompute已经在阿里巴巴集团内部得到大规模应用。MaxCompute适用于大型互联网企业的数据仓库和BI分析、网站的日志分析、电子商务网站的交易分析、用户特征和兴趣挖掘等。

官方学习路线:https://www.alibabacloud.com/zh/getting-started/learningpath/maxcompute

查询测试报告

测试方案一

多线程SQL查询

查询场景:

  • 单表查询,只查询单字段,共610万条数据
  • 每次查询一万条(服务端限制了只能一次查一万)

测试结果如下:

启动时间线程数花费时间
10:11203m10s
10:16302m28s
10:21501m37s
10:23701m9s
10:261001m3s
10:2720046s
10:2940044s
10:3050043s

由于这波操作属于IO密集型,故提高线程数可以有效的减少花费时间,提高到100-200时性价比应该是最高的。

核心代码:

	@Testpublic void test6() throws InterruptedException {// 查询code值String codeQuery = String.format("select distinct code from %s;", table);List<Map<String, Object>> list = MaxComputeUtil.queryData(codeQuery , true);log.info("获得code数据共{}条", list.size());// 建立线程池ThreadPoolExecutor pool = new ThreadPoolExecutor(20, 20, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(500));for (Map<String, Object> map : list) {String code = (String) map.get("code");pool.execute(new Test(code));}pool.shutdown();boolean awaitTermination = pool.awaitTermination(300, TimeUnit.SECONDS);if (!awaitTermination) log.warn("运行超时");log.info("执行完毕,所有数据,共{}条", Test.count);}
@Slf4j
class Test implements Runnable {public static long count = 0;private final String sql = "select code from table where code= '%s' and pt = 1;";private final String code ;public Test(String code) {this.code= code;}@Overridepublic void run() {int now = 1;int size = 10000;int sum = 0;while (true) {List<Map<String, Object>> list = MaxComputeUtil.queryPageData(sum += list.size();if (list.size() < size) break;}log.info("运行完毕,共{}条数据", sum);count += sum;}}

测试方案二

使用TableTunnel DownloadSession 进行数据下载

这个是官方推荐使用的批量传输通道,是一套可以查询数据和存入数据的SDK,可以用来代替SQL。

但是不知道为什么这个速度特别慢,总是卡在一个地方不动,一卡一卡的,一点也不流畅。

首先获取连接会话的时候,直接等了4分钟才连接上:

image-20220901112318069

但是我去开启UploadSession进行数据上传(这个后面有讲),也没有像这样等待这么久,速度一般也就是一两秒,偶尔连接的时候会要10多秒。

我猜测可能是由于使用这个DownloadSession的客户端比较多,服务端资源提供不过来?或者是我们的网络和这个会话服务端的网络连接不通畅?连接上之后,每获取几条十几条数据就要等待一段时间,最终跑 118,064 条数据,花费时间13分钟,建议直接ban掉。

使用建议

使用方案一的多线程SQL查询,一次虽然只能查询一万条,但是多线程查询下速度还是可以接受的。

写入测试报告

首先我新建了一张表,表结构如下:

-- 此表结构取自官方文档:https://www.alibabacloud.com/help/zh/maxcompute/latest/use-the-maxcompute-client-create-tables#section-gwe-8vc-iwx
create table if not exists t_salary_write_test
(age             BIGINT comment '年龄',job             STRING comment '工作类型',marital         STRING comment '婚否',education       STRING comment '教育程度',credit          STRING comment '是否有信用卡',housing         STRING comment '是否有房贷',loan            STRING comment '是否有贷款',contact         STRING comment '联系方式',month           STRING comment '月份',day_of_week     STRING comment '星期几',duration        STRING comment '持续时间',campaign        BIGINT comment '本次活动联系的次数',pdays           DOUBLE comment '与上一次联系的时间间隔',previous        DOUBLE comment '之前与客户联系的次数',poutcome        STRING comment '之前市场活动的结果',emp_var_rate    DOUBLE comment '就业变化速率',cons_price_idx  DOUBLE comment '消费者物价指数',cons_conf_idx   DOUBLE comment '消费者信心指数',euribor3m       DOUBLE comment '欧元存款利率',nr_employed     DOUBLE comment '职工人数',fixed_deposit   BIGINT comment '是否有定期存款'
);

测试方案一

单线程,本地生成数据和SQL语句进行插入,每次插入一条数据,测试结果:

测试时间插入数据条数耗时
15:08201m52s
15:10528s
15:121048s

这个测不动,太慢了。。。时间都花在提交任务上去了,其实执行没花多少时间。

生成SQL的类

具体内容我过几天单独写一篇博客来讲😋到时候我把链接贴在这里

纯手搓,可以适用不同的表,主要是利用反射机制获取对象当中的字段和字段值,然后拼接成SQL语句,实现了单数据插入和批量插入的生成方法。

需要注意对其中的特殊部分进行特殊处理,字符串之类的字段是需要添加引号的。

测试方案二

多线程,每个线程都单独插入5条数据,测试结果:

测试时间线程数耗时
15:20225s
15:22532s
15:241029s
15:252042s
15:265052s
15:281001m30s
15:312002m59s
15:385009m32s

这个也测不动,太慢了,直接放弃。

测试方案三

使用官方SDK中的TableTunnel(UploadSession)进行批量传输(官方推荐),https://www.alibabacloud.com/help/zh/maxcompute/latest/simple-upload

以下是使用单线程的传输速度。

测试时间插入数据条数耗时
17:2410002.5s
17:24100003.3s
17:2910000012.4s

这速度就很快了,前面两种方案直接ban掉。

官方文档的解释是这种传输方式建议用在上传大量数据的场景(>64M)下进行使用,因为它里面需要构建一东西,比较消耗资源(这个说明的具体地方我找不到了,贴个大概的),https://www.alibabacloud.com/help/zh/maxcompute/latest/data-upload-and-download-overview。

核心代码:

    @Testpublic void uploadSessionTest() {int count = 1000;TableTunnel.UploadSession uploadSession = MaxComputeUtil.getUploadSession(tableName, "pt=1");// 生成TunnelBufferedWriter的实例try (RecordWriter recordWriter = uploadSession.openBufferedWriter()) {for (int i = 0; i < count; i++) {// 创建一条新记录和新的待插入数据Record record = uploadSession.newRecord();BankData bankData = generateData(new BankData());// 把数据转换到 record 对象当中generateRecord(record, bankData);// 调用write接口写入数据。recordWriter.write(record);}// uploadSession提交,结束上传。uploadSession.commit();log.info("commit ok!");} catch (TunnelException | IOException | IllegalAccessException e) {e.printStackTrace();}}

数据填充:

    private <T> void generateRecord(Record record, T object) throws IllegalAccessException {// 通过反射Field[] fields = object.getClass().getDeclaredFields();for (Field field : fields) {field.setAccessible(true);record.set(field.getName(), field.get(object));}}

创建UploadSession的方法:

	public static TableTunnel.UploadSession getUploadSession(String tableName, String partition) {log.info("开始创建 UploadSession");// 创建TableTunnelTableTunnel tunnel = new TableTunnel(OdpsInstance.getInstance());// 需要指定的分区PartitionSpec partitionSpec = new PartitionSpec(partition);TableTunnel.UploadSession uploadSession;try {uploadSession = tunnel.createUploadSession(projectName, tableName, partitionSpec);} catch (TunnelException e) {throw new RuntimeException("创建 uploadSession 失败", e);}log.info("UploadSession 创建完毕");return uploadSession;}

测试方案四

使用SQL进行批量插入,将多条插入数据的SQL拼接成一条SQL(代码在上面方案一里),单线程运行。

测试时间插入数据条数耗时
10:1010009s
10:111000030.6s
10:16100000报错

测试十万记录的报错是因为SQL太长了,导致单次发送的HTTP请求数据量过大,造成数据异常。

在这里插入图片描述

性能比单数据插入的性能高上了很多,但相比于官方推荐的批量传输方式还是慢了很多。

使用建议

上传数据的话,如果数据量比较大(十万条数据以上),使用UploadSession进行上传是会比较好的,速度很快,如果数据量不大,那么使用批量上传的SQL也是完全可以的,虽然慢一点,但是可以减少很多不必要的资源消耗。

这两种方式都可以使用多线程来提高速度,速度会比上面测试的要更快。

后记

本篇文章主要是讲MaxCompute的存取性能如何,里面的代码都是只有核心部分的,完整的代码不方便贴。不过主要还是看它的性能如何,能达到什么样的存取速度。

最后不得不说,MaxCompute做的确实很不错了,几百万条数据全部取出来只要花一分钟不到的时间,存数据也可以达到10M/s(前提是你的网速达标)。

如果本篇文章对你有帮助,欢迎点赞收藏评论关注😋,也欢迎在评论区指出文章中写的不对的和不好的地方🥰。


http://chatgpt.dhexx.cn/article/jATFplb6.shtml

相关文章

【测试报告】Java文档搜索引擎性能测试报告

【测试报告】Java文档搜索引擎性能测试报告 10个线程---300秒&#xff08;5分钟&#xff09;概要吞吐量响应时间随时间变化 20个线程---300秒&#xff08;5分钟&#xff09;概要吞吐量响应时间随时间变化 10个线程—300秒&#xff08;5分钟&#xff09; 概要 吞吐量 响应时间 …

Jmeter导出性能测试报告

在电脑任意一个盘创建一个存放Jmeter文件的文件夹。我这里创建在F盘 2. 打开Jmeter你需要导出的执行文件的工程文件&#xff0c;连计划一起保存到创建的Jmeter_project文件夹里面。&#xff08;如果不是计划一起保存会出现报错&#xff09; 编写Jmeter导入测试报告语句。 jme…

电商平台性能测试报告

性能测试报告 概况 A3Mall是一个电商系统平台&#xff0c;是一个面向B2B、B2C的电商平台。 1.1测试背景 A3Mall电商平台通过体验用户反馈业务市场调研及分析&#xff0c;项目部门与业务部门进行交流沟通&#xff0c;确保用户反馈后的有效需求说明书&#xff0c;参照用户需求…

性能测试报告编写技巧

在对结果进行分析并得出结论之后&#xff0c;性能测试工程师要把它们以文字报告的形式发送给相关人员。这就是性能测试报告。除了书面文字之外&#xff0c;可能的话&#xff0c;公司还会召集人员开专门的会议进行报告讲解和结果分析。所以&#xff0c;性能测试报告是性能测试工…

性能测试报告(实例)

测试报告是一次完整性能测试的体现&#xff0c;所以&#xff0c;这里我给出一个完整的性能测试报告&#xff0c;相信通过这个报告&#xff0c;我们会整性能测试有个整体的了解&#xff0c;知道我们在以后做性能测试时需要做哪些工作。 注明&#xff1a;1.性能测试报告模板很多&…

性能测试报告,实例讲解

上一篇博文主要通过两个例子让测试新手了解一下测试思想&#xff0c;和在做测试之前应该了解人几点&#xff0c;那么我们在如何完成一次完整的性能测试呢&#xff1f; 测试报告是一次完整性能测试的体现&#xff0c;所以&#xff0c;这里我给出一个完整的性能测试报告&#xf…

Jmeter生成HTML性能测试报告

目录 1、前言 2、生成报告 2.1、方式一 2.2、方式二 3、查看报告 3.1、Dashboard&#xff08;仪表板&#xff09; 3.2、Charts&#xff08;图表&#xff09; 3.3、Customs Graphs&#xff08;定制图表&#xff09; 1、前言 使用 Jmeter 进行性能压测时&#xff0c;跑完…

【测试报告】模板:性能测试报告 2

目录 一、封面 二、文档修改记录 三、目录 四、正文 第一章 概述 第1节 编写目的 第2节 项目概况 第3节 适用范围 第二章 性能测试范围 第1节 测试对象 第2节 测试术语 第3节 测试目标 第4节 测试基本信息 第三章 压测机配置信息 第四章 服务器配置信息 第五章…

接口性能测试报告

1 概述 1.1性能测试概念 性能测试是通过自动化的测试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试&#xff0c;两者可以结合进行。通过负载测试确定在各种工作负载下系统的性能&#xff0c;目标是当负载逐渐增加时&…

性能测试报告实例

上一篇博文主要通过两个例子让测试新手了解一下测试思想&#xff0c;和在做测试之前应该了解人几点&#xff0c;那么我们在如何完成一次完整的性能测试呢&#xff1f; 测试报告是一次完整性能测试的体现&#xff0c;所以&#xff0c;这里我给出一个完整的性能测试报告&#xff…

性能测试报告案例

一、性能测试报告目录 二、性能测试结论 1、***系统的性能 1&#xff09;业务层的性能说明&#xff1a; 2&#xff09;技术层的性能说明&#xff1a; 2、***系统的稳定性 另外&#xff0c;注释说明&#xff1a;术语

功能测试报告总结

转自http://www.cnblogs.com/xunmi/archive/2011/08/18/2144745.html 测试报告是测试人员在测试过程中用于反映测试状况的文档&#xff0c;其重要性通过网上哀求、跪求、旋转360度冰天雪地各种求测试报告模块的帖子中就可见一斑。其实测试报告的内容基本都是模板的那些&#xf…

功能测试报告的编写

目录 前言 一、〖版本测试报告〗 二、〖总结测试报告〗 前言 测试报告是测试人员在测试过程中用于反映测试状况的文档&#xff0c;其重要性通过网上哀求、跪求、旋转360度冰天雪地各种求测试报告模块的帖子中就可见一斑。其实测试报告的内容基本都是模板的那些&#xff0c;只…

设置数据库中表的关系图

新建一个数据库及表后&#xff0c;紧接着要设计这些表的关系图&#xff0c;那么如何操作呢&#xff1f; 首先在新建好的数据库下&#xff0c;选中“数据库关系图”&#xff0c;如图所示&#xff1a; 这样&#xff0c;我们就可以在表间建立关系&#xff0c;设置外键。建立关系后…

数据库中表的依赖关系

数据库中表的依赖关系 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术&#xff1a;Visual Studio 作者&#xff1a;李继金 撰写时间&#xff1a;2019年6月8日 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 提起数据库我们都会想到对数据库进行…

DB2中查看表结构

在DBVisualizer 中查看DB2中表的结构信息。 desc <tablename>

正交表

一、正交排列法概述 正交排列法能够使用最小的测试过程集合获得最大的测试覆盖率。当可能的输入数据或者输入数据的组合数量很大时&#xff0c;由于不可能为每个输入组合都创建测试用例&#xff0c;可以采用这种方法。 案例&#xff1a;字符属性设置程序 在一个窗体中有多个输…

如何将数据库中表转化到redis中

如何将数据库中表转化到redis中 方法一&#xff1a;使用string 数据库中user表一条记录&#xff1a; id username pwd 3 lili 123 使用&#xff1a;文件夹的方式 set user1:3:id 3; set user1:3:username lili; set user1:3:pwd 123; 存入后在redis中显示 文件夹 user1 key…

MySQL 数据库中表数据莫名其妙没了的情况

我遇到过数据库中表数据没了的情况。 一开始还以为是遇见了bug。 其实是我自己的锅&#xff0c;忘记commit了。 我们来看一下案发现场。 DELIMITER $$ CREATE PROCEDURE insert_dept(IN START INT(10),IN max_num INT(10)) BEGIN SET autocommit 0; # xxxxxxxxxxxxxx…

数据库中表的加减法

通过集合运算可以得到记录的集合或者公共记录的集合。 一&#xff1a;加法&#xff1a;union 1、表的加法&#xff1a;union,并集&#xff0c;但是会去重&#xff0c;就是去重重复的记录。 select * from A union select * from B. 2、union集合运算要求有相同的列&#xff0c…