spark 1.6 下parquet vs orc

背景

这都是现在大数据下比较火热的两种存储格式,orc和hive的关系可能要密切一点,但spark 对parquet寄予了厚望,
最近我们在测一个有join场景下的多个dataset的读取情况,这里简单写一下测试的一个结果,测试环境是spark1.6,数据在hdfs上,spark是local模式,集群的测试下周进行

join 后group,最后count

user的数据量在4000w左右,字段为4个字段,play选择的是1月1号,记录是1084966

先对比存储:
存储中横向对比了orc格式和parquet格式:

datatype\format orc parquet
playinfo 7.7M 7.6M
userinfo 97M 87M

此时存储可以看出两者差别不大,parquet略小于orc,不过在海量数据下这个差距会被放大,此时的字段毕竟只是4个字段的user和3个字段的play

再对比性能:
执行类似:

user.joinWith(play,"$"userUid"===$"playUid","inner").groupBy($"_1.thirdPartyName").count().show()

执行结果:

left joinType right duration/ms foramt
user inner play 44213 orc
user outer play 82484 orc
play inner user 43229 orc
play outer user 81112 orc
play inner user 23288 parquet
play outer user 62150 parquet
user inner play 22549 parquet
user outer play 64828 parquet

解释下这张表,left表示在左边的,因为数据量是不完全对称的,而join方式也测试了inner和outer两种jointype,duration是指这个job执行的时间,而format是两种数据格式

不过网络也很重要,在测试时候我的下载大概是3M/s

join 后groupBy 最后avg

第二步我测试了

user.joinWith(play,"$"userUid"===$"playUid","inner").groupBy($"_1.thirdPartyName").toDf.agg(sum("_2.durationsum")).show()

测试结果:

playDate format duartion
2016/01/01 parquet 27967
2016/01 parquet 93854
2016/01/01 orc 49551
2016/01 orc 116043

初步看1.6用spark作为执行引擎使用parquet格式性能有一定的提升,后期会集群再测一次,而且我观察到两种格式的shuffle size好像相差挺大,这一个也是后期要看的一个指标

my github

你可能感兴趣的:(spark)