CarbonData集成 Presto(Trino)(3)- 性能测试篇

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 集成成功后,我们需要对此进行测试,测试性能和验证功能是否正常,此文章记录下我验证的一些过程

上篇文章已经成功集成了Trino和CarbonData,这篇文章主要是测试我们的功能和性能方面的一些测试,测试出CarbonData相对于社区其他的一些文件格式的优势以及验证集成性能和可靠性,包括是否能正确启动集群,正确识别Carbondata文件进行读取数据做count,聚合分析等

建表语句:

/*

* create table by user pay list

*/

CREATE TABLE IF NOT EXIST CARBONDATA_PAYMENT (

   `gameId` int,

   `unionId` int,

   `orderId` STRING,

   `userId` INT,

   `createTime` bigint,

   `payTime` bigint,

   `status` int,

   `money` int

) stored as carbondata

生成测试数据的Spark代码:

package org.apache.carbondata.trino


import org.apache.spark.SparkContext

import org.apache.spark.sql.CarbonSession._

import org.apache.spark.sql.SparkSession


import scala.util.Random


/**

* @Description Build Test Data Store AS CarbonData

* @Author chenzhengyu

* @Date 2021-09-10 20:37

*/

object TestDataFromCarbonData {


 def main(args: Array[String]): Unit = {

   val sc = new SparkContext();

   val spark = SparkSession.builder().enableHiveSupport().getOrCreate()

   val carbon = SparkSession.builder().config(sc.getConf).getOrCreateCarbonSession("hdfs://localhost:9000/user/hive/warehouse")

   //build random num

   val randomGameId = new Random(5);

   val randomMoney = new Random();

   import spark.implicits._

   //build data

   val dfTemp = spark.sparkContext.parallelize(1 to 1000000000).map(x => (randomGameId.nextInt(5), x % 8, "20210920" + (x % 100), x % 5, System.currentTimeMillis() + x % 500L, System.currentTimeMillis() + x % 500L, randomGameId.nextInt(4), randomMoney.nextInt(1000))).toDF("gameId", "unionId", "orderId", "userId", "createTime", "payTime", "status", "money")

   //create temp view

   dfTemp.createOrReplaceTempView("temp")

   //create table

   carbon.sql("CREATE TABLE CARBONDATA_PAYMENT (`gameId` int, `unionId` int, `orderId` STRING, `userId` INT, `createTime` bigint, `payTime` bigint,`status` int,`money` int ) stored as carbondata")

   //show tables

   carbon.sql("show tables").show

   //insert data and select

   spark.sql("insert into table CARBONDATA_PAYMENT select * from temp")

   spark.sql("select count(1) from CARBONDATA_PAYMENT").show()

   sc.stop()

 }

}


这一部分代码我们可以使用Spark-Shell或者使用打包工具打包成JAR,通过Standalone模式或者YARN模式进行执行,执行的流程如下:

Spark框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。

如上图所示,它展示了一个 Spark执行时的基本结构。图形中的Driver表示master,负责管理整个集群中的作业任务调度。图形中的Executor 则是 slave,负责实际执行任务

我一共插入了大概10亿条数据左右,平均每个分区插入2.5E条数据:

生成的文件在HIVE目录下,观察如下:

通过Trino的Client进行查询 SELCT COUNT(1) AS TOTAL FROM CARBONDATA_PAYMENT 我们一共生成了 10E条数据

接下来我们做聚合查询,通过查询。我们通过模拟数据一共5个用户id,然后统计他们的总充值金额进行查询。

SELECT USERID,SUM(MONEY) AS TOTAL FROM CARBONDATA_PAYMENT GROUP BY USERID

结果如下图


这个流程针上面我做一个简单的总结:首先我们通过Spark 集成 Carbondata成功后,去生成Carbondata文件,我们通过SparkSession 这个类去生成一个临时会话,然后通过Spark RDD 去模拟一些游戏玩家订单充值数据,然后注册为临时表Temp。通过在Spark上连接Hive元数据库创建Carondata表,名字为CARBONDATA_PAYMENT的表。然后通过INSERT语句把刚刚的生成的数据插入到Hive表上,这个过程大概在10分钟左右(受限于本机磁盘和CPU性能影响),后续我们通过观察即可发现Hadoop的HDFS上已经写入了对应的数据了。接着我们就可以关闭Spark了,开始启动Presto(Trino)的服务端和客户端,按照配置文件配置好Hive的MetaStore地址和Catlog,我们使用Trino客户端连接进去。连接进去后我们通过网页打开控制台进行观察SQL的执行情况。然后我们执行简单查询看看是否能正常工作,检测完毕后,我们执行聚合查询,模拟查询根据玩家ID的总充值金额。然后在不同数据量(1w->10w->100w->1000w->1e->10e)的查询下的执行情况。然后我们再模拟查询某个玩家订单号去查询相关的详情数据情况,并且最后对此进行总结。与此同时,我们模拟超出内存超出执行的情况,保护查询避免集群出现OOM的机制


