Parquet性能测试调优及其优化建议

 Parquet性能测试调优及其优化建议

一、我们为什么选择parquet

1、选择parquet的外部因素

(1) 我们已经在使用spark集群,spark原本就支持parquet,并推荐其存储格式(默认存储为parquet);

(2) hive支持parquet格式存储,使用HiveSql查询也是完全兼容的。

2、选择parquet的本身原因

(1) parquet由于每一列的成员都是同构的,可以针对不同的数据类型使用更高效的数据压缩算法,进一步减小I/O。CSV格式一般不进行压缩,通过parquet存储数据有效的节约了空间,不考虑备份情况下,压缩比将近27倍(parquet有四种压缩方式lzo、gzip、snappy、uncompressed,其中默认gzip的压缩方式,其压缩率最高,压缩解压的速率最快);

(2) 查询的时候不需要扫描全部的数据,而只需要读取每次查询涉及的列,这样可以将I/O消耗降低N倍,另外可以保存每一列的统计信息(min、max、sum等);

(3) 分区过滤与列修剪中,parquet结合spark可以实现分区过滤(spark sql,rdd的filter和where关键字),列修剪即获取所需要的列,列数越少查询的速率也就也快;

  1. 由于每一列的成员的同构性,可以使用更加适合CPU pipeline的编码方式,减小CPU的缓存失效。
  2. parquet的列式存储格式的解析(仅了解)

    Parquet文件在磁盘上的分布情况如上图,所有的数据被水平切分成Row group,一个Row group包含这个Row group对应的区间内的所有列的column chunk 。一个column chunk负责存储某一列的数据,这些数据是这一列的Repetition level,Definition level和Values。一个column chunk是由Page组成的,Page是压缩和编码的单元,对数据模型来说是透明的。一个Parquet文件最后是Footer,存储了文件的元数据信息和统计信息。Row group是数据读写时候的缓存单元,所以推荐设置较大的Row group从而带来较大的并行度,当然也需要较大的内存空间作为代价。一般情况下推荐配置一个Row group大小1G,一个HDFS块大小1G,一个HDFS文件只含有一个块。

  3. Parquet性能测试

    (1)测试普通文件和parquet文件读取列的性能

    ①测试环境:58.56机器、spark1.6、sts、hive等

    ②测试目的:验证spark在读取普通文件和parquet文件性能时,在读取相同的列的速率上面,比普通的文件效率更高,随着列的增加读取的效率会降低。

    ③测试原理:

    由于以下特性,使得列式存储对于一些运算速率相对行式存储运行速率更快:

    (1)由于每一列的成员都是同构的,可以针对不同的数据类型使用更高效的数据压缩算法,进一步减小I/O。

    (2)由于每一列的成员的同构性,可以使用更加适合CPU pipeline的编码方式,减小CPU的缓存失效。

    ④测试步骤

    (1)使用C_PORT表建立hive表,同样建立一个C_PORT_PARQUET,使用stored as parquet将表存储为parquet格式;

    (2)编写spark读取语句,对列数进行查询读取操作;

    (3)增加读取列数,在机器上spark提交任务运行记录运行时间;

    (4)对比运行时间,得出最终结论。

    ⑤测试结果

    约27005w数据   普通hive表      request表    测试结果:


查询列数


普通hive表耗时


Parquet表耗时


1列


2分53秒


2分42秒


5列


3分53秒


1分27秒


20列


5分58秒


3分56秒


35列


9分16秒


9分36秒


50列


13分19秒


8分11秒

⑥总结结论

通过以上五组数据列的读取得知,随着列数的增加,读取的时间增加,相对于parquet和普通hive的读取速率相近,由此在列数较多时,读取非全部列数据,建议使用parquet存储可以增加读取效率。

(2)测试parquet列式存储在对多列数据进行列式计算的效率

①测试环境:58.56机器、spark1.6、sts、hive等

②测试目的:验证spark在读取普通文件和parquet文件性能时,针对某些列式运算列式存储的性能更佳,即读取计算速率更快。

