跳过内容

在大多数情况下,运行 install.packages("arrow") 即可直接完成安装。本文记录了一些可以加快安装速度的方法。如果因某种原因安装失败,请设置环境变量 ARROW_R_DEV=true,重试安装,并将日志分享给我们。

请注意,CRAN 构建的 arrow 版本禁用了一些可选功能,包括 Google Cloud Storage (GCS) 支持。如果您需要这些功能,请参阅下文中关于使用 libarrow 二进制文件进行构建的信息,或参阅云存储文章以了解其他安装选项。

背景

Apache Arrow 项目是用多种语言实现的,R 包依赖于 Arrow C++ 库(下文称为 libarrow)。这意味着当您安装 arrow 时,需要同时拥有 R 和 C++ 版本。如果您在 Windows 或 macOS 机器上从 CRAN 安装 arrow,当您调用 install.packages("arrow") 时,系统会自动下载包含 R 包和 libarrow 的预编译二进制文件。然而,CRAN 不提供 Linux 版的 R 包二进制文件,因此您必须从其他可选方案中进行选择。

本文概述了在 Linux 上安装 arrow 的推荐方法,从最简单、自定义程度最低的方法,到最复杂但灵活性最高的方法。

本文的主要目标读者是 Linux 上的 arrow R 包用户,而非 Arrow 开发人员。针对开发人员的其他资源列在本文末尾。

系统依赖

arrow 包的设计旨在实现极低的系统要求,但仍有几点需要注意。

编译器

从 22.0.0 版本开始,arrow 需要 C++20 编译器进行构建。对于 gcc,这通常意味着版本 10 或更新版本。大多数现代 Linux 发行版都拥有足够新的编译器;然而,CentOS 7 是一个显著的例外,因为它自带的是 gcc 4.8。

从云存储(AWS S3 和 Google Cloud Storage (GCS))读取数据的可选支持需要额外的系统依赖:

  • CURL:安装 libcurl-devel (rpm) 或 libcurl4-openssl-dev (deb)
  • OpenSSL >= 3.0:安装 openssl-devel (rpm) 或 libssl-dev (deb)

预构建的二进制文件默认启用了 S3 和 GCS 支持,因此您需要满足这些系统要求才能使用它们。如果您是从源代码构建所有内容,安装脚本将检查这些依赖项是否存在;如果未满足先决条件,构建过程将关闭 S3 和 GCS 支持——安装虽能成功,但将缺失 S3 或 GCS 功能。如果后续安装了缺失的系统依赖,您需要重新安装该包以启用 S3 和 GCS 支持。

安装发布版本(简单方法)

在 macOS 和 Windows 上,当您运行 install.packages("arrow") 并从 CRAN 安装 arrow 时,您会获得一个包含预编译 libarrow 的 R 二进制包。安装二进制文件比从源代码安装容易得多,但 CRAN 不提供 Linux 的二进制文件。这意味着在 Linux 上运行 install.packages() 的默认行为是检索 R 包的源代码,并同时从源代码编译 R 包 libarrow。我们将在下一节(“较不简单”的方法)讨论这种情况,但首先,我们建议两种通常更容易且更快的替代方案。

通过 RSPM/conda 使用带有 libarrow 二进制文件的 R 二进制包

Graphic showing R and C++ logo inside the package icon

如果您想要更快的安装过程,并且默认获得功能更全的构建版本,您可以从 RStudio 的公共包管理器安装 arrow,它托管了 Windows 和 Linux 的二进制文件。

例如,如果您使用的是 Ubuntu 20.04 (Focal):

options(
  HTTPUserAgent =
    sprintf(
      "R/%s R (%s)",
      getRversion(),
      paste(getRversion(), R.version["platform"], R.version["arch"], R.version["os"])
    )
)

install.packages("arrow", repos = "https://packagemanager.rstudio.com/all/__linux__/focal/latest")

请注意,User Agent 标头必须按照上面的示例指定。请查看 RStudio Package Manager: 管理员指南以获取更多详细信息。

对于其他 Linux 发行版,要获取相关的 URL,您可以访问 RSPM 站点,点击“binary”,然后选择您的首选发行版。

同样,如果您使用 conda 管理 R 环境,可以通过以下方式获取包括 libarrow 在内的 R 包最新官方版本:

# Using the --strict-channel-priority flag on `conda install` causes very long
# solve times, so we add it directly to the config
conda config --set channel_priority strict
conda install -c conda-forge r-arrow

带有 libarrow 二进制文件的 R 源代码包

Graphic showing R logo in folder icon, then a plus sign, then C++ logo inside the package icon

