Apache Arrow C++ 文件系统 API 深度指南:从本地磁盘到 S3、HDFS、GCS 与 Azure 的统一访问层
【免费下载链接】arrowApache Arrow is the universal columnar format and multi-language toolbox for fast data interchange and in-memory analytics项目地址: https://gitcode.com/GitHub_Trending/arrow3/arrow
导读
本文以 Apache Arrow 官方 C++ API 文档中的 Filesystems 章节 为骨架,系统讲解arrow::fs命名空间下文件系统抽象的核心设计:统一的FileSystem接口、FileInfo与FileSelector数据模型、按 URI 一键创建后端实例的高层工厂函数、可扩展的工厂注册机制,以及本地文件系统、S3、HDFS、GCS、Azure 五大具体实现与它们的配置选项。读完本文,你将掌握如何用同一套代码读写本地磁盘与对象存储,理解各后端初始化/终结的生命周期约束,并能依据源码定位每个配置项的准确行为。
概述:Arrow 文件系统抽象的设计意图
Apache Arrow 是面向内存分析(in-memory analytics)的列式格式与多语言工具箱。在数据管道中,数据往往分散在本地磁盘、HDFS、对象存储(S3、GCS、Azure Blob)等多个位置,Arrow 的 C++ 文件系统模块正是为了解决"用一套统一 API 访问所有存储"而设计。
整个模块位于arrow::fs命名空间,核心实现在 cpp/src/arrow/filesystem/filesystem.h,所有头文件对外汇总在 cpp/src/arrow/filesystem/api.h。从源码结构看,模块由三层组成:
- 接口层:
FileSystem抽象基类 +FileInfo、FileSelector等数据类型; - 工厂层:
FileSystemFromUri系列高层工厂函数 +RegisterFileSystemFactory注册机制; - 实现层:
LocalFileSystem、S3FileSystem、HadoopFileSystem、GcsFileSystem、AzureFileSystem、SubTreeFileSystem等具体后端。
这套抽象带来的核心价值是:上层业务代码(如 Arrow Datasets、Parquet/CSV 读写器)只依赖FileSystem接口,即可透明切换底层存储,而路径语法、流式 IO 语义保持一致。
接口层:统一文件系统 API 的核心类型
FileType:目录项类型枚举
FileType定义在 cpp/src/arrow/filesystem/type_fwd.h,是文件系统模块的基础枚举,取值与语义如下:
| 枚举值 | 语义 |
|---|---|
NotFound | 目录项不存在 |
Unknown | 目录项存在但类型未知(如 Unix socket、字符设备,或 Windows 的NUL、CON等特殊设备) |
File | 普通文件 |
Directory | 目录 |
arrow::fs::ToString(FileType)与流运算符operator<<提供了枚举到字符串的转换,便于日志输出(实现见 filesystem.h)。
FileInfo:目录项元数据
FileInfo(filesystem.h)描述文件系统中的一个目录项,字段包括:
path():该目录项在文件系统中的完整路径;type():FileType类型;size():字节大小,只有普通文件保证有 size,缺失时值为kNoSize(-1);mtime():最后修改时间,类型为TimePoint(std::chrono::time_point<system_clock, nanoseconds>,即自 epoch 起的纳秒数),缺失时为kNoTime;base_name()/dir_name()/extension():由 path 派生的文件名、所在目录、扩展名(不含点);IsFile()/IsDirectory():便捷类型判断;Equals():比较 type、path、size、mtime 四个字段;FileInfo::ByPath:以 path 为键的小于比较与哈希函数对象,可直接用于 STL 排序与关联容器。
FileInfo继承自util::EqualityComparable,因此可直接使用==/!=比较。注意一个文件系统的查询约定:不存在的路径不返回错误状态,而是返回一个FileType::NotFound的FileInfo(见 filesystem.h 的注释),错误状态仅表示真正的异常情况(如底层 IO 错误)。
FileSelector:目录选择器
FileSelector(filesystem.h)描述"选择哪些文件"的规则,用于GetFileInfo批量列举:
| 字段 | 类型 | 默认值 | 语义 |
|---|---|---|---|
base_dir | std::string | 无 | 要列举的目录;若该路径存在但不是目录,应报错 |
allow_not_found | bool | false | base_dir不存在时的行为:false返回错误,true返回空选择结果 |
recursive | bool | false | 是否递归进入子目录 |
max_recursion | int32_t | INT32_MAX | 允许递归的最大子目录深度 |
注意:GetFileInfo(selector)的结果不包含 base_dir 本身,即使它存在;同时max_recursion是从base_dir之下开始计数的递归深度限制。
FileSystem:抽象基类
FileSystem(filesystem.h)是所有后端的抽象基类,其公开接口按功能可分成几组:
元信息与路径处理
type_name():返回后端类型名(如"local"、"s3"、"hdfs"、"subtree");NormalizePath():规范化路径,默认实现为空操作,子类可重写以处理不规则路径(如 Windows 本地路径);PathFromUri():校验 URI 与该文件系统兼容并返回 URI 指向的内部路径;注意它只校验 URI scheme 合法性,不会检测 region 不匹配、endpoint 覆盖冲突等深层不一致;MakeUri():由路径反向生成一个可通过FileSystemFromUri还原出等价文件系统的 URI;Equals():文件系统实例等价性比较;io_context():与该文件系统关联的io::IOContext(实验性)。
元数据操作
GetFileInfo(path):单路径查询;符号链接会被递归解引用;GetFileInfo(paths)批量查询;GetFileInfo(selector)按选择器查询;GetFileInfoAsync()与GetFileInfoGenerator()提供异步/流式变体(FileInfoGenerator是一个返回Future<FileInfoVector>的函数对象,且不可异步重入——必须等待上一次 Future 完成才能再次调用)。
目录与文件管理
CreateDir(path, recursive):创建目录,recursive 为 true 时连带创建父目录;目录已存在时也成功返回;DeleteDir(path):递归删除目录及其内容;DeleteDirContents(path, missing_dir_ok):递归删除目录内容但保留目录本身;传空路径(""或"/")被禁止,应使用实验性的DeleteRootDirContents();DeleteFile(path)、DeleteFiles(paths):删除单个/多个文件;Move(src, dest):移动/重命名;若目标已存在且是非空目录则报错,若目标与源同类型则被替换,否则行为由实现决定(未定义);CopyFile(src, dest):复制文件;目标存在且为目录时报错,否则覆盖。
流式 IO
OpenInputStream(path)/OpenInputStream(info):打开顺序读输入流;带FileInfo的重载会假设元数据有效并据此优化(例如省去查询文件大小或存在性);OpenInputFile(path)/OpenInputFile(info):打开随机访问输入文件(io::RandomAccessFile);OpenOutputStream(path, metadata):打开顺序写输出流,若目标已存在则截断;metadata参数(KeyValueMetadata)用于传递后端特定元数据;OpenAppendStream(path, metadata):打开追加写输出流,目标不存在时创建空文件;注意部分后端不支持高效的原地追加,此时返回NotImplemented,源码建议改用数据集层(dataset layer)的多文件写入策略。
上述方法几乎都提供了异步版本(OpenInputStreamAsync等),接口设计天然支持异步化。
EnsureFinalized:全局终结函数
arrow::fs::EnsureFinalized()(filesystem.h)确保所有已注册的文件系统实现被终结。单个终结器可能等待并发调用结束以避免竞态;调用之后,所有文件系统 API 都会以错误失败。调用方需要自行负责对该函数的同步。它通常与各后端的FinalizeS3等专属终结函数配合,在进程退出前调用。
高层工厂函数:一条 URI 创建任意文件系统
文档中的"High-level factory functions"(doxygengroup::filesystem-factories)对应 filesystem.h 中的一组工厂函数,核心是FileSystemFromUri系列:
| 函数 | 说明 |
|---|---|
FileSystemFromUri(uri, out_path) | 按 URI 创建文件系统 |
FileSystemFromUriAndOptions(uri, options, out_path) | 按 URI + 后端特定选项创建(选项为(name, value)对列表,类型取决于后端与选项名) |
FileSystemFromUri(uri, io_context, out_path) | 指定自定义IOContext的版本 |
FileSystemFromUriAndOptions(uri, options, io_context, out_path) | 同时指定选项与IOContext的版本 |
FileSystemFromUriOrPath(uri, out_path) | 除 URI 外,还把非 URI 的绝对路径当作本地文件系统路径处理 |
所有工厂函数的out_path参数都是可选的输出参数,用于接收 URI 中携带的、文件系统内部的路径部分。当前内置识别的 scheme包括:file、mock、hdfs、viewfs、s3、gs、gcs、abfs、abfss(见 filesystem.h 的注释)。其他 scheme 可通过RegisterFileSystemFactory注册支持。
从实现看,FileSystemFromUri的派发逻辑在 cpp/src/arrow/filesystem/filesystem.cc 的FileSystemFromUriReal中:先查询注册表FactoryForScheme(scheme),命中则交给注册的工厂;否则按内置 scheme 分发(abfs/abfss→ Azure、gs/gcs→ GCS、hdfs/viewfs→ HDFS、mock→ 内存模拟文件系统);完全未知的 scheme 返回Status::Invalid("Unrecognized filesystem type in URI")。重要:内置的 Azure/GCS/HDFS 分支受编译宏控制(ARROW_AZURE、ARROW_GCS、ARROW_HDFS),若 Arrow 编译时未启用对应后端,即使 scheme 合法也会返回NotImplemented错误,因此使用前应确认编译配置。
典型用法示例:
#include "arrow/filesystem/api.h" namespace fs = arrow::fs; // 按 URI 创建本地文件系统,并取出 URI 中的路径 std::string path; ARROW_ASSIGN_OR_RAISE(auto local_fs, fs::FileSystemFromUri("file:///data/parquet", &path)); // path == "/data/parquet" // 创建 S3 文件系统(需先 InitializeS3,见下文) ARROW_ASSIGN_OR_RAISE(auto s3_fs, fs::FileSystemFromUri("s3://my-bucket/path", &path)); // 非 URI 的绝对路径也会被当作本地路径 ARROW_ASSIGN_OR_RAISE(auto fs2, fs::FileSystemFromUriOrPath("/data/parquet"));工厂注册机制:为自定义 scheme 扩展文件系统
文档中的"Factory registration functions"(doxygengroup::filesystem-factory-registration)对应 filesystem.h,提供三种粒度的扩展手段:
RegisterFileSystemFactory(scheme, factory, finalizer):注册一个自定义 URI scheme 的工厂函数。若该 scheme 已有工厂,新工厂会被忽略并返回KeyError类错误。finalizer为进程退出前必须调用的终结函数,不需要时可传nullptr。
LoadFileSystemFactories(libpath):从共享库加载文件系统工厂。文件系统实现可以单独打包为动态库,只有显式加载时才注册。任何使用FileSystemRegistrar且需动态加载的库,都应通过本函数加载——静态链接到 libarrow 时可能产生重复/隔离的注册表,本函数会合并注册表。
FileSystemRegistrar与ARROW_REGISTER_FILESYSTEM宏:在命名空间作用域定义一个FileSystemRegistrar实例即可在加载时自动注册工厂——静态链接时在main()之前,动态加载时在dlopen()/LoadLibrary()返回之前完成注册。ARROW_REGISTER_FILESYSTEM(scheme, factory_function, finalizer)宏则封装了带__FILE__/__LINE__信息的注册(文件与行号还用于判断静态链接场景下重复注册的工厂是否等价,见 filesystem.h)。
源码中给出一个完整示例:注册"slowfile"scheme,通过 URI query 参数average_latency与seed构造一个注入延迟的SlowFileSystem(见 filesystem.h 的\code块)。这种机制让用户可以为零改造地为 Arrow 增加自定义文件系统。
具体实现一览
SubTreeFileSystem:子树视图包装器
SubTreeFileSystem(filesystem.h)是一个委托型实现:在固定 base path 前缀下委托给另一个FileSystem。典型场景是把本地文件系统的某个目录暴露为逻辑根。它的type_name()为"subtree",提供base_path()与base_fs()访问器,所有操作通过PrependBase/StripBase/FixInfo内部方法完成路径前缀的增删。
需要特别注意两个限制(源码注释明确说明,见 filesystem.h):
- 它基于抽象路径(正斜杠、单一根
/)工作,不保证支持 Windows 路径; - 它不做任何安全保证:符号链接可能"逃逸"子树访问底层文件系统的其他部分。
SlowFileSystem:延迟注入包装器
SlowFileSystem(filesystem.h)同样委托给底层文件系统,但在各操作点注入人为延迟(通过io::LatencyGenerator),type_name()为"slow"。构造函数支持直接传LatencyGenerator、传平均延迟、或传平均延迟 + 随机种子三种形式。它主要用于测试与基准场景,例如验证客户端在慢网络下的行为。
LocalFileSystem:本地文件系统
LocalFileSystem(cpp/src/arrow/filesystem/localfs.h)访问本机文件,type_name()为"local"。它只处理/分隔路径,Windows 反斜杠路径需由调用方自行转换;符号链接细节被抽象(除删除操作外一律跟随符号链接)。构造时可通过LocalFileSystemOptions(localfs.h)配置:
| 选项 | 默认值 | 说明 |
|---|---|---|
use_mmap | false | OpenInputStream/OpenInputFile是否返回 mmap 映射文件而非普通文件 |
directory_readahead | 16(kDefaultDirectoryReadahead) | 实验性:GetFileInfoGenerator并行处理的目录数上限 |
file_info_batch_size | 1000(kDefaultFileInfoBatchSize) | 实验性:每个FileInfoVector块聚合的条目数上限。由于每个条目需要一次stat系统调用,大目录整体列举很慢,达到该块大小即产出一次结果,可降低首条结果的延迟 |
LocalFileSystemOptions::Defaults()返回默认配置,FromUri(uri, out_path)支持从file://URI 解析。
S3FileSystem:AWS S3 与兼容对象存储
S3FileSystem(cpp/src/arrow/filesystem/s3fs.h)是功能最丰富的对象存储实现,type_name()为"s3",通过S3FileSystem::Make(options)创建,options()可回读构造时的选项,region()返回实际连接的 region。
S3Options(s3fs.h)的关键配置项:
smart_defaults(默认"standard"):选项值的智能默认设置;region:AWS region;未设置时由 AWS SDK 决定(SDK 1.8 之前硬编码us-east-1,之后通过环境变量、配置文件、EC2 元数据服务器等启发式确定);connect_timeout(默认-1,负值用 SDK 默认值约 1 秒)、request_timeout(Windows/macOS 的 socket 读超时,默认约 3 秒);endpoint_override:非空时用如"localhost:9000"的连接串覆盖 region——这是连接 MinIO 等 S3 兼容本地服务的关键选项;scheme(默认"https"):连接传输协议;role_arn/session_name/external_id/load_frequency(默认 900 秒):STS 角色扮演相关;proxy_options:S3ProxyOptions(scheme/host/port/username/password,支持FromUri解析);credentials_kind:S3CredentialsKind枚举(Anonymous/Default/Explicit/Role/WebIdentity);force_virtual_addressing(默认false):为 true 时总是启用 bucket 虚拟寻址;为 false 时仅在endpoint_override为空时启用——可用于只支持 virtual hosted 风格访问的非 AWS 后端;background_writes(默认true):OutputStream 写入是否在后台异步发出;allow_bucket_creation/allow_bucket_deletion(默认均false):是否允许创建/删除 bucket;check_directory_existence_before_creation(默认false):CreateDir是否先检查目录存在。默认的"直接创建、失败再捕获"策略对普通存储是优化,但对 GCS 这类对象存储可能触发对象变更操作限流,或在你没有父目录创建权限时失败,置 true 可规避;allow_delayed_open(默认false):允许打开方法在实际打开前返回,减少往返延迟、对小文件可用更高效的 S3 API,但失败(如打开不存在的 bucket)要等到真正 IO(最晚到关闭文件)时才报错;default_metadata:OpenOutputStream的默认KeyValueMetadata,显式传入非空 metadata 时被忽略;retry_strategy:自定义重试策略(S3RetryStrategy抽象类,提供ShouldRetry与CalculateDelayBeforeNextRetry,内置GetAwsDefaultRetryStrategy/GetAwsStandardRetryStrategy);sse_customer_key:SSE-C 服务端加密的 32 字节 AES-256 密钥(未编码);tls_ca_file_path/tls_ca_dir_path:TLS CA 证书(单 PEM 文件 / OpenSSL hashed 格式目录),为空时回退到FileSystemGlobalOptions再回退到 TLS 库默认;部分系统(Windows、macOS)可能忽略;tls_verify_certificates(默认true):是否校验 S3 端点 TLS 证书(仅 https 生效)。
凭据配置:S3Options提供多种静态工厂与配置方法:
// 默认凭据链(推荐:读取标准 AWS 环境变量/配置文件) auto opts = fs::S3Options::Defaults(); // 匿名访问(只能访问公开 bucket) auto anon = fs::S3Options::Anonymous(); // 显式 access key / secret key(可选 session token) auto ak = fs::S3Options::FromAccessKey("ACCESS_KEY", "SECRET_KEY", "SESSION_TOKEN"); // 角色扮演(STS) auto role = fs::S3Options::FromAssumeRole("arn:aws:iam::...:role/xxx", "session", "ext-id"); // Web Identity 角色扮演 auto web = fs::S3Options::FromAssumeRoleWithWebIdentity();对应的方法版ConfigureDefaultCredentials()、ConfigureAnonymousCredentials()、ConfigureAccessKey()、ConfigureAssumeRoleCredentials()、ConfigureAssumeRoleWithWebIdentityCredentials()可在默认构造后调用。另外S3Options::FromUri(uri)可从s3://URI 解析选项(含 query 参数),FromUriAndOptions(uri, options)则支持额外的后端选项对,识别键包括access_key、secret_key、session_token、retry_strategy、default_metadata;URI 与选项列表同时出现同一选项、未知键、非法值都会返回Status::Invalid。
S3 全局初始化与终结(生命周期关键):使用S3FileSystem之前必须调用InitializeS3(const S3GlobalOptions&),之后在应用结束前必须调用FinalizeS3(),否则进程退出时可能段错误(见 s3fs.h)。S3GlobalOptions字段:
| 字段 | 默认值 | 说明 |
|---|---|---|
log_level | 默认从环境变量ARROW_S3_LOG_LEVEL读取 | S3 日志级别(S3LogLevel:Off/Fatal/Error/Warn/Info/Debug/Trace) |
num_event_loop_threads | 1 | AWS IO 事件循环线程数(连接数预期数百以内时 1 即可) |
install_sigpipe_handler | false | 是否安装进程级 SIGPIPE 处理器(AWS SDK 可能发出 SIGPIPE 导致进程中止;Windows 上无效) |
同时提供EnsureS3Initialized()/EnsureS3Finalized()(仅当未初始化/未终结时执行)、IsS3Initialized()/IsS3Finalized()查询函数,以及ResolveS3BucketRegion(bucket)解析 bucket 所在 region。注意InitializeS3/FinalizeS3的调用需要应用自行串行化。
性能注意:OpenInputStream的读取是同步且无缓冲的,源码建议包装BufferedInputStream或使用自定义预读策略避免空闲等待;OpenOutputStream的写入是缓冲的,按background_writes决定是否异步,官方建议启用background_writes。带FileInfo的打开重载可避免一次 HEAD 请求。
HadoopFileSystem:HDFS
HadoopFileSystem(cpp/src/arrow/filesystem/hdfs.h)是arrow/io/hdfs的包装,type_name()为"hdfs",用 FileSystem API 统一访问 HDFS,通过HadoopFileSystem::Make(options)创建。HdfsOptions(hdfs.h)包含:
connection_config:io::HdfsConnectionConfig(host、port、driver 等);buffer_size(默认 0)、replication(默认 3)、default_block_size(默认 0):写接口相关参数。
并提供链式配置方法:ConfigureEndPoint(host, port)、ConfigureReplication(n)、ConfigureUser(name)、ConfigureBufferSize(n)、ConfigureBlockSize(n)、ConfigureKerberosTicketCachePath(path)、ConfigureExtraConf(key, val)。HdfsOptions::FromUri(uri)支持hdfs://与viewfs://URI 解析(见 filesystem.cc)。
GcsFileSystem:Google Cloud Storage
GcsFileSystem(cpp/src/arrow/filesystem/gcsfs.h)访问 GCS,通过GcsFileSystem::Make(options)创建。源码注释(gcsfs.h)详细说明了 GCS 的语义:bucket 是全局命名空间(重名不允许)、对象不可变(创建后不能追加或修改数据)、GCS 没有真正的文件夹/目录,该类通过"根目录即 bucket"、目录 marker 对象(带元数据属性标注)、前缀列举模拟目录、公共前缀汇总模拟非递归列举等方式模拟目录层级。
GcsOptions(gcsfs.h)的配置项:
credentials:GcsCredentials凭据容器(支持匿名、access token + 过期时间、服务账号模拟、JSON 服务账号密钥);endpoint_override、scheme:端点覆盖与传输协议(对接模拟器/私有部署);default_bucket_location:创建 bucket 时使用的 location;retry_limit_seconds(std::optional<double>):底层错误重试的总时间上限,默认策略重试最多 15 分钟;default_metadata:OpenOutputStream默认元数据;project_id:仅创建 bucket 时需要(多数 IO 操作不需要),未设置时使用GOOGLE_CLOUD_PROJECT环境变量。
凭据静态工厂:GcsOptions::Defaults()(应用默认凭据,可用GOOGLE_APPLICATION_CREDENTIALS环境变量覆盖)、Anonymous()、FromAccessToken(token, expiration)、FromImpersonatedServiceAccount(base_credentials, target)、FromServiceAccountCredentials(json_object)(JSON 服务账号密钥,格式见 AIP/4112,应视作密码级机密)。另外注意GcsFileSystem::DeleteRootDirContents()未实现(过于危险,见 gcsfs.h)。
AzureFileSystem:Azure Blob / Data Lake
AzureFileSystem(cpp/src/arrow/filesystem/azurefs.h)同时对接 Azure Blob Storage 与 Azure Data Lake Storage Gen 2,对应 URI scheme 为abfs(http)与abfss(https)。AzureOptions的关键配置:
account_name:存储账号名,所有服务 URL 据此构造;blob_storage_authority(默认".blob.core.windows.net")与dfs_storage_authority(默认".dfs.core.windows.net"):服务主机名,相对域名(以.开头)时在主机名前拼接账号名,FQDN 时原样使用并把账号名放入 URL 路径;blob_storage_scheme/dfs_storage_scheme(默认均"https"):连接传输协议;default_metadata、background_writes(默认true):同 S3 的语义。
默认认证走 Azure SDK 的凭据链,可读取AZURE_TENANT_ID、AZURE_CLIENT_ID、AZURE_CLIENT_SECRET、AZURE_AUTHORITY_HOST、AZURE_CLIENT_CERTIFICATE_PATH、AZURE_FEDERATED_TOKEN_FILE等环境变量;内部CredentialKind枚举还支持匿名、Storage Shared Key、SAS Token、Client Secret、托管身份、CLI、Workload Identity、环境等多种凭据类型。AzureOptions::FromUri支持的 URI 格式包括:
abfs[s]://<account>.blob.core.windows.net[/<container>[/<path>]] abfs[s]://<container>@<account>.dfs.core.windows.net[/path] abfs[s]://[<account@>]<host[.domain]>[<:port>][/<container>[/path]] abfs[s]://[<account@>]<container>[/path](见 azurefs.h)。
进阶工具:跨文件系统复制与全局 TLS 配置
除文档列出的核心 API 外,filesystem.h 还提供两个实用能力:
CopyFiles(filesystem.h):支持跨文件系统复制文件。同源同目的时走FileSystem::CopyFile;否则在两个文件系统上分别打开流并按块拷贝(默认chunk_size = 1024 * 1024字节,use_threads = true)。第二个重载按FileSelector选择源文件,并在目标 base 目录下按需创建目录。
FileSystemGlobalOptions与Initialize(filesystem.h):实验性的全局初始化例程,用于 manylinux 等需要在运行时配置 TLS CA 证书路径的环境。FileSystemGlobalOptions含tls_ca_file_path(单个 PEM 文件)与tls_ca_dir_path(OpenSSL hashed 格式目录),各后端选项(如S3Options::tls_ca_file_path)为空时会回退到这些全局配置。
总结与最佳实践
- 接口优先:业务代码只依赖
arrow::fs::FileSystem抽象,通过FileSystemFromUri按 URI 创建实例,即可无缝切换本地磁盘与对象存储。 - 生命周期纪律:S3 后端必须先
InitializeS3后使用、结束前FinalizeS3;进程退出前可调用EnsureFinalized统一终结所有已注册实现。 - 编译宏前提:Azure/GCS/HDFS 后端受
ARROW_AZURE/ARROW_GCS/ARROW_HDFS编译宏控制,未启用时对应 scheme 会返回NotImplemented,使用时需确认构建配置。 - 对象存储语义差异:S3/GCS/Azure 没有真正的目录,
CreateDir、列举等操作是模拟行为(GCS 根目录创建即建 bucket 且较慢,DeleteRootDirContents在 GCS 未实现);追加写(OpenAppendStream)在部分后端返回NotImplemented,应改用数据集层的多文件写入。 - 性能调优点:S3 输入流同步无缓冲(可包
BufferedInputStream),输出流建议启用background_writes;本地文件系统大批量列举可通过directory_readahead与file_info_batch_size控制并行度与首结果延迟。
如需进一步阅读源码,建议从 cpp/src/arrow/filesystem/filesystem.h 与 cpp/src/arrow/filesystem/filesystem.cc 开始,再按后端进入localfs.cc、s3fs.cc、hdfs.cc、gcsfs.cc、azurefs.cc;各实现的单元测试位于 cpp/src/arrow/filesystem/filesystem_test.cc 与各*_test.cc文件,是理解每个 API 边界行为的绝佳样例。
【免费下载链接】arrowApache Arrow is the universal columnar format and multi-language toolbox for fast data interchange and in-memory analytics项目地址: https://gitcode.com/GitHub_Trending/arrow3/arrow
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考