③测试原理:

由于以下特性,使得列式存储对于一些运算速率相对行式存储运行速率更快:

(1)查询的时候不需要扫描全部的数据,而只需要读取每次查询涉及的列,这样可以将I/O消耗降低N倍,另外可以保存每一列的统计信息(min、max、sum等),实现部分的谓词下推。

(2)由于每一列的成员都是同构的,可以针对不同的数据类型使用更高效的数据压缩算法,进一步减小I/O。

(3)由于每一列的成员的同构性,可以使用更加适合CPU pipeline的编码方式,减小CPU的缓存失效。

④测试步骤

(1)使用C_PORT表建立hive表,同样建立一个C_PORT_PARQUET,使用stored as parquet将表存储为parquet格式;

(2)编写spark读取语句,包含列式计算的sum,avg以及max,min语句;

(3)在机器上spark提交任务运行记录运行时间;

(4)对比运行时间,得出最终结论。

⑤测试结果

第一组:

约27005w数据   普通hive表      request表    (按照每天小时分组,2个求和,3个求平均运算)

测试结果:


时间


普通hive表


Parquet表


耗时


2分14秒


1分37秒


耗时


2分24秒


1分08秒


耗时


2分27秒


1分36秒


平均耗时


2分33秒


1分27秒

第二组:

约27005w数据   普通hive表      request表    (按照每天小时分组,2个求和,3个求平均运算,2求最大值,2个求最小值)

测试结果:


时间


普通hive表


Parquet表


耗时


2分22秒


1分38秒


耗时


2分58秒


1分51秒


耗时


2分31秒


1分38秒


平均耗时


2分37秒


1分42秒

第三组:

约27005w数据   普通hive表      request表    (按照每天小时分组,4个求和,4个求平均运算,4求最大值,4个求最小值)

测试结果:


时间


普通hive表


Parquet表


耗时


3分03秒


1分58秒


耗时


2分45秒


2分03秒


耗时


2分48秒


2分06秒


平均耗时


2分52秒


2分02秒

⑥总结结论

通过三组数值的比对计算,列式存储格式parquet针对列式计算效率比普通的行式存储有明显的优势,运算的效率提升在30%-40%左右,效率更高,执行效率更快。

  1. 测试普通文件和parquet文件的压缩效率对比

    ①测试环境:58.56机器、spark1.6、sts、hive等

    ②测试目的:验证测试普通文件和parquet文件的压缩效率对比,在压缩存储相同数据时,存储为parquet文件压缩效率更高,占用的空间更小。

    ③测试原理:

    (1)由于每一列的成员都是同构的,可以针对不同的数据类型使用更高效的数据压缩算法,进一步减小I/O。

    (2)由于每一列的成员的同构性,可以使用更加适合CPU pipeline的编码方式,减小CPU的缓存失效。

    ④测试步骤

    (1)同样的SparkSql运行,存储方式不同。生成相同数据量的parquet文件和普通文件存储;

    (2)分别查看生成的Parquet文件和普通文件的大小,对比结果。

    ⑤测试结果

    结果如下图:

    经过最终执行结果,存储为普通文件的总大小为12.6G,存储为parquet文件的大小为3.6G,存储所占空间减少了近70%,因此存储为parquet文件占用的空间更小。

    四、Parquet在实际项目中的应用建议

    (1)当读取的列数并非全部列数,建议使用parquet格式存储(建表时使用stored by parquet);

    (2)在进行列式计算或者向量计算时,建议也使用parquet格式存储,可以提高运算效率;

    (3)如果有文件需要备份存储,可以使用parquet文件进行压缩,可以有效的节约空间,提高压缩效率和速率。

原文地址:http://blog.51cto.com/11964104/2071800

时间: 2024-08-09 10:43:19

Parquet性能测试调优及其优化建议的相关文章

MySQL性能测试调优

