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月前
|
Kubernetes 测试技术 持续交付
C# 一分钟浅谈:集成测试与系统测试
【10月更文挑战第19天】本文详细介绍了集成测试和系统测试的概念、目的及其在软件开发中的重要性。通过分析常见问题和易错点,结合代码示例,探讨了如何通过代码规范、自动化测试和持续集成等方法提高测试效果,确保软件质量和可靠性。
73 1
|
3月前
|
Devops jenkins 测试技术
DevOps实践:持续集成与自动化测试的融合之道
【9月更文挑战第29天】在软件开发的快节奏竞赛中,DevOps如同一位智慧的舵手,引领着船只驶向效率与质量的彼岸。本文将揭开DevOps的神秘面纱,探索其核心理念如何通过持续集成(CI)和自动化测试的实践,实现软件开发流程的优化与加速。我们将一同见证代码从构思到部署的旅程,以及这一过程中的关键技术和工具如何协同工作,确保软件质量和交付速度的双重提升。
|
4月前
|
前端开发 关系型数据库 测试技术
django集成pytest进行自动化单元测试实战
在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率,相比于Django自带的测试框架,Pytest提供了更为丰富和强大的测试功能。本文通过一个实际项目ishareblog介绍django集成pytest进行自动化单元测试实战。
66 3
django集成pytest进行自动化单元测试实战
|
4月前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
51 8
|
4月前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
55 0
|
4月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
|
6月前
|
数据采集 DataWorks 安全
DataWorks产品使用合集之选择独享调度,数据集成里可以使用,但是数据地图里面测试无法通过,是什么原因导致的
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
58 0
DataWorks产品使用合集之选择独享调度,数据集成里可以使用,但是数据地图里面测试无法通过,是什么原因导致的
|
5月前
|
测试技术 数据库 Python
在系统工程中,软件测试是一个至关重要的环节,它确保软件的质量、可靠性和性能。软件测试通常包括多个阶段,如单元测试、集成测试、系统测试和验收测试等。
在系统工程中,软件测试是一个至关重要的环节,它确保软件的质量、可靠性和性能。软件测试通常包括多个阶段,如单元测试、集成测试、系统测试和验收测试等。
|
5月前
|
Java 测试技术 Maven
在Java项目中集成单元测试与覆盖率工具
在Java项目中集成单元测试与覆盖率工具
|
5月前
|
Java 测试技术 数据库
在Spring Boot项目中集成单元测试的策略
在Spring Boot项目中集成单元测试的策略