一、SparkSql中两种格式存储的读写性能(以资源产品拓扑信息宽表为例)
1、假设:由于对于parquet存储格式来说,针对列式的查询读取操作以及列式的计算性能更高于普通的存储格式,所以在读取相同的sql过程中,表的存储格式为parquet,读取的性能更高,所花费的时间更少。
2、测试步骤:
①将sparksql用的相关hive表,建立相同的parquet存储格式的表;
②分别执行生成的jar包,进行数据的整合;
③统计运行的时间,进行比较得出结论。
3、测试结果:(可能是由于资源占用问题第三次测试中parquet存储格式花费时间较长,但是仍然低于hdfs格式存储的读取效率)
次数|时间 | Parquet格式表 | 普通格式表 |
第1次 | 9分0秒 | 14分51秒 |
第2次 | 9分38秒 | 14分18秒 |
第3次 | 13分9秒 | 16分14秒 |
平均时间 | 10分36秒 | 15分08秒 |
4、测试分析
此次测试,使用相同的sparksql进行读取转化,只是所使用的hive 的存储方式不同,由以上的执行时间来看,很明显在读写生成资源产品拓扑信息宽表过程中,建表为parquet存储所花费的时间更少,假设成立。
二、存储的格式不同,列式计算中parquet格式存储比普通文件存储进行列式运算的效率更高
1、假设:由于parquet进行列式存储,不需要扫描全部全部的数据,只读取每次查询涉及的列,这样可以将I/O降低至N倍,另外可以保存每一列的统计信息实现部分谓词下推。因此,我们假设存储的格式不同,列式计算中parquet格式存储比普通文件存储进行列式运算的效率更高
2、测试步骤:
①对sparksql中需要处理的表存储为parquet格式和普通格式;
②执行列式运算的sparksql;
③对比执行时间,得出结论。
3、测试结果:
生成文件来源|执行所花费的时间 | Parquet格式存储运算耗时 | 普通格式存储耗时 | Sql难度分析 |
七天质量跟踪(Build_mov_fix_7day_fix)用表oss.build_mov_fix | 2分18秒 | 7分50秒 | Sparksql要对500万左右的数据进行多次分组求最大值 |
计算客户健康度分数(Cust_Count_Yarn)用表oss.cust_health_detail | 4分3秒 | 4分45秒 | Sparksql要对40亿的数据查一天并进行多组复杂的加减求最大值以及判断最终获取结果 |
客户健康档案--开通装移修监控期数据(Build_mov_fix_7day_health)用表oss.cust_health_detail和oss.cust_health_detail_num | 12分49秒 | 4分2秒 | Sparksql对健康档案详单和统计表7天的数据进行计算关联,两张表的数据在40亿以上 |
4、测试分析
此次测试,通过复杂的大数据量的数据进行运算,写出结果。通过执行的时间,我们可以从里面看出执行效率如何。从前两次测试结果来看parquet格式存储的优势明显高于普通的文件存储。而从第三个来看关联查询运算,数据量也比较大,测试结果并非我们所假设的那样。什么原因造成的上述结果,经过查询资料,我们得知在列数查询较少的情况下,我们使用parquet格式存储进行查询的效率很高,包括直接impala查询大表所消耗的时间也是相比来说非常短。造成上述原因的主要原因应该是所需要进行聚合函数的字段过多,导致parquet格式存储的查询效率极具降低。因此,我们在进行sparksql执行时要考虑到所使用的表字段的个数,若是字段过多,建议使用一般的存储格式,不宜使用parquet来存储。通过分析,我们对假设要分情况来讨论,通过具体的字段数来决定使用哪种方式来进行数据格式的存储。
三、存储格式不同,Parquet格式存储所占用的内存更小
1、假设:由于parquet存储格式每一列的成员都是同构的,针对不同的数据类型使用更高效的数据压缩算法,进一步减少I/O;并且由于每一列的成员的同构性,可以使用更加适合CPU pipeline的编码方式,减少CPU的缓存失效,所以我们假设存储格式不同,Parquet格式存储所占用的内存更小。
2、测试步骤:
①生成相同数据量;
②将生成的数据按照普通文件格式存储和parquet格式存储;
③查看生成文件所占用的空间大小,进而得出结论。
3、测试结果:
生成文件的来源|所占用内存大小 | Parquet存储文件大小 | 普通文件大小 | 相对节约比例 | 节约空间大小 |
资源产品拓扑信息宽表中间文件(zyproinfotwo) | 3.6G | 12.6G | 71.4% | 9G |
资源宽表回写oracle的数据(zydata_to_oracle) | 726M | 2.3G(2355.2M) | 69.2% | 1629.2M |
拓扑导入bras数据(topo_add_stb) | 294.3M | 1.2G(1228.8M) | 76% | 934.5M |
4、测试分析
此次测试,我们可以通过测试的数据看出使用Parquet格式来存储数据,占用的空间更小,节约的空间在70%以上,在我们的应用之中针对大数据量的基础表的存储,我们可以生成parquet格式进行存储,在代码之中我们可以通过读取所需的文件解析注册成临时表再进行操作提取所需要的字段。由此看见假设成立,存储格式不同,Parquet格式存储所占用的内存更小。