全部产品
Search
文档中心

云原生数据仓库AnalyticDB:Spark SQL交互式查询

更新时间:Feb 17, 2025

如果您需要以交互式方式执行Spark SQL,可以指定Spark Interactive型资源组作为执行查询的资源组。资源组的资源量会在指定范围自动扩缩容,在满足您交互式查询需求的同时还可以降低使用成本。本文为您详细介绍如何通过控制台、Hive JDBC、PyHive、Beeline、DBeaver等客户端工具实现Spark SQL交互式查询。

前提条件

  • 集群的产品系列为湖仓版

  • 集群与OSS存储空间位于相同地域。

  • 已创建数据库账号。

  • 已安装Java 8开发环境和Python开发环境,以便后续运行Java应用、Python应用、Beeline等客户端。

  • 已将客户端IP地址添加至AnalyticDB for MySQL集群白名单中。具体操作,请参见白名单

注意事项

  • 如果Spark Interactive型资源组处于停止状态,在执行第一个Spark SQL时集群会重新启动Spark Interactive型资源组,第一个Spark SQL可能会处于较长时间的排队等待状态。

  • Spark无法读写ADB_External_TPCH_10GB、INFORMATION_SCHEMA和MYSQL数据库,因此请不要将这些数据库作为初始连接的数据库。

  • 请确保提交Spark SQL作业的数据库账号已具有访问目标数据库的权限,否则会导致查询失败。

准备工作

  1. 已创建Spark Interactive型资源组。具体操作,请参见新建和管理资源组

  2. 获取Spark Interactive型资源组的连接地址。

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

    2. 在左侧导航栏,单击集群管理 > 资源管理,单击资源组管理页签。

    3. 单击对应资源组操作列的详情,查看内网连接地址和公网连接地址。您可单击端口号括号内的image按钮,复制连接地址。

      以下两种情况,您需要单击公网地址后的申请网络,手动申请公网连接地址。

      • 提交Spark SQL作业的客户端工具部署在本地。

      • 提交Spark SQL作业的客户端工具部署在ECS上,且ECSAnalyticDB for MySQL不属于同一VPC。

交互式查询

控制台

重要

若您是自建HiveMetastore,使用控制台开发Spark SQL作业时,请在AnalyticDB for MySQL中创建一个名为default的数据库,并选择它作为执行Spark SQL的数据库。

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

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

  3. 选择Spark引擎和创建的Spark Interactive型资源组,执行如下Spark SQL:

    SHOW DATABASES;

Hive JDBC

  1. 在pom.xml中配置Maven依赖。

        <dependency>
          <groupId>org.apache.hive</groupId>
          <artifactId>hive-jdbc</artifactId>
          <version>2.3.9</version>
        </dependency>
  2. 建立连接并执行Spark SQL。

    public class java {
        public static void main(String[] args) throws Exception {
    
            Class.forName("org.apache.hive.jdbc.HiveDriver");
            String url = "<连接地址>";
            Connection con = DriverManager.getConnection(url, "<用户名>", "<密码>");
            Statement stmt = con.createStatement();
            ResultSet tables = stmt.executeQuery("show tables");
            List<String> tbls = new ArrayList<>();
            while (tables.next()) {
                System.out.println(tables.getString("tableName"));
                tbls.add(tables.getString("tableName"));
            }
        }
    }

    参数说明:

    • 连接地址:准备工作中获取的Spark Interactive型资源组连接地址。其中default需替换成实际连接的数据库名称。

    • 用户名:AnalyticDB for MySQL的数据库账号。

    • 密码:AnalyticDB for MySQL数据库账号的密码。

PyHive

  1. 安装Python Hive客户端。

    pip install pyhive
  2. 建立连接并执行Spark SQL。

    from pyhive import hive
    from TCLIService.ttypes import TOperationState
    
    cursor = hive.connect(
        host='<连接地址>',
        port=<端口号>,
        username='<资源组名称>/<用户名>',
        password='<密码>',
        auth='CUSTOM'
    ).cursor()
    
    cursor.execute('show tables')
    
    status = cursor.poll().operationState
    while status in (TOperationState.INITIALIZED_STATE, TOperationState.RUNNING_STATE):
        logs = cursor.fetch_logs()
        for message in logs:
            print(message)
        # If needed, an asynchronous query can be cancelled at any time with:
        # cursor.cancel()
        status = cursor.poll().operationState
    print(cursor.fetchall())
    

    参数说明:

    • 连接地址:准备工作中获取的Spark Interactive型资源组连接地址。其中default需替换成实际连接的数据库名称。

    • 端口号:Spark Interactive型资源组的端口号,固定为10000

    • 资源组名称:Spark Interactive型资源组的名称。

    • 用户名:AnalyticDB for MySQL的数据库账号。

    • 密码:AnalyticDB for MySQL数据库账号的密码。

