当前 Lance 已实现对 Spark 和 Ray 两大计算引擎的支持。其中,Ray 计算能力主要通过 pylance 模块进行功能封装与逻辑实现。为充分展示计算引擎与数据仓库的协同能力,以及 SQL 语言在复杂业务逻辑实现中的优势,本文将重点围绕 Spark 计算引擎,详细阐述其与 Hive 数仓表的集成流程及 SQL 应用场景。
确认用户已开通 EMR Serveless 队列权限,详情请参见 队列权限。
确认用户已开通相应 Catalog 的 操作权限,详细操作请参考:权限管理。
操作 Lance 表需要依赖如下参数:
set spark.executorEnv.JAVA_HOME=/usr/local/jdk17u; set spark.kubernetes.driverEnv.JAVA_HOME=/usr/local/jdk17u; set spark.driver.extraJavaOptions=-Xss4m -XX:+ExitOnOutOfMemoryError -XX:+UseG1GC -XX:+ParallelRefProcEnabled -Dscala.concurrent.context.numThreads=x5 -Dscala.concurrent.context.maxThreads=x100 -XX:+UnlockDiagnosticVMOptions -XX:GCLockerRetryAllocationCount=100 -XX:UseAVX=2 -XX:StartAggressiveSweepingAt=1 -Dio.netty.tryReflectionSetAccessible=true -Djdk.reflect.useDirectMethodHandle=false -Djdk.module.illegalAccess=permit; set spark.executor.extraJavaOptions=-XX:+UseG1GC -XX:+UnlockDiagnosticVMOptions -Xss4m -XX:+ExitOnOutOfMemoryError -XX:GCLockerRetryAllocationCount=100 -XX:UseAVX=2 -XX:StartAggressiveSweepingAt=1 -Dio.netty.tryReflectionSetAccessible=true -Djdk.reflect.useDirectMethodHandle=false -Djdk.module.illegalAccess=permit; set tqs.query.engine.type = sparkcli; set spark.sql.storeAssignmentPolicy = ANSI; set emr.serverless.spark.custom.parse.enabled = true; set serverless.spark.lance.enabled=true; set spark.sql.catalog.lance=org.lance.spark.LanceNamespaceSparkCatalog; set spark.sql.extensions=org.lance.spark.extensions.LanceSparkSessionExtensions; set spark.sql.catalog.lance.impl=las2;
参数说明:
参数 | 配置说明 |
|---|---|
emr.serverless.spark.custom.parse.enabled | 固定值 true, 可以支持 Lance 的 Spark SQL 扩展 |
serverless.spark.lance.enabled | 固定值 true , 表示开启 Lance 特性 |
spark.sql.catalog.lance | 固定值 |
spark.sql.extensions | 必须加上 |
spark.sql.catalog.lance.impl | 固定值 las2 。表示表的元信息从 AI 数据湖元数据中心读取和保存。 |
说明
在 Serverless Spark 中 ,通过 lance.{catalog_name}.{db_name}.{table_name} 四段式来直接引用某张表。Catalog 和 Database 在 AI 数据湖的元数据中心里定义,详细操作参看:元数据管理。
假设在 hive 这个 catalog 下面有一个 lance_db 的数据库。
在 EMR Serverless 控制台 **** > 队列 >作业提交 > SparkSQL 编辑器中,提交如下作业:
set tqs.query.engine.type = sparkcli; set spark.sql.storeAssignmentPolicy = ANSI; set emr.serverless.spark.custom.parse.enabled = true; set serverless.spark.lance.enabled=true; set spark.sql.catalog.lance=org.lance.spark.LanceNamespaceSparkCatalog; set spark.sql.extensions=org.lance.spark.extensions.LanceSparkSessionExtensions; set spark.sql.catalog.lance.impl=las2; create table lance.hive.lance_db.my_table (id int) using lance;
该操作会在 lance_db 库下创建一张表 my_table。
在 EMR Serverless 控制台 **** > 队列 >作业提交 > SparkSQL 编辑器中,提交如下作业:
set tqs.query.engine.type = sparkcli; set spark.sql.storeAssignmentPolicy = ANSI; set emr.serverless.spark.custom.parse.enabled = true; set serverless.spark.lance.enabled=true; set spark.sql.catalog.lance=org.lance.spark.LanceNamespaceSparkCatalog; set spark.sql.extensions=org.lance.spark.extensions.LanceSparkSessionExtensions; set spark.sql.catalog.lance.impl=las2; insert into lance.hive.lance_db.my_table values(1);
在 EMR Serverless 控制台 **** > 队列 >作业提交 > SparkSQL 编辑器中,提交如下作业:
set tqs.query.engine.type = sparkcli; set spark.sql.storeAssignmentPolicy = ANSI; set emr.serverless.spark.custom.parse.enabled = true; set serverless.spark.lance.enabled=true; set spark.sql.catalog.lance=org.lance.spark.LanceNamespaceSparkCatalog; set spark.sql.extensions=org.lance.spark.extensions.LanceSparkSessionExtensions; set spark.sql.catalog.lance.impl=las2; select * from lance.hive.lance_db.my_table;