实现更快安装并启用所有关键功能的另一种方法是使用我们托管的静态 libarrow 二进制文件。根据 许可列表,这些文件在许多 Linux 发行版(仅限 x86_64 架构)上会自动使用。如果您的发行版不在列表中,您可以在调用 install.packages() 之前设置 NOT_CRAN 环境变量来选择加入。

Sys.setenv("NOT_CRAN" = "true")
install.packages("arrow")

这会安装 R 包的源代码版本,但在安装过程中会检查我们托管的兼容 libarrow 二进制文件,如果可用则会使用它们。如果没有可用的二进制文件或无法找到,此选项将退回到下面的方法 2(完全从源代码构建),但设置该环境变量可以获得比默认情况下功能更全的构建版本。

libarrow 二进制文件包含对 AWS S3 和 GCS 的支持,因此它们需要如上所述单独安装 libcurl 和 openssl 库。如果您没有安装这些库,将不会使用 libarrow 二进制文件,系统将退回到完全从源代码构建(禁用 S3 和 GCS 支持)。

如果您的计算机无法直接下载 libarrow 二进制文件(例如,访问仅限于 CRAN),您可以先在离线计算机上尝试安装,以确定正确的源码和版本:

Sys.setenv("NOT_CRAN" = "true", "LIBARROW_BUILD" = FALSE, "ARROW_R_DEV" = TRUE)
install.packages("arrow")
# This will fail if no internet access, but will print the binaries URL

然后您可以在有互联网连接的计算机上获取 libarrow 二进制文件,并将 zip 文件传输到目标计算机。现在,您只需告诉安装程序使用该预下载的文件即可:

# Watchout: release numbers of the pre-downloaded libarrow must match CRAN!
Sys.setenv("ARROW_DOWNLOADED_BINARIES" = "/path/to/downloaded/libarrow.zip")
install.packages("arrow")

安装发布版本(较不简单的方法)

Graphic showing R inside a folder icon, then a plus sign, then C++ logo inside a folder icon

安装 arrow 的“较不简单”的方法是从源代码安装 R 包和底层的 Arrow C++ 库 (libarrow)。这种方法难度稍大,因为编译和安装带有 C++ 依赖项的 R 包通常需要安装系统软件包(您可能没有相应权限),和/或单独构建 C++ 依赖项,这增加了各种出错的可能性。

从 arrow 的完整源代码构建(同时编译 C++ 和 R 绑定)将为您处理大部分依赖项管理,但它比使用二进制文件慢得多。然而,如果您无法使用二进制文件,或者您希望自定义 Linux 安装,本节中的说明将解释如何操作。

基本配置

如果您希望从源代码安装 libarrow 而不是寻找预编译的二进制文件,您可以设置 LIBARROW_BINARY 变量。

Sys.setenv("LIBARROW_BINARY" = FALSE)

默认情况下,该变量设置为 TRUE,因此 libarrow 仅在设置此环境变量为 FALSE 或找不到适用于您操作系统的兼容二进制文件时,才会从源代码构建。

从源代码编译 libarrow 时,您可以精确微调要安装的功能。您可以将环境变量 LIBARROW_MINIMAL 设置为 FALSE,以启用包括 S3 支持和替代内存分配器在内的功能更全的构建。

Sys.setenv("LIBARROW_MINIMAL" = FALSE)

此变量默认未设置,这将构建许多常用的功能(例如 Parquet 支持),但会禁用一些构建成本较高的功能,如 S3 和 GCS 支持。如果设置为 TRUE,则会安装一个精简版的 arrow,禁用所有可选功能。

请注意,在本指南中,您会看到我们提到了环境变量 NOT_CRAN——这是一个便利变量,当设置为 TRUE 时,它会自动将 LIBARROW_MINIMAL 设置为 FALSE,将 LIBARROW_BINARY 设置为 TRUE

从源代码构建 libarrow 需要比安装二进制文件更多的时间和资源。如果出现问题,我们建议您将环境变量 ARROW_R_DEV 设置为 TRUE,以便在安装过程中获得更详细的输出。

Sys.setenv("ARROW_R_DEV" = TRUE)

设置好这些变量后,调用 install.packages() 以使用此配置安装 arrow。

下节将讨论您可以在调用 install.packages("arrow") 之前设置的环境变量,以便从源代码构建并自定义您的配置。

处理 libarrow 依赖项

当您从源代码构建 libarrow 时,其依赖项将自动下载。环境变量 ARROW_DEPENDENCY_SOURCE 控制 libarrow 安装是否同时下载或安装所有依赖项(设置为 BUNDLED 时)、仅使用系统安装的依赖项(设置为 SYSTEM 时),或先检查系统安装的依赖项并在不存在时仅安装所需的依赖项(设置为 AUTO,这是默认值)。