Beeline

  1. 连接Spark Interactive型资源组

    命令格式如下:

    !connect <连接地址> <用户名> <密码>
    • 连接地址:准备工作中获取的Spark Interactive型资源组连接地址。其中default需替换成实际连接的数据库名称。

    • 用户名:AnalyticDB for MySQL的数据库账号。

    • 密码:AnalyticDB for MySQL数据库账号的密码。

    示例:

    !connect jdbc:hive2://amv-bp1c3em7b2e****-spark.ads.aliyuncs.com:10000/adb_test spark_resourcegroup/AdbSpark14**** Spark23****

    返回结果:

    Connected to: Spark SQL (version 3.2.0)
    Driver: Hive JDBC (version 2.3.9)
    Transaction isolation: TRANSACTION_REPEATABLE_READ
  2. 执行Spark SQL。

    SHOW TABLES;

DBeaver

  1. 打开DBeaver客户端,单击数据库 > 新建数据库连接

  2. 连接到数据库页面,选择Apache Spark,单击下一步

  3. 配置Hadoop/Apache Spark 连接设置,参数说明如下:

    参数

    说明

    连接方式

    连接方式选择为URL

    JDBC URL

    请填写准备工作中获取的连接地址。详情请参见准备工作

    重要

    连接地址中的db需替换为实际的数据库名。

    用户名

    AnalyticDB for MySQL的数据库账号。

    密码

    AnalyticDB for MySQL数据库账号的密码。

  4. 上述参数配置完成后,单击测试连接

    重要

    首次测试连接时,DBeaver会自动获取需要下载的驱动信息,获取完成后,请单击下载,下载相关驱动。

  5. 测试连接成功后,单击完成

  6. 数据库导航页签下,展开对应数据源的子目录,单击对应数据库。

  7. 在右侧代码框中输入SQL语句,并单击image按钮运行。

    SHOW TABLES;

    返回结果如下:

    +-----------+-----------+-------------+
    | namespace | tableName | isTemporary |
    +-----------+-----------+-------------+
    |    db     |   test    |     []      |
    +-----------+-----------+-------------+

DBVisualizer

  1. 打开DBVisualizer客户端,单击Tools > Driver Manager

  2. Driver Manage页面,选择Hive,单击image按钮

  3. Driver Settings页签下,配置如下参数:

    参数

    说明

    Name

    Hive数据源名称,您可以自定义名称。

    URL Format

    请填写准备工作中获取的连接地址。详情请参见准备工作

    重要

    连接地址中的db需替换为实际的数据库名。

    Driver Class

    Hive驱动,固定选择为org.apache.hive.jdbc.HiveDriver

    说明

    参数配置完成后,请单击Start Download,下载对应驱动。

  4. 驱动下载完成后,单击Database > Create Database Connection > Create Database Connection from Database URL

  5. Create Database Connection from Database URL对话框中填写以下参数:

    参数

    说明

    Database URL

    请填写准备工作中获取的连接地址。详情请参见准备工作

    重要

    连接地址中的db需替换为实际的数据库名。

    Driver Class

    选择步骤3创建的Hive数据源。

  6. Connection页面配置以下连接参数,并单击Connect

    参数

    说明

    Name

    默认与步骤3创建的Hive数据源同名,您可以自定义名称。

    Notes

    备注信息。

    Driver Type

    选择Hive

    Database URL

    请填写准备工作中获取的连接地址。详情请参见准备工作

    重要

    连接地址中的db需替换为实际的数据库名。

    Database Userid

    AnalyticDB for MySQL的数据库账号。

    Database Password

    AnalyticDB for MySQL数据库账号的密码。

    说明

    其他参数无需配置,使用默认值即可。

  7. 连接成功后,在Database页签下,展开对应数据源的子目录,单击对应数据库。

  8. 在右侧代码框中输入SQL语句,并单击image按钮运行。

    SHOW TABLES;

    返回结果如下:

    +-----------+-----------+-------------+
    | namespace | tableName | isTemporary |
    +-----------+-----------+-------------+
    |    db     |   test    |    false    |
    +-----------+-----------+-------------+