美文网首页
数据构造实践

数据构造实践

作者: 龙葵1992 | 来源:发表于2018-12-08 18:37 被阅读0次

1、前言

         在性能测试中,不论是被测数据库的数据基数以及测试过程中依赖的测试文件,还是为了避免数据热点问题,往往需要构造大量的测试数据,而数据的构造很耗时,影响测试进度。原有的数据构造方式,往往是通过在shell脚本中构造循环实现数据构造,然而shell脚本中的语句是顺序执行的,效率很低,无法满足紧急的性能测试的数据量需求,因此很有必要对原有的数据构造方式进行改造。

Jmeter是性能测试中常用的并发测试工具,既然可以实现并发,因此我们可以考虑将jmeter并发能力应用于数据构造中,在各数据库可以接受的范围内,并发插入数据,减小了手工干预的过程,提高数据构造的效率。

另外,对于mysql和oracle数据库的数据构造可以通过编写存储过程和采用datafactory工具的方式来实现,这一部分在第五章和第六章中分别说明。

2、需求提取分析

对性能测试活动中的数据构造需求进行总结分析,需求见下表:

现将以上需求分别进行说明和分析:

1、hdfs上大量文件数据构造;

2、需实现hive大表的创建。需要抽象出hive表的接口、hive节点的ip、端口、可执行的sql语句。通过这种方式可实现大量表的创建、执行表的拷贝可变向实现多表的创建、执行查询语句可变向实现数据结果的校验;

3、linux上某目录下大量小文件创建。原有的方式是采用split大文件的方法,现在考虑通过jmeter并发调用shell进行拷贝实现;

4、生成linux大文件。原有的方式是通过循环追加的方式生成(封装jar包,提供给jmeter使用。实现可按照选择数据类型随机生成,是否可实现多线程。);

5、hbase大表的生成;

6、mysql上构造表,抽取ip、端口、sql语句;通过这种方式可实现大量表的创建、执行表的拷贝可变向实现多表的创建、执行查询语句可变向实现数据结果的校验;

7、oracle上构造表,抽取ip、端口、sql语句;通过这种方式可实现大量表的创建、执行表的拷贝可变向实现多表的创建、执行查询语句可变向实现数据结果的校验;

3、实验硬件环境说明

下图为oracle数据库以及mysql数据库所在的软硬件环境说明:

         数据插入过程中,并未停止数据基础平台以及咪咕数据集市其他进程的运行,因此插入的效率可能有一点影响。

4、通过jmeter构造数据的效率

   4.1 Mysql数据插入

      4.1.1  成效

因mysql的连接池默认为100,分别对连接池为15、80、100进行了测试。表的字段采用两个字段时(int,varchar(30)),一共设定了5分钟的并发时间,详情如下表。

由以上数据可见,插入的效率与网络有很大原因,在集群内采用一台jmeter机器可实现mysql 百万行数据5分钟之内插入,千万行数据50分钟插入。保守估计相比原先采用脚本插入提升数10倍以上。其中上表中jmeter位于集群内的数据可以看出,在连接池数量不变的情况下,插入的记录数与jmeter的并发数相差不大。

表的字段采用11个字段时,测试效率如下:

       通过以上两个表格的对比可以看出表的字段数的影响对于jmeter插入数据的效率有一定影响,但是在可接受的范围内,在集群里jmeter并发五分钟同样可以构造百万行数据。

4.2 ORACLE数据插入

    4.2.1  成效

设定jmeter运行5分钟,详细如下表。

在集群内采用一台jmeter机器可实现oracle 百万行数据5分钟之内插入,千万行数据50分钟插入。保守估计相比原先采用脚本插入同样提升数10倍以上。

表的字段采用11个字段时:

通过以上两个表格的对比可以看出表的字段数的影响对于jmeter插入数据的效率影响不大。

4.3 HDFS数据插入

对于HDFS上文件的需求,往往需要构造数据多的小文件。

          采用脚本构造原始数据,花了3小时完成了2500个数据的循环拷贝,效率很慢,后期考虑同样利用jmeter的方式调度Hadoop的接口进行数据构造,但是由于现在的集群环境上采用了Kerbors认证,暂未实现该功能。

4.4 HBASE数据插入

    待更新

4.5 HIVE数据插入

     待更新

4.6 LINUX数据大文件生成

         通过将mysql中生成的表导出,并选择字段分割符,28万行记录数导出的记录17s,生成的文件的大小为65M。Oracle导出216M文件花费183s,1G文件花费14分钟。

5. 存储过程

存储过程是由一些SQL语句组成的代码块,这些sql组合起来完成某些业务数据的添加,目前存储过程用的比较多的是关系型数据库mysql、oracle、sql server、db2等常用的数据库。

存储过程与客户端批量插入数据时的效率方面的不同点如下:

1、因为存储过程是存放在数据库的服务器端,相较于客户端的连接方式,少了网络通信的部分。

2、在批量写入数据量的大小方面,目前由于测试时间有限,只测试了插入相同数量的数据时存储过程和datafactory的效率比较。

3、通过jmeter插入业务数据时各表间的关系不是必须项,但是通过存储过程插入数据时是需要了解相关联的表之间的关系的,这需要与相关人员沟通了解相应的业务和设计。

5.1. Mysql数据插入

         通过本次实践:当被插入的数据库表字段为2个与11个字段时,数据插入的效率没有明显的变化。

5.1.1  方法

Mysql 存储过程sql语句如下:

create procedure addtestdata(beginorderbigint,endorder bigint)