MySQL性能测试调优 操作系统 基本操作 查看磁盘分区mount选项 $ mount 永久修改分区mount选项(系统重启后生效) 修改文件 /etc/fstab 中对应分区的mount options列的值 在线修改分区mount选项(系统重启后失效) $sudo -t ext4 -o remount,noatime,errors=remount-or / 文件系统优化 ext4文件系统优化 分区mount选项加noatime $sudo -t ext4 -o remount,noatime

Hadoop作业性能指标及參数调优实例 (二)Hadoop作业性能调优7个建议

作者:Shu, Alison Hadoop作业性能调优的两种场景: 一.用户观察到作业性能差,主动寻求帮助. (一)eBayEagle作业性能分析器 1. Hadoop作业性能异常指标 2. Hadoop作业性能调优7个建议 (二)其他參数调优方法 二.Hadoop集群报告异常,发现个别作业导致集群事故. 一.用户观察到作业性能差,主动寻求帮助. (一)eBay Eagle作业性能分析器 对一般作业性能调优.eBay Eagle[i]的作业性能分析器已经能满足用户大部分需求. eBayEagle

主从同步、读写分离、mysql性能调优(软优化)

配置mysql主从同步1 主从同步的作用:让slave身份的数据库服务器自动同步 master身份的数据库服务器上的数据. 一.主数据库服务器的配置192.168.4.121 用户授权mysql> grant replication slave on *.* to [email protected]"192.168.4.11" identified by "123456";2 启用binlog日志vim /etc/my.cnf[mysqld]server_id

性能测试调优篇---未完待续

性能测试调优一:1.首先,看下选测交易的整个走向纯系统内部交易:选测交易如果是系统内的交易,每一步请求都和系统交互几次,访问了几个数据库,访问了数据库的那几张表??该交易走了那几台机器,这几台机器的网络连接情况是什么样的??这几台机器是通过走的是哪些虚拟网卡,走了哪些路由器??带宽是什么情况??该交易在这几台机器上消耗了多少CPU,内存,及其对磁盘做了多少次的访问??从方法层面,从该交易的发起到结束,起了多少线程,调用了哪些相关的方法以及接口,访问了哪些表???跨系统交易:该交易发起后,每一步请

Linux性能调优的优化思路

Linux操作系统是一个开源产品,也是一个开源软件的实践和应用平台,在这个平台下有无数的开源软件支撑,我们常见的有apache.tomcat.nginx.mysql.php等等,开源软件的最大理念就是自由.开放,那么Linux作为一个开源平台,最终要实现的是通过这些开源软件的支持,以低廉的成本,达到应用最有的性能.因此,谈到性能问题,主要实现的是Linux系统和应用程序的最佳结合. 博文大纲:一.性能问题综述二.影响Linux性能的因素三.分析系统性能设计的人员四.调优总结 一.性能问题综述 系

如何调优JVM - 优化Java虚拟机(大全+实例)

堆设置 -Xmx3550m:设置JVM最大堆内存 为3550M. -Xms3550m:设置JVM初始堆内存 为3550M.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存. -Xss128k:设置每个线程的栈 大小.JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K.应当根据应用的线程所需内存大小进行调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右. -Xmn2g:

iOS应用性能调优25个建议和技巧

写在前面 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以在Twitter上关注@marcelofabri_. 性能对 iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论.然而由于iOS设备的限制,有时搞好性能是一件难事.开发过程中你会有很多需要注意的事项,你也很容易在做出选择时忘记考虑

深入理解JVM虚拟机10:JVM常用参数以及调优实践

微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.Java程序员面试指

性能测试知多少---性能分析与调优的原理

最近一直纠结性能分析与调优如何下手,先从硬件开始,还是先从代码或数据库.从操作系统(CPU调度,内存管理,进程调度,磁盘I/O).网络.协议(HTTP, TCP/IP ),还是从应用程序代码,数据库调优,中间件配置等方面入手. 单一个中间件又分web中间件(apache .IIS),应用中间件(tomcat .weblogic .webSphere )等,虽然都是中间件,每一样拎出来往深了学都不是一朝一夕之功.但调优对于每一项的要求又不仅仅是"知道"或"会使用"这么