这些依赖项因平台而异;然而,如果您希望在 libarrow 安装之前自行安装它们,我们建议查看我们任何 CI 构建的 docker 文件(以“cpp”结尾的文件用于构建 Arrow 的 C++ 库,即 libarrow),找出与您的设置最接近的文件。其中包含有关依赖项和最低版本的最新的信息。

如果构建时无法下载依赖项(例如在断开连接或位于防火墙后的系统上构建),有几种可选方案。请参阅下文的“离线构建”。

S3 和 GCS 支持的依赖项

默认的源代码构建中未启用 S3 和 GCS 的数据处理支持,且如上所述,它有额外的系统要求。要启用它,请设置环境变量 LIBARROW_MINIMAL=falseNOT_CRAN=true 以选择全功能构建,或者更具选择性地设置 ARROW_S3=ON 和/或 ARROW_GCS=ON

当启用任一功能时,安装脚本将检查所需的依赖项是否存在;如果满足先决条件,它将启用该支持。如果未满足,构建将禁用 S3 和 GCS 支持——安装虽能成功,但将缺失 S3 或 GCS 功能。如果后续安装了缺失的系统要求,您需要重新安装该包以启用 S3 和 GCS 支持。

高级配置

在本节中,我们将介绍如何更细粒度地微调您的安装。

libarrow 配置

从源代码构建 Arrow 时,某些功能是可选的——您可以通过使用环境变量来配置是否构建这些组件。控制这些功能的环境变量名称及其默认值如下所示。

姓名 描述 默认值
ARROW_S3 S3 支持(如果满足依赖项)* OFF
ARROW_GCS GCS 支持(如果满足依赖项)* OFF
ARROW_JEMALLOC jemalloc 内存分配器 ON
ARROW_MIMALLOC mimalloc 内存分配器 ON
ARROW_PARQUET ON
ARROW_DATASET ON
ARROW_JSON JSON 解析库 ON
ARROW_WITH_RE2 RE2 正则表达式库,用于某些字符串计算函数 ON
ARROW_WITH_UTF8PROC UTF8Proc 字符串库,用于许多其他字符串计算函数 ON
ARROW_WITH_BROTLI 压缩算法 ON
ARROW_WITH_BZ2 压缩算法 ON
ARROW_WITH_LZ4 压缩算法 ON
ARROW_WITH_SNAPPY 压缩算法 ON
ARROW_WITH_ZLIB 压缩算法 ON
ARROW_WITH_ZSTD 压缩算法 ON

R 包配置

还有许多其他变量会影响 configure 脚本和捆绑的构建脚本。所有布尔变量均不区分大小写。

姓名 描述 默认
LIBARROW_BUILD 允许从源代码构建 true
LIBARROW_BINARY 尝试安装 libarrow 二进制文件而不是从源代码构建 (未设置)
LIBARROW_DOWNLOAD 设置为 false 可明确禁止获取 libarrow 二进制文件 (未设置)
LIBARROW_MINIMAL 在启用最少功能的情况下构建 (未设置)
NOT_CRAN 设置 LIBARROW_BINARY=trueLIBARROW_MINIMAL=false false
ARROW_R_DEV 更详细的消息并重新生成某些代码 false
ARROW_USE_PKG_CONFIG 使用 pkg-config 搜索 libarrow 安装 true
LIBARROW_DEBUG_DIR 保存源代码构建日志的目录 (未设置)
CMAKE 备用 CMake 路径 (未设置)

