通过Spark SQL读Lindorm数据

更新时间:
复制 MD 格式

云原生数据仓库 AnalyticDB MySQL 版支持通过Spark SQL访问Lindorm数据库。本文主要介绍如何通过Spark SQL访问Lindorm中的Hive表和宽表的数据。

前提条件

  • 已创建Lindorm单可用区实例。具体操作,请参见创建实例

    重要

    Lindorm实例需开通宽表引擎、计算引擎、LindormDFS。计算引擎开通方式,请参见服务开通

  • 已开通OSS服务并创建存储空间和项目。具体操作,请参见开通OSS服务创建存储空间管理目录

  • 集群的产品系列为企业版、基础版或湖仓版

  • 已在企业版、基础版或湖仓版集群中创建Job型资源组

  • 已创建企业版、基础版或湖仓版集群的数据库账号。

准备工作

  1. Lindorm管理控制台实例详情页面,获取交换机ID。

  2. Lindorm管理控制台访问控制页面,单击安全组页签,查看Lindorm实例所属的安全组ID。如未添加安全组,请参见添加安全组

访问Lindorm中的Hive数据

  1. 获取HDFS客户端hdfs-site配置信息。

    说明

    如需获取hdfs-site配置信息,请联系Lindorm技术支持(钉钉号:s0s3eg3)。

  2. 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,然后单击目标集群ID。

  3. 在左侧导航栏,单击作业开发 > SQL开发

  4. SQL Console窗口,选择Spark引擎和Job型资源组。

  5. SQL Console窗口中输入以下作业内容:

    SET spark.adb.connectors = oss,external_hive;
    SET spark.adb.eni.enabled=true;
    SET spark.adb.eni.vswitchId=vsw-bp14pj8h0k5p0kwu3****;
    SET spark.adb.eni.securityGroupId=sg-bp11m93k021tp4ca****;
    SET spark.sql.catalog.lindorm_catalog = org.apache.spark.sql.hive.V2HiveExternalCatalog;
    SET spark.adb.eni.adbHostAlias.enabled=true;
    SET spark.sql.catalogImplementation = hive;
    -- HDFS相关配置
    SET spark.sql.catalog.lindorm_catalog.spark.hadoop.hive.metastore.uris=thrift://ld-bp1ttz8833x9c****-proxy-ldps-hms.lindorm.aliyuncs.com:9083;
    SET spark.hadoop.dfs.nameservices=ld-bp1ttz8833x9c****;
    SET spark.hadoop.dfs.client.failover.proxy.provider.ld-bp1ttz8833x9c****=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider;
    SET spark.hadoop.dfs.ha.automatic-failover.enabled=true;
    SET spark.hadoop.dfs.ha.namenodes.ld-bp1ttz8833x9c****=nn1,nn2;
    SET spark.hadoop.dfs.namenode.rpc-address.ld-bp1ttz8833x9c****.nn1=ld-bp1ttz8833x9c-master1-001.lindorm.rds.aliyuncs.com:8020;
    SET spark.hadoop.dfs.namenode.rpc-address.ld-bp1ttz8833x9c****.nn2=ld-bp1ttz8833x9c****-master2-001.lindorm.rds.aliyuncs.com:8020;
    SET spark.hadoop.dfs.namenode.http-address.ld-bp1ttz8833x9c****.nn1=ld-bp1ttz8833x9c****-master1-001.lindorm.rds.aliyuncs.com:50071;
    SET spark.hadoop.dfs.namenode.http-address.ld-bp1ttz8833x9c****.nn2=ld-bp1ttz8833x9c****-master2-001.lindorm.rds.aliyuncs.com:50071;
    
    -- 创建OSS外部数据库和表
    CREATE DATABASE external_oss_db location 'oss://testBucketName/warehouse/db';
    CREATE TABLE external_oss_db.test(id int, name string) using parquet location 'oss://testBucketName/warehouse/db/test';
    
    -- 将Hive表中的数据插入至OSS外表
    INSERT INTO external_oss_db.test SELECT * FROM lindorm_catalog.spark_test.test;
    
    -- 读取OSS外表数据
    SELECT * FROM external_oss_db.test;

    参数

    是否必填

    说明

    spark.adb.connectors

    启用AnalyticDB for MySQLSpark内置的连接器,连接器名称以逗号分隔,目前可选的连接器有oss、hudi、delta、adb、odps、external_hive、jindo、default。

    本文示例为oss,external_hive连接器。

    spark.adb.eni.enabled

    是否开启ENI访问的开关。

    如果是通过外表访问其他外部数据源,则需要打开ENI访问开关。取值说明:

    • true:开启

    • false:关闭

    本文示例需打开ENI访问开关,参数取值为true

    spark.adb.eni.vswitchId

    准备工作中获取的Lindorm交换机ID。

    spark.adb.eni.securityGroupId

    准备工作中获取的Lindorm安全组ID。

    spark.sql.catalog.lindorm_catalog

    Spark SQL支持的配置数据源的方式。

    参数取值固定为org.apache.spark.sql.hive.V2HiveExternalCatalog

    说明

    参数名称中的catalog_name可自定义,本文示例为lindorm_catalog

    spark.adb.eni.adbHostAlias.enabled

    是否开启自动将AnalyticDB for MySQL服务所需要的域名解析信息写入到域名映射表中。取值说明:

    • true:开启。

    • false:关闭。

    在通过ENI连接EMR Hive读写数据时,需要开启。

    HDFS相关配置

    步骤1中获取的hdfs-site配置信息。格式如下:set spark.hadoop.<name>=<value>

    说明

    <name><value>需替换为配置信息中的实际值。

    location

    指定外部数据库和外表数据在OSS上的存储路径。格式为oss://<bucketname/database/table>。本文示例为oss://testBucketName/warehouse/db/test

    说明

    <bucketname/database/table>需替换为实际的OSS路径。

  6. 单击执行SQL

  7. Spark作业执行成功后,您可以在Spark Jar 开发页面应用列表页签中的日志查看表数据。详情请参见Spark开发编辑器

