Benchmark在计算机领域应用最成功的就是性能测试,主要测试负载的执行时间、传输速度、吞吐量、资源占用率等。
数据库领域,TPC的Bench已经成为开发数据库的主流Benchmark。开发者在开发的过程中,利用Benchmark生成结构化的数据,同时利用查询生成器生成指定数据库的SQL方言。这样在开发的数据库或
者改进的算法上用SQL负载(Workload)进行测试,就能够更加精准地了解性能瓶颈,对系统进行调优。 有些Benchmark只适用于某些领域。例如,TPC针对数据仓库开发了TPC-DS Benchmark,而针对其他的数据库又有TPC-H等系列的Benchmark。 用大数据领域Benchmark标准尚未统一。下面是几种著名的大数据benchmarkHibench
Hibench是由Intel开发的一个针对Hadoop的基准测试工具。它包含有一组Hadoop工作负载的集合,有人工模拟实验环境的工作负载,也有一部分是生产环境的Hadoop应用程序。
包含负载如下:
Berkeley BigDataBench
是随着Spark、Shark的推出,由AMPLab开发的一套大数据基准测试工具。其一部分是基于Hibench的数据集和数据生成器。同时它有一部分数据集是Common Crawl上采样的文档数据集。
目前主要针对SQL on Hadoop产品进行基准测试。
现在支持Documents、Ranking和UserVisits 3个数据集。
工作负载包括:
(1)Scan Query
查询的目的是对关系表进行选择和投影操作。
(2)Aggregation Query
查询的目的是先对关系表分组,然后使用字符串解析的函数对每个元组进行解析最后进行一个高基数的聚集函数操作
(3)Join Query
查询使用大小表连接,然后对结果进行排序。因为很多SQL on Hadoop产品都是基于Map Reduce计算模型,所以这里涉及一个经典的优化方式是Map Side Join,可以避免Shuffle阶段的网络开销
(4)External Script Query
调用一个会抽取和聚集URL信息的Python外部函数,然后分组聚集整个URL的数量
Hadoop GridMix
Hadoop自带的Benchmark,Gridmix同样不支持Spark,用户要使用Spark,仍需自己实现Workload算法
Gridmix的使用用例不能代表所有的Hadoop使用场景。Gridmix的用例中,没有包括较为复杂的计算,也没有明显的CPU密集型的用例。而现实应用中,存在很多I/O密集型的应用,同时CPU密集型的应用也大量存在,如机器学习算法、构建倒排索引等。因此,Gridmix的WorkLoad负载并不能完全展现大数据工作负载的全貌
包含负载如下:
Bigbench
是由Teradata、多伦多大学、InfoSizing、Oracle开发的一款大数据Benchmark
相关论文:Bigbench:Towards an industry standard benchmark for big data analytics
Bigbench可以作为Benchmark研究者的一个范例。Bigbench基于零售业的产品销售场景,用于评测的系统是大规模并行关系数据库和MapReduce类型的执行引擎
数据模型具有以下3种类型:
·结构化的数据:利用TPC-DS生成,筛选了TPC-DS的星型模型数据,并从中挑选部分典型关系表。
·半结构化的数据:利用网页浏览日志并通过PDGF工具生成,这些日志由零售业的客户的浏览页面产生。这些日志格式很像Apache服务器产生的日志格式,并和TPC-DS的数据模式融合,其数据规模也可以随着配置规模因子弹性调整。 ·非结构化的数据:数据基于真实数据作为输入,进行采样,并利用字典通过一种使用马尔科夫链的算法生成的文本数据。同样,非结构化数据与结构化和半结构化数据融合。数据规模也可以根据配置的因子弹性动态增长。几个维度来理解这个Benchmark工具现在和未来将要扩展的工作负载类型。
1)从业务维度:针对市场、销售、运营、供应链、报表5方面的负载。 2)从数据源的维度:针对结构化数据、半结构化数据、非结构化数据。 3)数据处理的方式和类型的维度:声明型语言、结构化语言或者二者的混合。 4)从分析技术的维度:统计分析、数据挖掘分析和采样报告3个维度。
BigDataBenchmark
是由中科院计算所开发的一款开源的大数据Benchmark
集成了19个大数据Benchmark,并从应用情景维度、运营和算法维度、数据类型维度、数据源维度以及软件栈和应用类型维度综合考虑,开发出这款Benchmark用来公正地对比和评判大数据系统和架构。BigDataBenchmark包含多样的数据输入类型。参见论文:BigDataBench:a Big Data Benchmark Suite from Internet Services,官方主页:http://prof.ict.ac.cn/BigDataBench/publications/
BigDataBenchmark的设计基于典型的大数据负载。由于在生产环境中,大数据应用的主导领域是搜索引擎、社交网络、电商。这三大领域占据了整个互联网80%的页面。BigDataBenchmark围绕这三大方向选取和开发相应领域的典型负载。数据生成器也是基于这3个领域开发和设计的。针对搜索引擎领域产生文本数据,针对社交网络产生图数据,针对电商产生结构化关系表数据。同时针对三大领域生成不同计算延迟的负载。在线(online)需要短的延迟;离线(offline)需要进行复杂数据计算分析;实时(Real-Time)需要交互式分析的负载。
TPC-DS
SQL on Hadoop产品的本质就是数据仓库系统,其作用是在大规模分布式的环境下分析和查询离线数据。TPC-DS(参见:TPC BenchmarkTM DS (TPC-DS):The New Decision Support Benchmark Standard。)广泛用于SQL on Hadoop的产品评测。但是,目前TPCDS基准已经很难模拟越来越复杂的决策支持系统的业务需求。
TPC-H的数据模型满足数据库模式设计的第三范式,数据模型不是现在决策支持系统主流的星型模型或者雪花型模型,业务类型也不能很好地体现物化视图和索引等OLAP型查询引擎的优势,而且其数据表不能表达数据倾斜问题,限制了索引的过度使用。为了应对这个挑战,TPC组织推出了TPC-DS,现在也正在制作和推出大数据领域的Benchmark,但还未发布。所以现在很多厂商和科研院所采用TPC-DS暂时作为SQL on Hadoop的大数据测试的Benchmark。
传统数据仓库使用的主流Benchmark就是TPC-DS。我们可以使用TPC-DS最高生成100TB的数据,能够满足大数据量的要求。数据模式采用雪花型模式:24个平均含有18列的数据库表,同时提供了99个典型Query供用户使用。这些Query类型丰富,如Ad-hoc Query、Reporting Query等,满足用户多方面的要求。
其他benchmark
1)Malstone:针对数据密集型计算和分析的工作负载的Benchmark工具。它基于大规模并行计算,也具有云计算的属性。
2)Cloud Harmony:使用黑盒方式度量云服务提供商的性能。它基于大规模并行计算,并且面向硬件架构,评测复杂数据的大数据运算。 3)YCSB:度量和对比云数据库的框架。基于大规模并行计算,面向大数据和云计算。 4)SWIM:一个针对MapReduce的统计工作负载。基于MapReduce面向大数据的复杂数据集的分析测试。 5)LinkBench:针对图数据库的Bechmark,在Facebook数据库工程团队,通过分析Facebook的数据库工作负载(workload)并开发了这款称为LinkBench的数据库性能测试工具。LinkBench已经开源并发布到了Github。 6)DFSIO:是一个分布式文件系统的Benchmark,针对Hadoop测试HDFS的读写性能。 7)Hive performance Benchmark(Pavlo):这是由Palvo最早提出的测试工具。这个Hive性能测试工具用于比较Hadoop和并行分析型数据库。它拥有5个工作负载,第一个是Grep(源于MapReduce的论文),其他4个典型的查询设计为代表传统的结构化分析工作负载,包括选择、聚集、连接、用户自定义函数的工作负载。Berkeley Big Data Bench就是借鉴Pavlo的Benchmark思想而进一步开发和实现的。
BenchMark的组成
核心是三个部分::数据集、工作负载、度量指标
数据集
数据类型分为结构化数据、半结构化数据和非结构化数据。由于大数据环境下的数据类型复杂,负载多样,所以大数据Benchmark需要生成3种类型的数据和对应负载
1)结构化数据:传统的关系数据模型、行数据,存储于数据库,可用二维表结构表示。
典型场景为互联网电商交易数据、企业ERP系统、财务系统、医疗HIS数据库、政务信息化系统、其他核心数据库等。结构规整,处理方案较为成熟。使用关系数据库进行存储和处理。 2)半结构化数据:类似XML、HTML之类,自描述,数据结构和内容混杂在一起。 典型应用场景为邮件系统、Web搜索引擎存储、教学资源库、档案系统,等等。可以考虑使用Hbase等典型的Key-Value存储系统存储。在互联网公司中存在大量的半结构化数据。 3)非结构化数据:各种文档、图片、视频/音频等。 典型应用场景为视频网站、图片相册、医疗影像系统、教育视频点播、交通视频监控、文件服务器(PDM/FTP)等具体应用。可以考虑使用HDFS等文件系统存储。在互联网公司同样存在大规模的非结构化数据。工作负载
维度
(1)密集型计算类型
①CPU密集型计算。 ②I/O密集型计算。 ③网络密集型计算。 (2)计算范式 ①SQL。 ②批处理。 ③流计算。 ④图计算。 ⑤机器学习。 (3)计算延迟 ①在线计算。 ②离线计算。 ③实时计算。 (4)应用领域 ①搜索引擎。 ②社交网络。 ③电子商务。 ④地理位置服务。 ⑤媒体,游戏。
典型负载
(1)基本负载
1)Word Count。 WordCount是CPU密集型的操作负载 2)Sort。 排序算法是I/O密集型的负载。3)Tera Sort
在运行的过程中,map映射和Shuffle阶段是CPU密集型的(CPU intensive),I/O程度中等,在reduce阶段是I/O密集型的(I/O intensive),CPU计算中等。算法实现思想:当把传统的串行排序算法设计成并行的排序算法时,通常会想到分而治之的策略。排序并行化的一般做法是:把要排序的数据划成M个数据块(可以用Hash的方法做到),然后每个map task对一个数据块进行局部排序,之后,一个reduce task对所有数据进行全排序。这种设计思路可以保证在map阶段并行度很高,但在reduce阶段完全没有并行。为了提高reduce阶段的并行度,TeraSort作业对以上算法进行改进:在map阶段,每个map task都会将数据划分成R个数据块(R为reduce task个数),其中第i(i>0)个数据块的所有数据都会比第i+1个数据块中的数据大;在reduce阶段,第i个reduce task处理(进行排序)所有map task的第i块,这样第i个reduce task产生的结果均会比第i+1个大,最后将1~R个reduce task的排序结果顺序输出,即为最终的排序结果。
(2)机器学习
如K-Means算法
(3)图计算
如PageRank图计算算法
(4)SQL
度量指标
(1)从架构角度进行度量
·浮点型操作密度。 ·整数型操作密度。 ·指令中断。 ·cache命中率(L1 miss、L2 miss、L3 miss)。 ·TLB命中。 (2)从Spark系统执行时间和吞吐的角度度量 ·Job作业执行时间。 ·Job吞吐量。 ·Stage执行时间。 ·Stage吞吐量。 ·Task执行时间。 ·Task吞吐量。 (3)从Spark系统资源利用率的角度度量 ·CPU在指定时间段的利用率。 ·内存在指定时间段的利用率。 ·磁盘在指定时间段的利用率。 ·网络带宽在指定时间段的利用率。 (4)从扩展性的角度度量 ·数据量扩展。 ·集群节点数扩展(scale out)。 ·单机性能扩展(scale up)。
TPC-DS使用
TPC-DS使用广泛,查询模板丰富
(1)下载最新的包:http://www.tpc.org。
(2)Make生成可执行文件
1)将Makefile.suite文件复制为Makefile。
2)编辑修改Makefile,找到含有“OS=”的行。 3)阅读注释并增加指定的OS,如“OS=LINUX”。 4)执行make。(3)Windows操作系统编译TPC-DS,生成可执行文件
1)安装Microsoft Visual Studio 2005。 2)双击打开整个解决方案dbgen2.sln(可能会看到报错“project file grammar.vcproj”,可以忽略这个错误)。 3)在项目列表中,右击dbgen2(是数据生成器),然后选择“build”(或者从顶层菜单 单击Build→Build Solution)。 4)重复步骤3构建查询生成器qgen2。 5)针对X64 and IA64 on X86平台进行交叉编译,安装Microsoft Visual Studio 2005“Team Suite”SKU,然后选择from Build→Configuration Manager命令,并重复执行步 骤3和步骤4,进而修改目标的运行平台。(4)生成数据
1)运行“dbgen2–h”以获取帮助信息。注意:许多高级选项并不是必须的。 2)在目录/tmp下生成个100GB数据。 dbgen2 –scale 100 –dir /tmp 常用的数据规模参数可以有100GB、300GB、1TB、3TB、10TB、30TB和100TB。3)可以通过配置参数“-delimiter‘<c>’”选项修改文件分隔。
4)当数据规模巨大时,可以通过并行方式生成。例如,生成100GB的数据,通过4路并 行在Linux/Unix上运行。 dbgen2 –scale 100 –dir /tmp –parallel 4 –child 1 & dbgen2 –scale 100 –dir /tmp –parallel 4 –child 2 & dbgen2 –scale 100 –dir /tmp –parallel 4 –child 3 & dbgen2 –scale 100 –dir /tmp –parallel 4 –child 4 &(5)加载数据
在Shark中需要先建表,然后加载数据,加载数据的方式和Hive是相近的。加载数据时 候,需要注意使用的分隔符。 注意由于TPC-DS的数据类型在Shark中并不完全适用,所以可以修改数据类型为以下格 式。drop table customer_address;
create table customer_address ( ca_address_sk bigint , ca_address_id string , ca_street_number string , ca_street_name string , ca_street_type string , ca_suite_number string , ca_city string , ca_county string , ca_state string , ca_zip string , ca_country string , ca_gmt_offset double , ca_location_type string ) row format delimited fields terminated by '|' lines terminated by '\n' stored as textfile ; 在Shell中执行如下命令加载数据,或者这条命令在SQL中让Shark执行。 LOAD DATA INPATH 'hdfs://hive01:9000/3t/customer.dat' INTO TABLE customer_address; (6)通过模板生成查询 query_templates文件夹下有99个查询模板,用户可以到其中查询模板并生成指定的查 询。 由于不同厂家的SQL并不是全部遵循ANSI标准。例如“LIMIT”和“BEGIN/COMMIT”,qgen2需要指定方言“dialect”。现在支持几类模板:db2.tpl、netezza.tpl、oracle.tpl、sqlserver.tpl。下面是生成oracle方言,针对100GB数据规模,使用query99模板查询的例子。 qgen2 –query99.tpl –directory query_templates –dialect oracle –scale 100(7)运行查询
查询的运行依赖于当时正在运行的大数据系统。 Shark执行查询的命令和方式如下。 1)在Shark的Shell中执行,将query的SQL语句复制到Shell执行。$ ./bin/shark # Start CLI for interactive session
2)在命令行后追加SQL语句执行查询。
$ ./bin/shark -e "SELECT * FROM foo" # Run a specific query and exit 3)在命令行后追加文件执行查询。 $ ./bin/shark -i queries.hql # Run queries from a file 关于其他的高级选项,感兴趣的用户可以通过查看文档了解。