受限于本机性能发挥,基于刚刚按照导师要求进行的大规模数据测试结论如下:

  1. 基本查询、聚合查询等查询基本无问题,证明新版本Presto(Trino)集成成功
  2. 在做Count数据操作时候非常的快,基本1-2s可以出到结果,针对复杂的条件Count,如果有索引列也很快能查询出来
  3. 通过观察HDFS文件路径,可以发现Index文件是单独存储的一份文件,这样做的目的是提升数据读取效率
  4. 针对维度的查询明细数据,例如根据订单号进行查询,我们可以发现在10E数据中秒级返回查询的明细数据,这个速度是十分快的
  5. 如果在执行时候,超过允许最大执行内存,则会集群有停止执行的机制,避免内存oom



相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
1月前
|
前端开发 关系型数据库 测试技术
django集成pytest进行自动化单元测试实战
在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率,相比于Django自带的测试框架,Pytest提供了更为丰富和强大的测试功能。本文通过一个实际项目ishareblog介绍django集成pytest进行自动化单元测试实战。
26 3
django集成pytest进行自动化单元测试实战
|
24天前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
34 8
|
30天前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
|
3月前
|
数据采集 DataWorks 安全
DataWorks产品使用合集之选择独享调度,数据集成里可以使用,但是数据地图里面测试无法通过,是什么原因导致的
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
38 0
DataWorks产品使用合集之选择独享调度,数据集成里可以使用,但是数据地图里面测试无法通过,是什么原因导致的
|
2月前
|
测试技术 数据库 Python
在系统工程中,软件测试是一个至关重要的环节,它确保软件的质量、可靠性和性能。软件测试通常包括多个阶段,如单元测试、集成测试、系统测试和验收测试等。
在系统工程中,软件测试是一个至关重要的环节,它确保软件的质量、可靠性和性能。软件测试通常包括多个阶段,如单元测试、集成测试、系统测试和验收测试等。
|
2月前
|
Java 测试技术 Maven
在Java项目中集成单元测试与覆盖率工具
在Java项目中集成单元测试与覆盖率工具
|
2月前
|
Java 测试技术 数据库
在Spring Boot项目中集成单元测试的策略
在Spring Boot项目中集成单元测试的策略
|
2月前
|
敏捷开发 监控 Devops
探索自动化测试的利剑:持续集成与持续部署(CI/CD)在软件测试中的应用
在软件开发的快速迭代中,传统的手动测试方法已经无法满足效率和质量的双重需求。本文将深入探讨如何通过实施持续集成(CI)和持续部署(CD)来优化自动化测试流程,提升软件交付速度及质量保证水平。我们将分析CI/CD在测试中的关键作用,并通过实际案例数据展示其对提高测试覆盖率、缩短反馈周期和增强开发协作的积极影响。
107 0
|
2月前
|
敏捷开发 jenkins 测试技术
软件测试中的敏捷实践:持续集成与自动化测试的融合之道
在软件开发领域,敏捷实践已成为提升项目响应速度和质量保证的重要手段。本文深入探讨了持续集成(CI)与自动化测试如何相辅相成,共同构建起一套高效、可靠的软件测试体系。通过实例分析,揭示了将敏捷原则应用于软件测试过程中的关键策略,并提出了实现这一目标的可行路径。文章旨在为软件测试专业人员提供一套结合敏捷理念的实用方法论,以应对快速迭代的软件项目需求。
|
2月前
|
敏捷开发 jenkins 测试技术
软件测试中的敏捷实践:持续集成与自动化测试的融合
在软件开发领域,敏捷方法论的兴起带来了开发流程的重大变革。特别是持续集成(CI)和自动化测试的结合使用,为提升软件质量和开发效率提供了强有力的支持。本文将探讨持续集成环境下自动化测试的实施策略、优势以及面临的挑战,并借助实证数据和案例分析,揭示这一组合如何促进敏捷团队高效地应对快速变化的需求与代码库。
46 0