湖仓构建(Lakehouse Analysis Service-Formation,LAS-Formation)作为湖仓一体的核心组成部分,提供了统一的元数据构建及企业级的数据权限控制能力,支持无缝接入包括 Hive、Spark 在内的多种计算引擎,旨在帮助用户聚焦自身业务,加速释放数据价值。
已开通 LAS,并准备好 TOS 存储。
您目前可以通过 LAS SDK 对数据库、数据表进行操作,详细配置见 SDK 页面。
配置客户端
public HiveMetaStoreClient createClient() { // 访问账号的 ak sk String ak = getAk(); String sk = getSk(); HiveConf conf = new HiveConf(); //仅支持火山内部访问 conf.set(HiveConf.ConfVars.METASTOREURIS.varname, "thrift://lakeformation.las.cn-beijing.ivolces.com:48869"); HiveMetaStoreClient client = new HiveMetaStoreClient(conf); client.setRegion("cn-beijing"); client.setAccessKeyIdAndSecretAccessKey(ak, sk); }
通过 SDK 创建数据库 test_database
public void createDatabase(HiveMetaStoreClient client) throws TException { Database database = new Database(); database.setName("test_database"); //默认自动为 catalog 存储位置 + db name 的形式 database.setLocationUri("TOS://bucket/warehouse/test_db.db"); database.setDescription("test database description"); client.createDatabase(database); }
完成数据库创建后,在控制台界面上可见。
public void createTable(HiveMetaStoreClient client) throws TException { Table table = new Table(); table.setDbName("test_database"); table.setTableName("test_table"); StorageDescriptor sd = new StorageDescriptor(); //可不填,默认会以 db location uri + table name 的形式配置 sd.setLocation("TOS://bucket/warehouse/test_db.db/test_table"); List<FieldSchema> columns = new ArrayList<>(); columns.add(new FieldSchema("id", "BIGINT", "主键")); columns.add(new FieldSchema("name", "STRING", "名字")); columns.add(new FieldSchema("age", "INT", "年龄")); sd.setCols(columns); table.setSd(sd); // 设置分区列,非分区表可以不配置 List<FieldSchema> partitionKeys = new ArrayList<>(); partitionKeys.add(new FieldSchema("ds", "STRING", "日期")); table.setPartitionKeys(partitionKeys); // 表高级配置 Map<String, String> tableParams = new HashMap<>(); tableParams.put("comment", "test table description"); hiveMetaStoreClient.createTable(table); }
完成数据表创建后,在控制台界面上可见。
public void dropDatabase(HiveMetaStoreClient client) { client.dropDatabase("test_databse"); }
public void dropTable(HiveMetaStoreClient client) { client.dropTable("test_database", "test_table"); }
关于EMR Serveless Spark ,详情可见 Serveless Spark 产品介绍 。
在 EMR Serveless Spark 接入 LAS 前,需要提前确认以下信息:
上述信息都确认完毕后,可以开始在 EMR Serveless Spark 界面上开始实践。
点击创建作业,指定开发类型为 Spark SQL,并指定作业队列
创建数据库
在 Spark SQL 界面,运行建库 DDL
CREATE DATABASE IF NOT EXISTS test_database SET location 'TOS://bucket/warehouse/test_database'
执行完毕后,您可以在 LAS 上查看 test_database 详情
创建数据表
在 Spark SQL 界面,运行建表 DDL
use test_database; CREATE TABLE IF NOT EXISTS test_table(id BIGINT, name STRING, age INT);
创建分区表
use test_database; CREATE TABLE IF NOT EXISTS test_partition_table(id BIGINT, name STRING, age INT) PARTITIONED BY (ds STRING);
执行完毕后,您可以在 LAS 上查看到新建表的详情,也可以在 TOS 库路径下看到表目录已经创建。
数据写入与查询
在 Spark SQL 界面,运行 DML。
use test_database; INSERT INTO `test_table` VALUES (1, 'tom', 12);
use test_database; INSERT INTO `test_partition_table` PARTITION(ds='20240412') VALUES (1, 'tom', 12);
数据插入完毕后,对于非分区表在表目录下已经创建出数据文件,对于分区表在表分区目录下已经创建出数据文件。在 LAS 上,可以看到表的信息已经更新。
数据写入完毕后,运行 DQL 查看刚刚写入的数据。
use test_database; SELECT id, name, age FROM test_database;
use test_database; SELECT id, name, age FROM test_database WHERE ds = '20240412';
上传作业 Jar 包
在创建 Spark Jar 作业之前,需要先将待执行文件上传至 TOS 路径下
创建 Spark Jar
查看作业运行情况
作业运行后,可以点击作业名称查看作业详情与日志。