有关这些环境变量的更深入解释,请参阅下文。

  • LIBARROW_BINARY:默认情况下,在许多发行版上,或者如果显式设置为 true,脚本将确定是否存在适用于您系统的预构建 libarrow。您可以将其设置为 false 以完全跳过此选项,或者您可以指定一个对应于可用二进制文件的字符串“distro-version”,以覆盖此函数默认可能发现的内容。可能的值为:“linux-x86_64”, “linux-aarch64”。
  • LIBARROW_BUILD:如果设置为 false,构建脚本将不会尝试从源代码构建 C++。这意味着只有在找到预构建的二进制文件时,您才能获得可用的 arrow R 包。如果您想避免编译可能缓慢且资源密集的 C++ 库,并确保仅使用预构建的二进制文件,请使用此项。
  • LIBARROW_MINIMAL:如果设置为 false,构建脚本将启用一些可选功能,包括 S3 支持和其他替代内存分配器。这将增加源代码构建时间,但会产生功能更全的库。如果设置为 true,则会关闭 Parquet、Datasets、压缩库和其他可选功能。这不常用,但在需要在不支持这些功能的平台(例如 Solaris)上编译时可能很有用。
  • NOT_CRAN:如果此变量设置为 true(如同 devtools 包所做的那样),构建脚本将设置 LIBARROW_BINARY=trueLIBARROW_MINIMAL=false,除非这些环境变量已事先设置。这为已经在其工作流中设置了 NOT_CRAN=true 的用户提供了更完整、更快捷的安装体验,而无需设置额外的环境变量。
  • ARROW_R_DEV:如果设置为 true,构建脚本中将打印更详细的消息。arrow::install_arrow(verbose = TRUE) 会设置此项。如果您正在修改包中的 C++ 代码,也需要此变量:请参阅开发人员指南文章。
  • ARROW_USE_PKG_CONFIG:如果设置为 false,配置脚本将不会在您的系统上查找 Arrow 库,而是倾向于下载/构建它们。如果您安装的系统库与您正在安装的 R 包版本之间存在版本不匹配,请使用此项。
  • LIBARROW_DEBUG_DIR:如果从源代码构建 C++ 库失败 (cmake),可能会有消息告诉您查看构建目录中的某些日志文件。然而,当库在 R 包安装期间构建时,该位置位于已被删除的临时目录中。要捕获这些日志,请将此变量设置为绝对路径(而非相对路径),日志文件将被复制到该处。如果该目录不存在,系统将创建它。
  • CMAKE:从源代码构建 C++ 库时,您可以指定 /path/to/cmake 以使用与 $PATH 中找到的版本不同的版本。

使用 install_arrow()

之前的说明对于全新的 arrow 安装很有用,但 arrow 提供了函数 install_arrow()。此函数有三个常见用例:

  • 您已安装 arrow 并希望升级到不同版本
  • 您想尝试重新安装并修复 Linux C++ 二进制文件的问题
  • 您想安装开发构建版本

使用 install_arrow() 的示例见下文。

install_arrow()               # latest release
install_arrow(nightly = TRUE) # install development version
install_arrow(verbose = TRUE) # verbose output to debug install errors

虽然此函数是 arrow 包的一部分,但它也可作为独立脚本使用,因此您无需先安装该包即可访问它。

source("https://raw.githubusercontent.com/apache/arrow/main/r/R/install-arrow.R")

备注

  • install_arrow() 不需要设置环境变量即可满足 C++ 依赖项。
  • tensorflowblogdown 等需要外部依赖项的包不同,在成功安装 arrow 后,您无需运行 install_arrow()

离线安装

上一节中提到的 install-arrow.R 文件包含一个名为 create_package_with_all_dependencies() 的函数。通常,在有互联网连接的计算机上安装时,构建过程会根据需要下载第三方依赖项。此函数提供了一种提前下载它们的方法,这对于在没有互联网连接的计算机上安装 Arrow 非常有用。过程如下:

第 1 步。 在有互联网连接的计算机上,下载依赖项

第 2 步。 在没有互联网连接的计算机上,安装准备好的包

  • 从复制的文件中安装 arrow 包:

    install.packages(
      "my_arrow_pkg.tar.gz",
      dependencies = c("Depends", "Imports", "LinkingTo")
     )

    此安装将从源代码构建,因此必须提供 cmake

  • 运行 arrow_info() 以检查已安装的功能。

备注

  • arrow 可以在没有互联网连接的计算机上安装,而无需使用此函数,但许多有用的功能将被禁用,因为它们依赖于第三方组件。更准确地说,arrow::arrow_info()$capabilities() 对于每一项功能都将为 FALSE

  • 如果您正在使用二进制包,则不应该需要此函数。您可以从您的包存储库下载相应的二进制文件,将其传输到离线计算机并进行安装。

  • 如果您在 Linux 上使用 RStudio Package Manager (RSPM),并且希望使用此函数制作源代码包,请确保将 options("repos") 中的第一个存储库设置为包含源代码包的镜像。也就是说,该存储库不能是 RSPM 二进制镜像 URL。

离线安装(替代方案)

第二种离线安装方法稍微麻烦一些。如果您想尝试,请按照以下步骤操作:

  • 下载依赖文件(cpp/thirdparty/download_dependencies.sh 可能有帮助)
  • 将依赖项目录复制到离线计算机。
  • 在离线计算机上创建环境变量 ARROW_THIRDPARTY_DEPENDENCY_DIR,指向已复制的目录。
  • 像往常一样安装 arrow 包。

对于使用 libarrow 二进制文件的离线安装,请参阅上面的方法 1b。

故障排除