begin

         declarei bigint;

         declarej bigint;

 declare tempstr varchar(24);

  seti= beginorder;

 while i <= endorder do

 //namestr字段值字符串拼接

  settempstr=concat('20011000'+convert((27262024+j),char(8)));

  Insertinto testprocperform(id, namestr)   values(i,tempstr);

seti=i+1;

 endwhile;

end;

5.1.2 成效

下表对比jmeter和存储过程方式的效率差异:

数据库表有2个字段,namestr字段数据为24位的固定字符串:

测试环境消耗时间字段个数连接池数据插入条数

数据库表有11个字段,除了id字段以外其余字段都是数据为60位以内的字符串:

可以看出通过jmeter插入数据比存储过程效率高很多。

5.2. Oracle数据插入

5.2.1方法

 Oracle存储过程

create or replace procedure addoracledata(firstNumIN NUMBER, secondNum IN NUMBER) as

  inumber;

  jnumber;

  Tmpnamestrnvarchar2(24);

begin

  i:=firstNum;

 tmpindex := 0;

 while i < secondNum loop begin

    //随机字符串生成

    select dbms_random.string('X',24) into Tmpnamestr from dual;

    /hint(/*...*/)表示插入数据的时候

    insert /*+ APPEND NOLOGGING*/ into testprocperform(id,namestr)

    values (i,Tmpnamestr);

    tmpindex :=tmpindex+1;

    if tmpindex =1000 then

    commit;

    tmpindex := 0;

    end if;

   i:= i +1;

end loop;

commit;

end addoracledata;

Create or replace procedure insertdata(finIN NUMBER, fend IN NUMBER) as

BEGIN

 Insert into PROCPERFORMDB values(fin, ‘GRKJGKRLEKHKJSJDSK’);

 COMMIT;

END;

5.2.2 成效

     待更新

6.Datafactory

6.1Mysql数据插入

6.1.1 方法

1、安装odbc驱动,虚拟桌面需要安装odbc 32位版本,64位版本当前安装的版本;

2、mysql中建测试数据库和测试用表;

3、使用datafactory创建连接,对表中每个字段插入的数据内容要求进行设置;

                                                            图一选择连接类型为odbc

                                                          图二选择已有的datasource

                                                    图三选择或者添加odbc数据源

                                       图四设置需要添加数据的表中每个字段的数据值类型

4、设置需要插入的数据条数,然后执行;

在插入数据之前设置需要插入数据的量,即记录数。

5、点击run执行;

6.1.1 成效

此测试环境mysql的连接池默认为100,下表对比jmeter和datafactory方式的效率差异:

数据库表有2个字段,namestr字段数据为24位的固定字符串:

测试环境消耗时间字段个数连接池数据插入条数

数据库表有11个字段,除了id字段以外其余字段都是数据为60位以内的字符串:

测试环境消耗时间字段个数连接池数据插入条数

6.2 Oracle数据插入

针对oracle数据库,下表对比jmeter和datafactory方式的效率差异:

数据库表有2个字段,namestr字段数据为24位的固定字符串:

数据库表有11个字段,namestr字段数据为60位的固定字符串:

附录

一、技术实现:

因mysql网上有相关的教程,这里不做详细介绍。

Oracle部分:

1、

报错:ORA-00911;

解决方案:

2、

报错:ORA-00923;

解决方案:Validation Query:默认是Select 1,如果是Oracle,需改为Select 1

from dual,否则报错 Cannot create PoolableConnectionFactory (ORA-00923: 未找到要求的 FROM 关键字)

jdbc驱动下载链接:

https://dev.mysql.com/downloads/connector/j/

二、展望

1、数据格式需要贴近线上业务,类型包括,图片、音频之类的;

2、需要能够实现指定文件的大小、列数、行数;

相关文章

  • 数据构造实践

    1、前言 在性能测试中,不论是被测数据库的数据基数以及测试过程中依赖的测试文件,还是为了避免数据热点问题,往往需...

  • Lombok高级用法

    bean中的链式风格 关键词@Accessors最佳实践 静态构造方法 构造参数为空的最佳实践 构造参数为name...

  • 机器学习算法实现(一):PageRank

    PageRank算法R语言实践 数据集 利用人工构造的数据集,随机地生成具有10个对象的有向图 第一步:加载R包 ...

  • Laravel数据库操作之-增删改查CURD操作

    数据库增删改查CURD操作 数据库操作之-查询构造器 查询构造器简介及新增数据 使用查询构造器修改数据 使用查询构...

  • 创建 ZTree

    使用标准json数据构造ztree 4.2使用简单json数据构造ztree(建议) 发送ajax请求获取菜单数据...

  • 去Model化协议的应用理解

    一对多:一种类型的View 展示不同的数据。初始数据经构造器转化为直接可用的数据。有不同的构造器类,但是构造数据的...

  • 数据仓库

    1、数据仓库的目的及用途 数据仓库泛化、合并多维空间的数据。构造数据仓库涉及数据清理、数据集成、数据变换。 构造数...

  • 构造方法

    构造方法的概念 构造方法(constructor),有的地方叫做构造器或者构造函数。构造方法的作用是给对象数据进行...

  • #新年觉醒Day7#《程序员的思维修炼》:积累经验

    通过实践获得知识的方法最有效,但是你必须从实践中有所收获。 为了学习而玩耍 构造主义:通过构造而学习,而不是学习来...

  • 15高通量测序-R与MDS/PCoA

    R与MDS/PCoA 构造数据集 ​ 加载ggplot2包,构造数据集,数据将由一个矩阵组成,10列对...

网友评论

      本文标题:数据构造实践

      本文链接:https://www.haomeiwen.com/subject/dmseqqtx.html