教程:Snowflake Native SDK for Connectors 示例 Java 连接器

简介

欢迎学习关于使用 Snowflake Native SDK for Connectors 构建的连接器示例的教程。本指南将向您展示如何构建、部署、安装和配置示例连接器。

提供的示例应用程序通过连接到 GitHub API 从指定存储库中获取有关问题的信息,从而引入 GitHub 问题数据。

在本教程中,您将学习如何执行以下操作:

  • 从源构建示例连接器

  • 部署新的应用程序包和版本

  • 安装新的应用程序实例

  • 配置连接器实例以引入数据

先决条件

在开始之前,请确保您满足以下要求:

  • Java 基础知识

  • Snowflake Native Apps 基础知识

  • Streamlit UI (https://docs.streamlit.io/) 基础知识

  • 访问具有 ACCOUNTADMIN 角色的 Snowflake 账户

  • GitHub 账户,可以创建 GitHub 应用程序 (https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps)

  • 构建项目和运行部署脚本的 MacOS 或 Linux 计算机

准备本地环境

在继续之前,您需要先确保计算机上安装了所有必要的软件,并克隆示例连接器存储库。

Java 安装

Snowflake Native SDK for Connectors 需要 Java LTS(长期支持)版本 11 或更高版本。如果计算机上未安装所需的最低 Java 版本,则必须安装 Oracle Java 或 OpenJDK。

Oracle Java

JDK 的最新 LTS 版本可在 Oracle NFTC 下免费下载和使用。有关下载和安装说明,请访问 Oracle 页面 (https://www.oracle.com/java/technologies/downloads/)。

OpenJDK

OpenJDK 是 Java 的一个开源实施。有关下载和安装说明,请访问 openjdk.org (https://openjdk.org/install/) 和 jdk.java.net (https://jdk.java.net/)。

您也可以使用第三方 OpenJDK 版本,如 Eclipse Temurin (https://adoptium.net/temurin/releases/) 或 Amazon Corretto (https://aws.amazon.com/corretto/)。

存储库克隆

将 connectors-native-sdk (https://github.com/snowflakedb/connectors-native-sdk) 存储库克隆到计算机。

Snowflake CLI 配置

构建、部署和安装连接器需要 Snowflake CLI 工具。如果计算机上没有 Snowflake CLI – 根据`此处 <https://docs.snowflake.cn/en/developer-guide/snowflake-cli/installation/installation>`_ 的说明进行安装。

安装该工具后 – 您需要在 配置文件 中配置与 Snowflake 的连接。

如果您没有配置任何连接 – 请创建一个名为 native_sdk_connection 的新连接。您可以在 deployment/snowflake.toml 文件中找到示例连接。

如果您已经配置了连接,并希望将其与连接器一起使用 – 在本教程中使用此连接时,请使用其名称而不是 native_sdk_connection

项目结构

Snowflake Native SDK for Connectors 项目由几个主要元素组成。

连接器原生 SDK Java

connectors-native-sdk-java 目录包含所有 Snowflake Native SDK for Connectors Java 代码,并针对 SDK 组件进行了单元测试和集成测试。由于 Snowflake 内部原生应用程序的性质,这不仅意味着 Java 代码,还有 SQL 代码,这是创建正常工作的应用程序所必需的。数据库对象的定义可以在 src/main/resources 目录中找到。这些文件在创建应用程序时用于自定义应用程序内部可用的对象。在示例连接器中,我们使用 all.sql 文件,该文件为所有可用功能创建对象。此文件将在应用程序实例的安装过程中执行。

连接器原生 SDK 测试 Java

connectors-native-sdk-test-java 目录包含单元测试中使用的 helper 库的源代码,例如用于模拟特定组件的对象、自定义断言等。这些文件不是连接器应用程序的一部分。

Java GitHub 连接器示例

实际示例连接器位于 examples/connectors-native-sdk-example-java-github-connector 目录内部。app/ 目录包含运行 Native App 所需的所有文件:

  • app/streamlit/ 目录包含运行连接器的 Streamlit UI 所必需的源文件。

  • setup.sql 文件在应用程序安装期间运行,负责创建必要的数据库对象。此文件将执行前面提到的 all.sql 文件,以及一些自定义 sql 代码。

  • manifest.yml 文件是 Native App 的清单。需要先创建一个应用程序包,然后再创建应用程序实例本身。此文件指定应用程序属性以及应用程序所需的权限。

此外,examples/connectors-native-sdk-example-java-github-connector 目录还包含 src/ 子目录,其中包含自定义连接器逻辑,例如实施所需类和自定义默认 SDK 组件。

连接器原生 SDK 模板

模板 Gradle Java 项目,使用 Snowflake Native SDK for Connectors 作为依赖项来帮助您快速构建新连接器。您可以在 教程:Snowflake Native SDK for Connectors Java 连接器模板 阅读更多相关内容。

构建、部署和安装

以下各节将向您展示如何构建、部署和安装示例连接器。

构建连接器

构建使用 Snowflake Native SDK for Connectors 创建的连接器与构建典型的 Java 应用程序略有不同。除了使用源构建 .jar 存档之外,还必须进行一些其他操作。构建应用程序包括以下步骤:

  1. 将自定义内部组件复制到构建目录

  2. 将 SDK 组件复制到构建目录

复制内部组件

此步骤构建连接器 .jar 文件,然后将该文件(连同 UI、清单和设置文件一起)复制到 sf_build 目录。

要运行此步骤,请执行命令:./gradlew copyInternalComponents

复制 SDK 组件

此步骤将 SDK .jar 文件(作为依赖项添加到连接器 Gradle 模块)复制到 sf_build 目录,并从 .jar 存档中提取捆绑的 .sql 文件。

这些 .sql 文件允许自定义在应用程序安装期间将创建哪些提供的对象。初次使用时,不建议用户自定义,因为如果操作不正确,省略对象可能会导致某些功能失败。示例连接器应用程序使用 all.sql 文件,该文件创建所有推荐的 SDK 对象。

要运行此步骤,请执行命令:./gradlew copySdkComponents

部署连接器

要部署 Native App,需要在 Snowflake 内创建应用程序包。之后,需要将 sf_build 目录中的所有文件上传到 Snowflake。

请注意 – 出于开发目的,可以选择版本创建,可以直接从暂存文件创建应用程序实例。此方法允许您查看大多数连接器文件中的变化,无需重新创建版本和应用程序实例。

将执行以下操作:

  1. 创建新的应用程序包(如果不存在)

  2. 在包中创建架构和文件暂存区

  3. 将文件从 sf_build 目录上传到暂存区(此步骤可能需要一些时间)

要部署连接器,请执行命令 snow app deploy --connection=native_sdk_connection

有关 snow app deploy 命令的更多信息,请参阅 snow app deploy

创建的应用程序包现在将在 App packages 选项卡、Data products 类别、账户的 Snowflake UI 中可见。

应用程序包视图

安装连接器

安装应用程序是该过程的最后一步。该步骤会使用之前创建的应用程序包创建应用程序。

要安装连接器,请执行命令:snow app run --connection=native_sdk_connection

有关 snow app run 命令的更多信息,请参阅 Snow 应用程序运行

安装的应用程序现在将在 Installed apps 选项卡、Data products 类别、账户的 Snowflake UI 中可见。

安装的应用程序视图

更新连接器文件

如果在任何时候希望修改任何连接器文件,您可以轻松地将修改的文件上传到应用程包暂存区。上传命令取决于更新了哪些文件。

在运行任何更新命令之前,您必须通过运行以下命令将连接器的新文件复制到 sf_build 目录中:./gradlew copyInternalComponents

UI .py files or connector .java files

使用 snow app deploy --connection=native_sdk_connection 命令,当前应用程序实例将使用新文件,无需重新安装。

setup.sql 或 manifest.yml 文件

使用 snow app run --connection=native_sdk_connection 命令,将在新文件上传到暂存区后重新安装当前应用程序实例。

连接器流

在开始配置连接器和引入数据之前,我们应该先快速浏览连接器的实际工作原理。下面您可以看到本教程后续步骤中将要完成的所有步骤。首先是完成先决条件并查看向导。

连接器的向导阶段将引导用户完成连接器所需的所有配置。日常使用阶段允许用户查看统计信息、配置存储库以引入和暂停/恢复连接器。

连接器流程概述

配置向导

打开应用程序后,将打开向导 UI 页面。连接器需要用户提供的一些信息,然后才能开始引入数据。向导将指导您完成应用程序本身以及整个 Snowflake 账户的所有必要步骤,有时还加上作为引入数据来源的外部系统,在本例中是 GitHub。完成所有这些步骤后 – 连接器将准备开始引入数据。

先决条件

向导的第一步是先决条件。此步骤将为您提供配置连接器前应做好的准备的清单。不需要完成先决条件,但为确保之后的配置过程更顺利,建议先完成先决条件。

在示例 GitHub 连接器的情况下,需要先注意以下亮点,然后才能继续:

  1. 准备 GitHub 账户

  2. 确认对要引入的 GitHub 存储库的访问权限

先决条件

连接器配置

向导的下一步是连接器配置。此步骤让用户可以:

权限

应用程序需要两个账户级权限才能操作:CREATE DATABASEEXECUTE TASK

需要第一个特权来为引入的数据创建目标数据库。此数据库应在应用程序外创建,这样,如果卸载应用程序,引入的数据可以保持不变。但是,本示例不支持此功能,始终会创建新的数据库。

需要第二个权限来计划周期性任务,这些任务将从 GitHub 提取数据并将其保存在目标数据库中。

可以使用安全选项卡或通过在连接器配置屏幕中按下 Grant privileges 按钮授予这些权限。后者将使屏幕上出现弹出窗口。

权限

仓库引用

连接器需要仓库来运行和计划引入任务。应用程序将通过 引用 使用仓库。仓库引用在 manifest.yml 文件中定义:

references:
  - WAREHOUSE_REFERENCE:
      label: "Warehouse used for ingestion"
      description: "Warehouse which will be used to schedule ingestion tasks"
      privileges: [USAGE]
      object_type: WAREHOUSE
      register_callback: PUBLIC.REGISTER_REFERENCE
Copy

引用可以使用安全选项卡设置,与上述权限相同,也可以通过按 Choose warehouse 按钮设置。

仓库引用

目标数据库和架构

如前所述,连接器需要一个数据库来存储引入的数据。在后续的一个步骤中,将使用用户指定的架构创建此数据库。数据库的名称由用户决定,只要提供的数据库不存在。

完成的连接器配置屏幕应类似于:

连接器配置屏幕

连接配置

向导的下一步是连接配置。此步骤允许用户设置与外部数据源的连接。我们建议尽可能使用 OAuth2 身份验证,而不是使用用户/密码或纯文本令牌。

GitHub 目前支持两种 OAuth2 身份验证方式:OAuth 应用程序和 GitHub 应用程序。OAuth 应用程序的设置和使用更简单,但无法提供相同级别的权限控制精度。我们建议在此例中使用 GitHub 应用程序,但是如果您希望使用 OAuth 应用程序,连接器也会按预期工作。

权限 SDK 设置

OAuth2 身份验证要求在用户账户中创建安全集成、密钥和外部访问集成。我们的连接器使用 Native Apps 权限 SDK 请求创建这些对象。

连接器所需的外部访问集成和密钥的引用在 manifest.yml 文件中定义:

references:
  - GITHUB_EAI_REFERENCE:
      label: "GitHub API access integration"
      description: "External access integration that will enable connection to the GitHub API using OAuth2"
      privileges: [USAGE]
      object_type: "EXTERNAL ACCESS INTEGRATION"
      register_callback: PUBLIC.REGISTER_REFERENCE
      configuration_callback: PUBLIC.GET_REFERENCE_CONFIG
  - GITHUB_SECRET_REFERENCE:
      label: "GitHub API secret"
      description: "Secret that will enable connection to the GitHub API using OAuth2"
      privileges: [READ]
      object_type: SECRET
      register_callback: PUBLIC.REGISTER_REFERENCE
      configuration_callback: PUBLIC.GET_REFERENCE_CONFIG
Copy

此外,需要在 setup.sql 文件中添加一个特殊程序。在 configuration_callback 属性中引用了上述每个引用:

CREATE OR REPLACE PROCEDURE PUBLIC.GET_REFERENCE_CONFIG(ref_name STRING)
    RETURNS STRING
    LANGUAGE SQL
    AS
        BEGIN
            CASE (ref_name)
                WHEN 'GITHUB_EAI_REFERENCE' THEN
                    RETURN OBJECT_CONSTRUCT(
                        'type', 'CONFIGURATION',
                        'payload', OBJECT_CONSTRUCT(
                            'host_ports', ARRAY_CONSTRUCT('api.github.com'),
                            'allowed_secrets', 'LIST',
                            'secret_references', ARRAY_CONSTRUCT('GITHUB_SECRET_REFERENCE')
                        )
                    )::STRING;
                WHEN 'GITHUB_SECRET_REFERENCE' THEN
                    RETURN OBJECT_CONSTRUCT(
                        'type', 'CONFIGURATION',
                        'payload', OBJECT_CONSTRUCT(
                            'type', 'OAUTH2',
                            'security_integration', OBJECT_CONSTRUCT(
                                'oauth_scopes', ARRAY_CONSTRUCT('repo'),
                                'oauth_token_endpoint', 'https://github.com/login/oauth/access_token',
                                'oauth_authorization_endpoint', 'https://github.com/login/oauth/authorize'
                            )
                        )
                    )::STRING;
                ELSE
                    RETURN '';
            END CASE;
        END;
Copy

对于外部访问集成引用,该过程提供:

  • host_ports – 外部数据源的主机名,将在引入期间访问

  • secret_references – OAuth 密钥引用名称数组

  • allowed_secretsLIST,告知权限 SDK 使用 secret_references 字段中指定的密钥

对于密钥参考,该过程提供:

  • type – 使用我们的密钥时,为 OAUTH2

  • security_integration – 创建的安全集成的属性:

    • oauth_scopes – 连接器请求的 OAuth 作用域列表(如果使用 GitHub 应用程序 – 此字段为可选字段)

    • oauth_token_endpoint – 将从中获取刷新和访问令牌的端点

    • oauth_authorization_endpoint – 将向其发送授权请求的端点

GitHub 应用程序设置

下一步是在用户账户中设置 GitHub 应用程序。此应用程序将用于授予对该账户的有限访问权限,以便引入数据。

第一步是按下连接器 UI 中的 Request access 按钮。

请求 OAuth 访问权限

第一个屏幕允许您查看允许外部连接的端点。

查看 EAI 端点

按下 Next 后,您将看到第二个屏幕。选择 OAuth2 以创建新的集成和密钥,然后复制提供的重定向 URL,其中将包含您的组织名称和账户区域。

OAuth 重定向 URL

接下来,进入 GitHub 账户设置页面,然后进入 开发者设置 > GitHub Apps,并按下 New GitHub App 按钮:

  1. 输入应用程序的名称和主页 URL

  2. 将您复制的重定向 URL 粘贴到 Callback URL 字段

  3. 确保选中 Expire user authorization tokens 选项

  4. 确保未选中 Request user authorization (OAuth) during installation

  5. 如果不需要,取消选中 Webhook 部分的 Active 选项

  6. 选择连接器工作所需的权限:

    1. 具有 Read-only 访问权限的 存储库权限 > Issues

    2. 具有 Read-only 访问权限的 存储库权限 > Metadata

  7. 如果应用程序仅供您使用,则使用此示例连接器,最好在安装访问部分选择 Only on this account

创建应用程序后,按左侧边栏中的 Install app 选项,然后在账户中安装应用程序。您可以选择应用程序(以及扩展连接器)能够访问的存储库。如果没有进行此安装,连接器将只能访问公共存储库。

OAuth 集成设置

安装完成后返回 GitHub 应用程序,并生成新的客户端密钥。确保立即复制该密钥,因为不会再次显示。将客户端密钥粘贴到连接器的 OAuth 配置弹出窗口中。最后,复制应用程序的客户端 ID(不是应用程序 ID),并将其粘贴到连接器的 OAuth 配置弹出窗口中。

OAuth 配置

按下 Connect 后,将弹出一个 GitHub 窗口,要求您为 GitHub 账户进行应用程序授权。授权后,系统会将您自动重定向回连接器 UI。成功授权后(可能需要几秒钟才能完成并关闭弹出窗口),页面将填充外部访问集成和密钥引用的 IDs。

连接配置屏幕

按下 Connect 按钮将触发连接器内的 TEST_CONNECTION 过程。此过程将尝试访问 GitHub API octocat 端点 (https://api.github.com/octocat),以检查是否正确配置外部连接,以及是否正确获得 OAuth 访问令牌。

测试成功时,应用程序将进入最终步骤。

配置完成

“完成”是向导的最后一步。在此步骤中,系统将要求您提供组织和存储库名称。必须使用连接配置步骤中获得的 OAuth 令牌才能访问此存储库。提供的存储库将仅用于连接验证目的。

这与上一步有些不同,因为 TEST_CONNECTION 过程只检查 GitHub API 是否可以访问,以及提供的令牌是否有效。

最终步骤确保可以使用提供的 GitHub API 令牌访问用户提供的存储库。如果令牌没有访问存储库所需的权限,将会失败。如果您要从私有存储库引入数据,我们建议使用私有存储库完成配置,以确保其正常工作。

此外,在此步骤中,连接器配置阶段指定的数据库和架构最终将在您的账户中创建。

完成配置屏幕

日常使用

配置向导成功完成后,您现在可以开始使用示例 GitHub 连接器了。

接下来的步骤将说明:

  • 如何配置资源以引入数据

  • 引入流程的工作原理

  • 如何查看引入记录的统计信息

  • 如何查看引入的数据

  • 如何暂停和恢复连接器

配置资源

要配置资源,请转到 Data Sync 选项卡。此选项卡显示已为引入配置的存储库的列表。首次打开时,列表为空。

要配置资源,请在指定字段中输入组织和存储库名称,然后按下 Queue ingestion 按钮。例如:

定义资源

将保存新资源的定义,排程器将根据全局计划来获取该资源。需要一段时间才能引入数据并在接收器表中可见。 它将在下表中可见:

列表定义的资源

引入时间表和状态

Data Sync 选项卡的顶部有一个部分,其中包含有关引入的一般信息。此部分允许用户查看引入配置资源的全局计划。右下角的标签显示当前的引入状态。一开始会显示 NOT SYNCING 状态,直到定义第一个资源。之后,将转换为 SYNCING,最后至少一个资源引入成功完成时,将显示该引入的完成日期。

同步状态

引入进程

引入过程使用 Scheduler TaskTask Reactor 组件处理。排程器根据全局计划获取定义的资源,并将它们作为 Work Items 提交到队列中。然后,名为 Dispatcher 的任务反应器组件将获取它们,并在定义的处理器数量间分配。每个处理器都对其获取的队列中的每个项目执行实际引入。

资源的单次引入包括从 GitHub API 中的端点提取数据,然后将它们保存在接收器数据库中指定的表中。对于此示例而言,每次运行都会提取所有数据,从而导致向表中添加新记录并更新旧记录。此外,每个 Work Item 的执行还包括将开始和结束日期、引入行数、状态等数据记录到内部连接器表中,然后用于统计目的。

查看统计数据

Home 屏幕包含过去引入运行的统计数据。数据基于 PUBLIC.AGGREGATED_CONNECTOR_STATS 视图。视图根据引入当天的时间来汇总引入的行数。可以使用工作表中运行的 SELECT 查询来检索此视图中的数据,这样也可以按大于一小时的时间窗口进行汇总。

还有一个视图可以通过工作表获得:PUBLIC.CONNECTOR_STATS。使用此数据,您可以看到状态、开始和结束日期、平均每秒引入的行数以及有关数据引入的一些其他信息。

引入统计数据图表示例:

引入统计数据

查看引入的数据

引入的数据在 UI 中不可见,但可以由具有 ADMINDATA_READER 角色的用户通过查询特定表中的数据来查看。要查看数据,您必须转到 SQL 工作表,并选择目标数据库。目标数据库使用连接器配置步骤中定义的名称和架构。您可以从以下位置 SELECT 数据:

  1. ISSUES 表,其中包含以下列:

    • ORGANIZATION

    • REPOSITORY

    • RAW_DATA

  2. ISSUES_VIEW 视图,其中包含以下列:

    • ID

    • ORGANIZATION

    • REPOSITORY

    • STATE

    • TITLE

    • CREATED_AT

    • UPDATED_AT

    • ASSIGNEE

ISSUES_VIEW 视图中可见的数据从 ISSUES 表中的 raw_data 列提取。要查看数据,您可以使用以下查询之一:

SELECT * FROM DEST_DATABASE.DEST_SCHEMA.ISSUES;

SELECT * FROM DEST_DATABASE.DEST_SCHEMA.ISSUES_VIEW;
Copy

暂停和恢复

您可以随时暂停和恢复连接器。为此,只需按 Data Sync 选项卡中的 Pause 按钮。触发暂停时,底层排程和工作执行机制被禁用。但是,系统将在连接器实际进入 PAUSED 状态前完成任何活跃的引入工作。因此,连接器可能需要几分钟的时间才能完全暂停。

要恢复连接器,只需按下 Resume 按钮,该按钮将代替 Pause 按钮显示。此操作将恢复排程任务,从而开始对新 Work Items 进行排队。

暂停连接器

连接器设置

配置完成后,另一个名为 Settings 的选项卡变为可用。此选项卡允许用户查看当前的连接器和连接配置。此选项卡中的数据是从底层 APP_CONFIG 配置表中提取的,并且是只读数据。

连接器配置设置
连接配置设置

故障排除

如果连接器遇到任何问题,在账户中创建并设置好表后,这些问题将在 event table 日志中可见。

有关在 Native Apps 中启用和使用 event table、事件日志和事件共享的详细信息,请参阅文档:

清理

完成教程后,您可以按照日常使用部分的说明暂停连接器,或者使用以下命令将其完全从账户中删除:

snow app teardown --connection=native_sdk_connection --cascade --force

需要使用 --cascade 选项才能移除目标数据库,而不将所有权转移给账户管理员。在真正的连接器中,请勿移除数据库,以保留引入的数据,所有权应归属于账户管理员,或者在卸载前转移所有权。

如果跳过清理部分,示例连接器将使用 credit,直到暂停或删除为止,即使没有配置可引入的存储库!

自定义

本教程展示了一个使用 Snowflake Native SDK for Connectors 构建的连接器示例。要详细了解如何自定义连接器,或从头构建自己的连接器,请参阅:

语言: 中文