访问Lindorm宽表数据

AnalyticDB for MySQL支持通过JDBCSpark DatasourceV2接口两种方法访问Lindorm宽表数据。两种方法区别如下:

  • 通过JDBC方式访问Lindorm宽表数据仅支持访问default库。

  • 通过Spark Datasource V2接口方式支持访问宽表中任意数据库。

  • 两种方式效率按照Lindorm侧同学反馈无明显差别,Spark Datasource V2底层也是拼接的SQL语句

通过JDBC访问宽表数据

  1. 获取Lindorm宽表SQL的专有网络地址。具体操作,请参见查看连接地址

  2. 下载Lindorm JDBC Driver依赖,并将JAR包上传至OSS中。具体操作,请参见上传文件

    说明

    lindorm-all-client的版本固定为2.1.6

  3. 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,然后单击目标集群ID。

  4. 在左侧导航栏,单击作业开发 > SQL开发

  5. SQL Console窗口,选择Spark引擎和Job型资源组。

  6. SQL Console窗口中输入以下作业内容:

    set spark.adb.eni.enabled=true;
    set spark.adb.eni.vswitchId=<vsw-bp14pj8h0k5p0kwu3****>;
    set spark.adb.eni.securityGroupId=>sg-bp11m93k021tp4ca****>;
    
    add jar oss://<bucketname>/hbase_jars/lindorm-all-client-2.1.6.jar;
    
    CREATE TEMPORARY VIEW tb
    USING org.apache.spark.sql.jdbc
    OPTIONS (
      driver 'com.aliyun.lindorm.table.client.Driver',
      url 'jdbc:lindorm:table:url=http://ld-bp1ttz8833x9c****-proxy-lindorm.lindorm.rds.aliyuncs.com:30060/default',内网地址
      dbtable 'tb',
    -- Lindorm控制台获取的数据库用户名
      user 'test',
    -- Lindorm控制台获取的数据库密码
      password 'password',
      fetchsize 10000
    );
    
    -- 创建OSS外部数据库和表
    create database if not exists external_oss_db location 'oss://<bucketname>/warehouse/db';
    create table if not exists external_oss_db.lindorm_table_1(id string, name string) using parquet location 'oss://<bucketname>/warehouse/db/lindorm_table_1/';
    
    -- 将lindorm宽表中的数据插入至OSS外表
    insert into external_oss_db.lindorm_table_1 select * from tb;
    
    -- 读取OSS外表数据
    select * from external_oss_db.lindorm_table_1;

    参数说明:

    参数

    说明

    jar

    步骤2中下载的JAR包所在的OSS路径。

    driver

    Lindorm JDBC Driver依赖。参数取值固定为com.aliyun.lindorm.table.client.Driver

    url

    步骤1中获取的Lindorm宽表SQL的专有网络地址,格式为

    Lindorm宽表SQL的专有网络地址/数据库名

    例如:jdbc:lindorm:table:url=http://ld-bp1ttz8833x9c****-proxy-lindorm.lindorm.rds.aliyuncs.com:30060/default

    dbtable

    Lindorm宽表数据库名称。本文示例为tb

    user

    如果您忘记用户密码,可以通过Lindorm宽表引擎的集群管理系统修改密码。

    password

    fetchsize

    每次连接读取的数据条数。您可以任意调整。

    重要

    提交Spark作业需配置fetchsize参数,否则无法查询到数据。

  7. 单击立即执行

  8. Spark作业执行成功后,您可以在Spark Jar 开发页面应用列表页签中的日志查看表数据。详情请参见Spark开发编辑器

  1. 获取宽表引擎使用HBase Java API访问的专有网络地址。具体操作,请参见查看连接地址

  2. 下载连接Lindorm实例所需JAR,并将解压后的JAR包上传至OSS中。具体操作,请参见上传文件

  3. 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,然后单击目标集群ID。

  4. 在左侧导航栏,单击作业开发 > SQL开发

  5. SQL Console窗口,选择Spark引擎和Job型资源组。

  6. SQL Console窗口中输入以下作业内容:

    SET spark.adb.eni.enabled=true;
    SET spark.adb.eni.vswitchId=vsw-bp14pj8h0k5p0kwu3****;
    SET spark.adb.eni.securityGroupId=sg-bp11m93k021tp4ca****;
    SET spark.sql.catalog.lindorm_table = com.alibaba.lindorm.ldspark.datasources.v2.LindormCatalog;
    SET spark.sql.catalog.lindorm_table.url=ld-bp1ttz8833x9c****-proxy-lindorm.lindorm.rds.aliyuncs.com:30020;
    SET spark.sql.catalog.lindorm_table.username=test;
    SET spark.sql.catalog.lindorm_table.password=password;
    add jar "oss://<bucketname>/hbase_jars/*";
    
    -- 创建OSS外部数据库和表
    CREATE DATABASE IF NOT exists external_oss_db location 'oss://testBucketName/warehouse/db';
    CREATE TABLE IF NOT exists external_oss_db.lindorm_table_2(id string, name string) using parquet location 'oss://testBucketName/warehouse/db/lindorm_table_2';
    
    -- 将lindorm宽表中的数据插入至OSS外表
    INSERT INTO external_oss_db.lindorm_table_2 SELECT * FROM lindorm_table.spark_test.tb;
    
    -- 读取OSS外表数据
    SELECT * FROM external_oss_db.lindorm_table_2;

    参数说明:

    参数

    是否必填

    说明

    spark.adb.eni.enabled

    是否开启ENI访问的开关。

    如果是通过外表访问其他外部数据源,则需要打开ENI访问开关。取值说明:

    • true:开启

    • false:关闭

    本文示例需打开ENI访问开关,参数取值为true

    spark.adb.eni.vswitchId

    准备工作中获取的Lindorm交换机ID。

    spark.adb.eni.securityGroupId

    准备工作中获取的Lindorm安全组ID。

    spark.sql.catalog.lindorm_table

    Spark SQL支持的配置数据源的方式。

    参数取值固定为com.alibaba.lindorm.ldspark.datasources.v2.LindormCatalog

    说明

    参数名称中的catalog_name可自定义,本文示例为lindorm_table

    spark.sql.catalog.lindorm_table.url

    步骤1中获取的使用HBase Java API访问的专有网络地址。

    spark.sql.catalog.lindorm_table.username

    宽表引擎的用户名和密码。

    如果您忘记用户密码,可以通过Lindorm宽表引擎的集群管理系统修改密码。

    spark.sql.catalog.lindorm_table.password

    jar

    步骤2中下载的压缩包所在的OSS路径。本文示例为oss://testBucketName/hbase_jars/*

    location

    指定外部数据库和外表数据在OSS上的存储路径。格式为oss://<bucketname/database/table>。本文示例为oss://testBucketName/warehouse/db/lindorm_table_2

    说明

    <bucketname/database/table>需替换为实际的OSS路径。

  7. 单击执行SQL

  8. Spark作业执行成功后,您可以在Spark Jar 开发页面应用列表页签中的日志查看表数据。详情请参见Spark开发编辑器