# 在 Spark 中访问 OushuDB 元数据 OushuDB 提供了 OushuDB Catalog 插件为 Spark 提供元数据,并允许 Spark 根据 OushuDB 元数据来读取数据。 ## 安装 ### 复制 OushuDB Catalog 到 Spark 下 将 OushuDB RPM 包中的 OushuDB Catalog JAR 包拷贝到 `${SPARK_HOME}/jars` 目录下。 OushuDB Catalog JAR 包命名形式为 `oushudb-catalog--spark_bundle.jar`, 其中 `` 为 OushuDB Catalog 的版本号, `` 为对应的 Spark 版本号。 `${SPARK_HOME}` 为 Spark 的安装目录。 若用户不希望直接复制 OushuDB Catalog JAR 包到 Spark 目录下, 也可以通过在使用 Spark 时指定 `--jars=` 的方式来显示地提供。 ### 在 OushuDB 中创建 spark_toolkit 扩展 为了使用 OushuDB Catalog 的 Spark 功能, 用户需要登录到 OushuDB 中创建 `spark_toolkit` 扩展。 `spark_toolkit` 扩展随 OushuDB 安装包发布,但缺省不会安装,用户可以通过以下命令完成: ```sql postgres=# CREATE EXTENSION spark_toolkit; CREATE EXTENSION ``` ## 使用说明 在 Spark 中加载 OushuDB Catalog 只需要按照一般的扩展插件的加载方式进行。用户可以通过指定 `spark.sql.extensions=com.oushu.catalog.oushudb.OushuDBSparkSessionExtension` 来显示的加载。 此外运行 OushuDB Catalog 还需要指定和 OushuDB 相关的如下配置: ``` spark.sql.catalog.oushu_catalog=org.apache.spark.sql.oushudb.catalog.OushuDBCatalog spark.sql.catalog.oushu_catalog.oushu.db.address=: spark.sql.catalog.oushu_catalog.oushu.db.database= ``` 其中 `spark.sql.catalog.oushu_catalog=org.apache.spark.sql.oushudb.catalog.OushuDBCatalog` 指明了 OushuDB Catalog 使用的是 Spark 元数据组件, `spark.sql.catalog.oushu_catalog.oushu.db.address=:` 配置了 OushuDB 服务的监听地址,而 `spark.sql.catalog.oushu_catalog.oushu.db.database=` 配置了 OushuDB Catalog 连接的数据库名称。 当 OushuDB Catalog 加载后,用户可以通过 `oushu_catalog` 来访问 OushuDB 的元数据。 ## 数据类型 OushuDB Catalog 目前仅支持《数据类型对照表》中的数据类型。 ### 数据类型对照表 | OushuDB数据类型 | Spark数据类型 | |--------------------------------------|---------------| | boolean/bool | BooleanType | | smallint/smallserial/int2 | ShortType | | integer/serial/int/int4 | IntegerType | | bigint/bigserial/oid/int8/long | LongType | | real/float/float4 | FloatType | | double/doubleprecision/float8/money | DoubleType | | json/string/text | StringType | | bit/bitvarying/bytea/binary | BinaryType | | date | DateType | | timestamp with time zone/timestamptz | TimestampType | | numeric/decimal | DecimalType | | character varying/varchar | VarcharType | | character/char/bpchar | CharType | | array | ArrayType | 注意: 当使用 `timestamptz` 类型时,数据会归一化到 UTC 时间存储,用户需要适当设置 Spark 的当前时区。 ## 示例 ### 通过 spark-sql 获取 OushuDB 中的表 ``` spark-sql \ --conf spark.sql.extensions=com.oushu.catalog.oushudb.OushuDBSparkSessionExtension \ --conf spark.sql.catalog.oushu_catalog=org.apache.spark.sql.oushudb.catalog.OushuDBCatalog \ --conf spark.sql.catalog.oushu_catalog.oushu.db.address=localhost:7000 \ --conf spark.sql.catalog.oushu_catalog.oushu.db.database=postgres \ -e "show tables in oushu_catalog" ``` ### 通过 spark-sql 查询 OushuDB 中的表 ``` spark-sql \ --conf spark.sql.extensions=com.oushu.catalog.oushudb.OushuDBSparkSessionExtension \ --conf spark.sql.catalog.oushu_catalog=org.apache.spark.sql.oushudb.catalog.OushuDBCatalog \ --conf spark.sql.catalog.oushu_catalog.oushu.db.address=localhost:7000 \ --conf spark.sql.catalog.oushu_catalog.oushu.db.database=postgres \ -e "select * from oushu_catalog.schema_name.table_name" ``` ## 注意事项 * OushuDB Catalog 仅适配 Spark 3.1, 其他 Spark 版本未经测试可能存在问题。 * OushuDB Catalog 目前仅支持读取功能,不支持 DDL 和 DML。 * OushuDB Catalog 目前仅支持 Magam 表的元数据。 * OushuDB Catalog 目前仅支持 Parquet 存储格式。 * OushuDB Catalog 无法保证 Spark 事务与 OushuDB 事务的并发正确。 * 当 Spark 读取 OushuDB 中启用压缩算法的表时,Spark 依赖的 HADOOP 必须提供对应的压缩功能, 否则 Spark 将会抛出类似如下的错误 `java.lang.RuntimeException: native zStandard library not available: this version of libhadoop was built without zstd support.`。