Skip to content

Files

Latest commit

 

History

History

spark-datasource-v3.1

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

spark_datasource_v2有一个改进建议,spark-v3.1版本的引擎仅支持符合spark datasource v2改进建议的datasource实现。spark-datsource-v3.1是符合改进建议的一种实现。开发者可以在spark3.1引擎上使用此datasource访问阿里云MaxCompute表。支持操作如下:

表类型 操作方式 支持情况
内部非分区表 支持
内部非分区表 支持
内部分区表 分区裁剪读 支持
内部分区表 全分区读 支持
内部分区表 指定分区append写 支持
内部分区表 指定分区overwrite写 支持
内部分区表 动态分区append写 支持
内部分区表 动态分区overwrite写 不支持

1 spark-datasource-v3.1简介

spark-datasource-description

模块包含的内容如上图所示,spark-datasource-v3.1仅包含红色背景模块,绿色背景模块需要使用者准备。模块间的依赖关系是:上方模块会依赖下方模块。各个模块的介绍如下。

  • spark Application 以代码形式存在,位于${project.dir}/spark-datasource-v3.1/src/test/scala目录下。既是项目的自测代码,也是使用spark-datasource的样例代码。
  • spark distribution 实际是spark引擎本身,本项目在spark-3.1引擎上测试通过。用户可以下载spark-3.1引擎试用。
  • ODPS spark source 以代码形式存在,位于${project.dir}/spark-datasource-v3.1/src/main/scala目录下。这个部分与spark引擎按照spark datasource v2改进建议交互,利用MaxCompute官方SDK访问表元信息,利用tunnel访问MaxCompute表数据。
  • ODPS SDK 是提交到MAVEN仓库的jar包,已经配置在pom.xml文件依赖中。用户在构建本模块时会自动下载打包。spark datasource 使用SDK获得表的元信息。例如:列名及类型、分区列及类型、表的所有分区等等。点击查看MaxCompute官方SDK介绍。
  • cupid-table API 以jar包形式存在,位于${project.dir}/spark-datasource-v3.1/libs目录下。cupid-table API封装了环境差异,对引擎提供一套稳定的API。如果引擎运行在MaxCompute集群内,那么是可以直接访问MaxCompute物理数据的。如果引擎运行在MaxCompute集群外,那么需要利用tunnel访问MaxCompute表。cupid-table的存在解决了这些环境差异,spark-datasource仅需考虑cupid-table API的特性列表就可以了。
  • tunnel-table-impl 以jar包形式存在,位于${project.dir}/spark-datasource-v3.1/libs。这是cupid-table API的一种实现,底层依赖了阿里云tunnel

2 构建方法

首先,进入spark-datasource-v3.1目录.

cd ${project.dir}/spark-datasource-v3.1

其次,执行mvn命令构建spark-datasource。

mvn clean package jar:test-jar

最后, 确认构建结果。

# spark-datasource
ls -l ${project.dir}/spark-datasource-v3.1/target/spark-datasource-1.0-SNAPSHOT-jar-with-dependencies.jar

# test-case/example
ls -l ${project.dir}/spark-datasource-v3.1/target/spark-datasource-1.0-SNAPSHOT-tests.jar

3 使用方式

首先,配置SPARK_HOME环境变量指向spark v3.1.2版本引擎根目录。如下图是测试环境的环境变量。 spark-home-env

然后,进入SPARK_V3.1 引擎根目录

cd ${SPARK_HOME}

然后,执行读表操作。

./bin/spark-submit \
    --master local \
    --jars ${project.dir}/spark-datasource-v3.1/target/spark-datasource-1.0-SNAPSHOT-jar-with-dependencies.jar,${project.dir}/spark-datasource-v2.3/libs/cupid-table-api-1.1.5-SNAPSHOT.jar,${project.dir}/spark-datasource-v2.3/libs/table-api-tunnel-impl-1.1.5-SNAPSHOT.jar \
    --class DataReaderTest \
    ${project.dir}/spark-datasource-v3.1/target/spark-datasource-1.0-SNAPSHOT-tests.jar \
    ${maxcompute-project-name} \
    ${aliyun-access-key-id} \
    ${aliyun-access-key-secret} \
    ${maxcompute-table-name}
    
#example
./bin/spark-submit \
    --master local \
    --jars ${project.dir}/spark-datasource-v3.1/target/spark-datasource-1.0-SNAPSHOT-jar-with-dependencies.jar,${project.dir}/spark-datasource-v2.3/libs/cupid-table-api-1.1.5-SNAPSHOT.jar,${project.dir}/spark-datasource-v2.3/libs/table-api-tunnel-impl-1.1.5-SNAPSHOT.jar \
    --class DataReaderTest \
    ${project.dir}/spark-datasource-v3.1/target/spark-datasource-1.0-SNAPSHOT-tests.jar \
    test_project \
    ${aliyun-access-key-id} \
    ${aliyun-access-key-secret} \
    test_o

然后,执行写表操作。

./bin/spark-submit \
    --master local \
    --jars ${project.dir}/spark-datasource-v3.1/target/spark-datasource-1.0-SNAPSHOT-jar-with-dependencies.jar,${project.dir}/spark-datasource-v2.3/libs/cupid-table-api-1.1.5-SNAPSHOT.jar,${project.dir}/spark-datasource-v2.3/libs/table-api-tunnel-impl-1.1.5-SNAPSHOT.jar \
    --class DataWriterTest \
    ${project.dir}/spark-datasource-v3.1/target/spark-datasource-1.0-SNAPSHOT-tests.jar \
    ${maxcompute-project-name} \
    ${aliyun-access-key-id} \
    ${aliyun-access-key-secret} \
    ${maxcompute-table-name} \
    ${partition-descripion} 
    
# example
./bin/spark-submit \
    --master local \
    --jars ${project.dir}/spark-datasource-v3.1/target/spark-datasource-1.0-SNAPSHOT-jar-with-dependencies.jar,${project.dir}/spark-datasource-v2.3/libs/cupid-table-api-1.1.5-SNAPSHOT.jar,${project.dir}/spark-datasource-v2.3/libs/table-api-tunnel-impl-1.1.5-SNAPSHOT.jar \
    --class DataWriterTest \
    ${project.dir}/spark-datasource-v3.1/target/spark-datasource-1.0-SNAPSHOT-tests.jar \
    test_project \
    ${aliyun-access-key-id} \
    ${aliyun-access-key-secret} \
    test_o \
    20211201