我们的初衷是 install.packages("arrow") 能够直接工作并处理所有 C++ 依赖项,但根据您的系统,如果您调整其中一个参数,可能会获得更好的结果。以下是一些已知的复杂情况及其解决方法。

包构建 C++ 依赖项失败

如果您在包安装失败时的输出中看到如下消息:

------------------------- NOTE ---------------------------
There was an issue preparing the Arrow C++ libraries.
See https://arrow.apache.org/docs/r/articles/install.html
---------------------------------------------------------

这意味着安装程序未能检索或构建与当前版本的 R 包兼容的 libarrow 版本。

请查看下方的“已知安装问题”以确认是否有适用条目;如果没有,请设置环境变量 ARROW_R_DEV=TRUE 以获取更详细的输出,并再次尝试安装。然后,请提交一个 issue 并附上完整的安装输出。

使用系统库

如果找到了系统库或其他已安装的 Arrow,但它与 R 包版本不匹配(例如,您的系统上有 libarrow 1.0.0,而正在安装 R 包 2.0.0),则 R 绑定很可能编译失败。由于 Apache Arrow 项目处于活跃开发中,libarrow 和 R 包的版本必须匹配。当 install.packages("arrow") 必须下载 libarrow 时,安装脚本会确保您获取与 R 包版本对应的 libarrow 版本。然而,如果您使用的是系统上已有的 libarrow 版本,则无法保证版本匹配。

要解决版本不匹配问题,您可以更新您的 libarrow 系统包以匹配 R 包版本,或者设置环境变量 ARROW_USE_PKG_CONFIG=FALSE 以告诉配置脚本不要查找 libarrow 的系统版本。(后者是 install_arrow() 的默认值。)系统 libarrow 版本适用于所有 CRAN 发行版,但对于每日构建或开发版本则不然,因此根据您安装的 R 包版本,系统 libarrow 版本可能不是一个选项。

另外,一旦您基于系统(共享)库拥有了可用的 R 包安装,如果您更新了系统 libarrow 安装,则需要重新安装 R 包以匹配其版本。同样,如果您使用的是 libarrow 系统库,在 arrow 包发布新版本后运行 update.packages() 可能会失败,除非您先更新 libarrow 系统包。

使用预构建的二进制文件

如果 R 包找到并下载了预构建的 libarrow 二进制文件,但随后无法加载 arrow 包(可能是“未定义的符号”错误),请提交一个 issue。这很可能是编译器不匹配,可以通过设置一些环境变量来指示 R 编译包以匹配 libarrow 来解决。

一种解决方法是将环境变量 LIBARROW_BINARY=FALSE 设置并重试安装:此值指示包从源代码构建 libarrow,而不是下载预构建的二进制文件。这应该保证编译器设置匹配。

如果没有为您的操作系统找到预构建的 libarrow 二进制文件,但您认为应该找到,请提交一个 issue 并分享控制台输出。您也可以设置环境变量 ARROW_R_DEV=TRUE 以获取额外的调试消息。

从源代码构建 libarrow

如果从源代码构建 libarrow 失败,请检查错误消息。(如果您没有看到错误消息,只有 ----- NOTE -----,请设置环境变量 ARROW_R_DEV=TRUE 以增加详细程度并重试安装。)安装脚本应该可以在任何地方工作,因此如果 libarrow 编译失败,请提交一个 issue,以便我们改进脚本。

贡献

我们一直在努力使安装过程尽可能轻松。如果您找到了改进此过程的方法,请提交一个 issue,以便我们记录它。同样,如果您发现您的 Linux 发行版或版本不受支持,我们欢迎您贡献(托管在 Docker Hub 上的)Docker 镜像,我们可以将其用于持续集成并希望提高覆盖范围。如果您贡献了 Docker 镜像,它应该尽可能精简,只包含 R 及其所需的依赖项。有关参考,请参见 R-hub 使用的镜像。

您可以使用 apache/arrow git 仓库中包含的 docker compose 设置来测试 arrow R 包的安装。例如,

R_ORG=rhub R_IMAGE=ubuntu-release R_TAG=latest docker compose build r
R_ORG=rhub R_IMAGE=ubuntu-release R_TAG=latest docker compose run r

rhub/ubuntu-release 镜像上安装 arrow R 包(包括 libarrow)。

进一步阅读

  • 要了解有关安装开发版本的信息,请参阅关于安装每日构建版本的文章。
  • 如果您要为 Arrow 项目做出贡献,请参阅 Arrow R 开发人员指南以获取帮助您设置开发环境的资源。
  • Arrow 开发人员可能还希望阅读关于安装过程中运行代码的更详细讨论,该讨论在 安装详情文章中有描述。