在Spark SQL中,Parquet的序列化和反序列化有两种方式:
1)原生的ParquetRecordReader序列化和反序列化方式:Spark SQL的Parquet序列化和反序列化非常消耗时间,在性能优化的时候,Parquet序列化和反序列化一般要在Spark SQL读写文件的过程中消耗60%~80%的时间。
2)优化的UnsafeRowParquetRecordReader方式,优化的RecordReader类似钨丝计划,直接使用操作系统的内存,这样就省掉了序列化与反序列化本身。在Spark的Sql-NewHadoopRDD类中,如果开启了spark.sql.parquet.enableUnsafeRowRecordReader,Spark在计算的时候,进行布尔值逻辑判断,如果数据源类型是ParquetInputFormat,enableUnsafeR-owParquetReader是true,且tryInitialize初始化成功,就创建一个优化的RecordReader,即UnsafeRowParquetRecordReader。UnsafeRowParquetRecordReader中使用的Row为Un-safeRow,UnsafeRow直接操作原生内存,和钨丝计划一样,使用堆外内存,减少GC的消耗,减少Java对象对于数据包装冗余的存储。因为实际上在Parquet文件中具体的flat格式里面会有很多比较小的数据,所以不使用Java Object去封装的话,就可以节省很多的空间。在UnsafeRow中,直接操作Platform内存备份,这样就省略掉了序列化和反序列化。(https://www.xing528.com)
原生的ParquetRecordReader跟UnsafeRowParquetRecordReader有什么区别呢?非常显著的区别是批量反序列化,优化的RecordReader使用的是原生内存,批量反序列化,一次把row group数据读进来,这就极大地提高了性能。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
