sugar

Kent Yao' Blog

View the Project on GitHub yaooqinn/sugar

DataSourceV2 Overview

背景与动机

Spark 1.3时期引入的DataSource API(V1)有如下缺陷:

其中,parquet/orc/json等内置格式,并不是基于这个api来开发的,而用的是一套internal并且非public的接口,对于一些外部DataSource的开发人员而言,用起来就比较困难。

DataSourceV2覆盖

最后两条应该是属于对那套内部接口的的Scan类型进行替换支持,其他属于用户感知的。

DataSourceV2不覆盖

API设计关注点

API结构

一共分为四层:

第一层:基类DataSourceV2,指定的source实现必须首先继承这个接口表明身份,再混入其他接口,比如,

class MyDataSource extends DataSourceV2 with ReadSupport with WriteSupport

第二层定义:DataSourceReader DataSourceWriter对应该source的操作算子(读或者写),也可以混入PPD等接口或特质,如,

MyDataSourceReader extend DataSourceReader with SupportsPushdownRequiredColumn with SupportsPushdownFilters

第三层:参数:可以序列化和广播到executor端,用以真正执行的reader或writer的实例化

第四层:定义如何对一个partition数据进行操作的逻辑方法

读取示意

  1. driver端获取schema信息
  2. driver端进行谓词下压操作
  3. driver端创建最后DataSourceReader需要真正读取的InputPartition列表,每个partition刚好对应生成的rdd的partition, 在executor的话,每个InputPartition会实例化一个InputPartitionReader进行读取。
  4. driver端对InputPartition列表序列化,传到executor端

  5. executor端InputPartition创建InputPartitionReader进行数据的读取

过程抽象如下图,

写示意

写的过程的抽象大同小异,有兴趣可以自己去SPIP: Data Source API V2 Dig

后记

本文基于范文臣同学的SPIP: Data Source API V2进行粗鄙的分析,若理解有误请谅解,可以直接参考原文。

PS: 文档属于Proposal,具体在Spark中的实现请直接参考代码。

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.