-
prestosql与prestodb的支持程度
在hudi的官网上,并没有介绍prestosql与hudi的集成对接,其实只要将hudi的jar包放到prestosql的connector的目录下,prestosql也是能正常对接的,但是 prestosql对hudi的对接不如prestodb完善,两者的对接情况如下:
COW的实时视图 | COW的增量查询 | MOR的实时视图 | MOR的增量查询 | MOR的读优化视图 | |
---|---|---|---|---|---|
prestosql | Y | N | N | N | Y |
prestodb | Y | N | Y | N | Y |
2. prestosql与prestodb访问hudi数据源的方式
prestosql与prestodb两者获取split的区别:
获取实时视图的splits方式 | 获取读优化视图的splits方式 | |
---|---|---|
prestosql | HoodieParquetRealtimeInputFormat的getSplits()接口 | HoodieParquetInputFormat的getSplits()接口 |
prestodb | HoodieParquetInputFormat的getSplits()接口 | 通过hdfs的路径自己生成splits |
prestodb在获取优化视图的splits的时候,还做了一些路径过滤的优化。
prestodb和prestosql在获取数据源的数据上也有区别:
prestodb的数据读取时通过HoodieParquetRealtimeInputFormat.getRecordReader进行的,在数据读取的时候,会传入日志更新文件路径,基准文件路径等信息,Hudi内部的InputFormat会根据日志修改信息对基准文件操作后再返回,所以读到的数据都是最新的,因此prestodb是支持hudi的实时读取的。
prestosql读取hudi的实时视图使用了Parquet原生接口,Parquet原生读取器只能认识Parquet的基准文件,对于Hudi维持的数据变化信息的log文件并不认识,因此在hudi upsert的时候,log更新信息对prestosql来说等同透明,所以prestosql是不支持hudi实时视图的读取的。
读优化视图读取的都是Parquet基准文件,因此在读优化视图上,prestosql和prestodb功能上无区别。
3. prestodb访问hudi实时视图关键代码的走读
1. 如果是Hudi的实时视图,使用的是数据源的InputFormat,其他视图则自己构造splits,并且根据数据源的路径优化信息尽心读取的文件过滤
2. 在读取Parquet的时候,如果数据源有使用UseRecordReaderFromInputFormat注解,则使用数据源的RecordReader。HoodieParquetRealtimeInputFormat有标有此注解,HoodieParquetInputFormat无标此注解,Hudi实时视图使用的是HoodieParquetRealtimeInputFormat格式,因此读取数据的时候使用的是数据源的RecordReader方式。
3.上边返回Optional.empty()之后,presto将构造GenericHiveRecordCursorProvider进行数据读取
4. GenericHiveRecordCursorProvider中使用了数据源的getRecordReader进行数据读取,即上述的HoodieParquetRealtimeInputFormat.getRecordReader的接口进行数据拉取。
5. 传给数据源的customSplitInfo参数包括基准文件,log更新文件等信息。