DuckDB 社区扩展

DuckDB团队
2024-07-05 · 7 分钟

要点:DuckDB 扩展现在可以作为 DuckDB 社区扩展发布。该仓库使用户更容易使用 INSTALL extension_name FROM community 语法安装扩展。 扩展开发者可以避免编译和分发的负担。

要浏览现有的社区扩展,请访问 DuckDB 社区扩展文档页面

DuckDB 扩展

设计理念

DuckDB 的主要设计目标之一是简单性,对我们而言,这意味着系统应该相当灵活,依赖性很小,并且通常足够小,可以在诸如 WebAssembly 之类的受限平台上运行。 此目标与用户要求支持高级功能(如空间数据分析、向量索引、与其他各种数据库的连接、对数据格式的支持等)的合理请求直接冲突。 将所有这些功能烘焙到一个单体二进制文件中当然是可能的,并且是一些系统所采用的路线。 但是我们希望保持 DuckDB 的简单性。 此外,对于大多数用户来说,交付所有可能的功能会相当过分,因为没有用例同时需要所有扩展(“Microsoft Word 悖论”,即使是高级用户也只使用系统的一小部分功能,但是用户之间使用的确切功能集有所不同)。

为了实现这一点,DuckDB 具有强大的扩展机制,允许用户向 DuckDB 添加新功能。 这种机制允许注册新函数、支持新文件格式和压缩方法、处理新网络协议等。 实际上,DuckDB 的许多流行功能都是作为扩展实现的:Parquet 阅读器JSON 阅读器HTTPS/S3 连接器都使用扩展机制。

使用扩展

自从 0.3.2 版本以来,我们已经通过将它们托管在集中的扩展仓库中,大大简化了发现和安装过程。 因此,例如,要安装 spatial 扩展,只需使用 DuckDB 的 SQL 接口运行以下命令即可

INSTALL spatial; -- once
LOAD spatial;    -- on each use

幕后发生的事情是,DuckDB 下载适合当前操作系统和处理器架构(例如,ARM64 上的 macOS)的扩展二进制文件,并将其存储在 ~/.duckdb 文件夹中。 在每次 LOAD 时,此文件都会加载到正在运行的 DuckDB 实例中,并且一切顺利地继续进行。 当然,为了使此操作有效,我们需要编译、签名和托管扩展程序,以用于相当庞大且不断增长的处理器架构 - 操作系统组合列表。 这种机制已经被大量使用,目前,我们看到每周大约有六百万次扩展下载,以及大约 40 TB 的相应数据传输量!

到目前为止,发布第三方扩展程序一直是一个困难的过程,需要扩展程序开发人员在其仓库中为许多平台构建扩展程序。 此外,他们无法使用官方密钥对扩展程序进行签名,从而迫使用户使用 allow_unsigned_extensions 选项,该选项禁用了签名检查,这本身就存在问题。

DuckDB 社区扩展

以安全的方式分发软件从未如此简单,这使我们能够覆盖广泛的用户群,包括 pip、conda、cran、npm、brew 等。 我们希望为用户提供类似的体验,他们可以轻松地获取他们想要使用的扩展,以及不应该承担分发细节的开发者。 我们还有兴趣降低将实用程序和脚本打包为 DuckDB 扩展的门槛,从而使用户能够打包与其专业领域(或痛点)相关的有用功能。

我们认为,培养社区扩展生态系统是 DuckDB 的下一个合乎逻辑的步骤。 这就是为什么我们很高兴推出我们的 社区扩展仓库,该仓库已在 Data + AI Summit 上宣布

对于用户而言,该仓库允许直接从 DuckDB SQL 提示符轻松发现、安装和维护社区扩展。 对于开发者而言,它大大简化了扩展程序的发布过程。 在下文中,我们将讨论新的扩展仓库如何增强这些群体的体验。

用户体验

我们将以 h3 扩展作为示例。 此扩展实现了用于地理空间数据的 分层六边形索引

使用 DuckDB 社区扩展仓库,您现在可以按如下方式安装和加载 h3 扩展

INSTALL h3 FROM community;
LOAD h3;

然后,您可以立即开始使用它。 请注意,示例数据为 500 MB

SELECT
    h3_latlng_to_cell(pickup_latitude, pickup_longitude, 9) AS cell_id,
    h3_cell_to_boundary_wkt(cell_id) AS boundary,
    count() AS cnt
FROM read_parquet('https://blobs.duckdb.org/data/yellow_tripdata_2010-01.parquet')
GROUP BY cell_id
HAVING cnt > 10;

加载时,将检查扩展程序的签名,既要确保平台和版本兼容,又要验证二进制文件的来源是否为社区扩展仓库。 扩展程序是为 Linux、macOS、Windows 和 WebAssembly 构建、签名和分发的。 这允许使用 1.0.0 版本和即将推出的版本的任何 DuckDB 客户端都可以使用扩展程序。

h3 扩展的文档位于 https://duckdb.net.cn/community_extensions/extensions/h3

开发者体验

从开发者的角度来看,社区扩展仓库执行发布扩展程序所需的步骤,包括为所有相关的 平台构建扩展程序、对扩展程序二进制文件进行签名以及从仓库中提供这些文件。

对于 h3 的维护者,发布过程需要执行以下步骤

  1. 发送带有元数据文件 description.yml 的 PR,其中包含扩展程序的描述

    extension:
      name: h3
      description: Hierarchical hexagonal indexing for geospatial data
      version: 1.0.0
      language: C++
      build: cmake
      license: Apache-2.0
      maintainers:
        - isaacbrodsky
    
    repo:
      github: isaacbrodsky/h3-duckdb
      ref: 3c8a5358e42ab8d11e0253c70f7cc7d37781b2ef
    
  2. CI 将构建并测试扩展程序。 CI 执行的检查与 extension-template 仓库对齐,因此可以独立完成迭代。

  3. 等待 DuckDB 社区扩展仓库维护者的批准以及构建过程完成。

已发布的扩展

为了表明发布扩展程序是可行的,我们联系了一些关键扩展程序的开发者。 在发布此博客文章时,DuckDB 社区扩展仓库已经包含以下扩展程序。

名称 描述
crypto 添加加密哈希函数和 HMAC
h3 实现用于地理空间数据的分层六边形索引。
lindel 实现线性化/反线性化、Z 阶曲线、希尔伯特曲线和莫顿曲线。
prql 允许直接在 DuckDB 中运行 PRQL 命令。
scrooge 支持一组用于财务数据的聚合函数和数据扫描器。
shellfs 允许将 shell 命令用于输入和输出。

DuckDB Labs 和 DuckDB 基金会不审查社区扩展中的代码,因此,无法保证 DuckDB 社区扩展可以安全使用。 可以使用以下单向配置选项显式禁用社区扩展的加载

SET allow_community_extensions = false;

有关更多详细信息,请参阅文档的 Securing DuckDB 页面

总结和展望

在此博客文章中,我们介绍了 DuckDB 社区扩展仓库,该仓库允许轻松安装第三方 DuckDB 扩展。

我们期待继续扩展此仓库。 如果您有创建扩展程序的想法,请查看已发布的扩展程序源代码,这些代码提供了有关如何打包社区扩展程序的良好示例,并加入我们的 Discord 上的 #extensions 频道。 拥有扩展程序后,请通过 pull request 提交它。

最后,我们要感谢 DuckDB 扩展机制和社区扩展仓库的早期采用者。 感谢您与我们一起迭代并向我们提供反馈。