ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Alluxio Go 客户端开发指南:通过 REST API 代理访问 Alluxio 文件系统

Alluxio Go 客户端开发指南:通过 REST API 代理访问 Alluxio 文件系统 存储分布式文件系统缓存大数据【免费下载链接】alluxioAlluxio, data orchestration for analytics and machine learning in the cloud项目地址https://gitcode.com/gh_mirrors/al/alluxio点击查看免费下载本指南基于 Alluxio 官方文档docs/cn/api/Clients-Go.md系统讲解如何在 Go 语言项目中通过 Alluxio 代理Proxy提供的 REST API 访问 Alluxio 文件系统包括代理的启动与停止、Go 客户端库的安装、完整的文件写入/读取示例以及 REST API 在仓库源码中的底层实现。读完本文你将能够独立编写一个可运行的 Go 程序完成对 Alluxio 中文件的创建、写入、读取、删除与存在性检查等操作。一、Go 客户端概览面向非 JVM 生态的 Alluxio 接入方式Alluxio 是一个面向分析与机器学习的云原生数据编排系统其核心访问方式通常是 Java 原生文件系统客户端。但对于 Go 等非 JVM 语言生态Alluxio 官方提供了独立的 Go 语言客户端仓库中的相关文档见 docs/cn/api/Clients-Go.md其特点是基于 REST API 通信Go 客户端本身不直接与 Alluxio master/worker 进行 RPC而是通过 Alluxio REST API 代理与 Alluxio 交互API 形态贴近 Java 客户端它提供与原生文件系统 Java 客户端相似的 API 设计覆盖文件上传、下载、存在性检查、状态列举等常见操作降低熟悉 Alluxio Java API 的开发者迁移到 Go 的成本接口信息可查客户端所有可用接口的详细信息包括如何下载、上传 Alluxio 中的文件检查文件是否存在列出文件状态等可通过客户端项目的 godoc 文档查询。这一架构的意义在于Go 程序只需依赖一个 HTTP 代理即可获得与 Java 客户端近乎一致的文件系统语义而无需在 Go 侧维护复杂的 RPC 协议栈。二、工作原理Go 客户端 → Alluxio 代理 REST API → Alluxio 文件系统Go 客户端与 Alluxio 的交互链路可以概括为一条清晰的 HTTP 调用链Go 程序 (alluxio-go Client) │ HTTP / REST (默认端口 39999) ▼ Alluxio 代理 (Proxy 进程独立 server) │ 调用 Alluxio FileSystem Java API ▼ Alluxio 集群master / worker从仓库源码可以确认这条链路的存在。代理进程的 REST 服务由三个 Handler 组成均位于 core/server/proxy/src/main/java/alluxio/proxy 目录下PathsRestServiceHandler.java负责元数据类操作路径前缀为paths内部持有alluxio.client.file.FileSystem对象Api(value /paths, description RESTful gateway for Alluxio Filesystem Client (Metadata))提供create-directory、create-file、delete、exists、free、get-status、list-status、mount、open-file、rename、set-attribute、unmount、download-file等端点StreamsRestServiceHandler.java负责数据流操作路径前缀为streams通过StreamCache管理已创建的读写流Api(value /streams, description RESTful gateway for Alluxio Filesystem Client (Data))提供close、read、write三个端点AlluxioProxyRestServiceHandler.java提供proxy/info端点返回代理进程的启动时间、运行时长与版本信息。其中最关键的设计是REST API 与 Java API 在流Stream表示上的差异。Java API 可以在内存中直接持有流对象而 REST API 将流的创建与流的访问分离docs/cn/api/Clients-Rest.mdcreate-file/open-file返回一个整数形式的流 ID该 ID 被存入代理进程内的StreamCache后续的读/写操作通过streams/{id}/read、streams/{id}/write、streams/{id}/close端点携带流 ID 完成。在 StreamsRestServiceHandler.java 中可以看到close端点的实现当流被从StreamCache失效时缓存的移除监听器会自动关闭底层流若 ID 无效则抛出IllegalArgumentException(stream does not exist)。Go 客户端正是按这套语义组织读写流程的。三、前置条件启动 Alluxio 代理Go 客户端无法绕过代理直接访问 Alluxio因此运行 Go 程序前必须先确保 Alluxio 代理处于运行状态。3.1 启动与停止命令代理是一个独立运行的 server通过 Alluxio 的启停脚本管理脚本位于仓库 bin/alluxio-start.sh 与 bin/alluxio-stop.sh# 启动代理 ${ALLUXIO_HOME}/bin/alluxio-start.sh proxy # 停止代理 ${ALLUXIO_HOME}/bin/alluxio-stop.sh proxy其中${ALLUXIO_HOME}是 Alluxio 的安装目录。从 bin/alluxio-start.sh 的源码可以看到start_proxy()会通过launch-process proxy启动代理进程并将日志写入${ALLUXIO_LOGS_DIR}/proxy.out同时它还支持alluxio-start.sh -a proxy的形式在所有节点masters/workers上批量启动代理。3.2 默认端口 39999 与配置项默认情况下REST API 监听39999 端口。这一默认值在仓库源码中有明确定义core/common/src/main/java/alluxio/conf/PropertyKey.java 中alluxio.proxy.web.portPROXY_WEB_PORT的默认值为39999描述为 The port Alluxio proxys web UI runs on.。如需修改端口可通过配置属性alluxio.proxy.web.port调整代理主机名由alluxio.proxy.web.hostname配置。3.3 性能注意事项使用 HTTP 代理会影响性能——尤其是在使用代理时请求会增加一个额外的跳hop计数数据路径比直接访问 worker 更长。官方建议docs/cn/api/Clients-Go.md 与 docs/cn/api/Clients-Rest.md 均明确说明推荐让代理服务和一个 Alluxio worker 运行在同一个计算节点上以降低跨节点跳转带来的开销。因此在规划 Go 客户端部署时应将代理进程与 worker 共置co-locate而不是集中部署在独立机器上。四、安装 Go 语言客户端库Go 客户端库的安装非常简单一条命令即可完成拉取$ go get -d github.com/Alluxio/alluxio-go-d参数表示仅下载依赖包而不立即安装为可执行程序该库是一个库而非可执行文件。拉取完成后你可以在 Go 代码中通过以下 import 路径使用它import ( alluxio github.com/alluxio/alluxio-go github.com/alluxio/alluxio-go/option )其中option包提供了各操作的选项结构体例如option.CreateFile{}、option.OpenFile{}、option.Exists{}、option.Delete{}对应 Java 客户端中按操作传入的 options 参数设计参见 原生文件系统 Java 客户端 中对 options 的说明。五、示例使用程序完整的文件写入与读取下面是一个完整的 Go 示例程序源自 docs/cn/api/Clients-Go.md它演示了 Go 客户端访问 Alluxio 的完整流程检查路径是否存在 → 清理旧文件 → 创建并写入文件 → 重新打开并读取内容。注意如果本地没有 Alluxio 代理在运行请将下面代码中的localhost替换为代理实际所在的主机名。package main import ( fmt io/ioutil log strings time alluxio github.com/alluxio/alluxio-go github.com/alluxio/alluxio-go/option ) // write 在指定路径创建文件并将字符串 s 写入其中 func write(fs *alluxio.Client, path, s string) error { id, err : fs.CreateFile(path, option.CreateFile{}) if err ! nil { return err } defer fs.Close(id) _, err fs.Write(id, strings.NewReader(s)) return err } // read 打开指定路径的文件读取全部内容并返回 func read(fs *alluxio.Client, path string) (string, error) { id, err : fs.OpenFile(path, option.OpenFile{}) if err ! nil { return , err } defer fs.Close(id) r, err : fs.Read(id) if err ! nil { return , err } defer r.Close() content, err : ioutil.ReadAll(r) if err ! nil { return , err } return string(content), err } func main() { fs : alluxio.NewClient(localhost, 39999, 10*time.Second) path : /test_path exists, err : fs.Exists(path, option.Exists{}) if err ! nil { log.Fatal(err) } if exists { if err : fs.Delete(path, option.Delete{}); err ! nil { log.Fatal(err) } } if err : write(fs, path, Success); err ! nil { log.Fatal(err) } content, err : read(fs, path) if err ! nil { log.Fatal(err) } fmt.Printf(Result: %v\n, content) }5.1 关键调用逐段解析1创建客户端连接fs : alluxio.NewClient(localhost, 39999, 10*time.Second)NewClient接收三个参数代理主机名、代理 REST 端口默认 39999、连接超时时间此处为 10 秒。这正是 第三节 中代理进程的监听地址。2检查文件是否存在exists, err : fs.Exists(path, option.Exists{})对应代理 REST 端点paths/{path}/exists。从 PathsRestServiceHandler.java 的实现看该端点最终调用FileSystem#exists(new AlluxioURI(path))并返回布尔值。3删除旧文件if err : fs.Delete(path, option.Delete{}); err ! nil { log.Fatal(err) }对应paths/{path}/delete端点最终调用FileSystem#delete源码见 PathsRestServiceHandler.java。示例中先删除再创建是为了保证在路径已存在时程序可重复运行。4创建文件并写入write函数演示了创建流 → 写数据 → 关闭流的三步流程id, err : fs.CreateFile(path, option.CreateFile{}) // 创建文件返回流 ID defer fs.Close(id) // 关闭流 _, err fs.Write(id, strings.NewReader(s)) // 向流写入数据这与代理端的设计一一对应create-file端点创建FileOutStream并返回流 IDmStreamCache.put(os)见 PathsRestServiceHandler.javastreams/{id}/write端点通过StreamCache取回输出流并ByteStreams.copy(is, os)完成写入见 StreamsRestServiceHandler.javastreams/{id}/close端点使流从缓存失效并自动关闭见 StreamsRestServiceHandler.java。5打开文件并读取read函数演示打开流 → 读数据 → 关闭流的对应流程id, err : fs.OpenFile(path, option.OpenFile{}) // 打开文件返回流 ID r, err : fs.Read(id) // 读取流内容 content, err : ioutil.ReadAll(r) // 将流内容全部读出open-file端点创建FileInStream并缓存返回流 ID见 PathsRestServiceHandler.javastreams/{id}/read端点返回与该 ID 关联的输入流响应以APPLICATION_OCTET_STREAM媒体类型返回见 StreamsRestServiceHandler.java。5.2 预期运行结果若一切正常程序输出Result: Success该输出证明/test_path文件在 Alluxio 中完成了一次完整的创建 → 写入 → 读取生命周期且读回的内容与写入的字符串一致。六、深入理解代理 REST API 的端点全景为了更充分地在 Go 或其他语言中使用代理下表整理了 PathsRestServiceHandler.java 与 StreamsRestServiceHandler.java 中定义的 REST 端点路径前缀均为paths/{path}或streams/{id}端点HTTP 方法说明对应 Java APIpaths/{path}/create-directoryPOST创建目录FileSystem#createDirectorypaths/{path}/create-filePOST创建文件返回流 ID供 streams API 使用FileSystem#createFilepaths/{path}/deletePOST删除路径FileSystem#deletepaths/{path}/download-fileGET下载文件内容APPLICATION_OCTET_STREAMFileSystem#openFilepaths/{path}/existsPOST检查路径是否存在FileSystem#existspaths/{path}/freePOST释放路径从 Alluxio 空间释放FileSystem#freepaths/{path}/get-statusPOST获取路径状态FileSystem#getStatuspaths/{path}/list-statusPOST列出子路径状态列表FileSystem#listStatuspaths/{path}/mountPOST将 UFS 源挂载到 Alluxio 路径需src查询参数FileSystem#mountpaths/{path}/open-filePOST打开文件用于读取返回流 IDFileSystem#openFilepaths/{path}/renamePOST重命名路径需dst查询参数FileSystem#renamepaths/{path}/set-attributePOST更新路径属性FileSystem#setAttributepaths/{path}/unmountPOST卸载挂载点FileSystem#unmountstreams/{id}/closePOST关闭流StreamCache#invalidatestreams/{id}/readPOST读取流内容StreamCache#getInStreamstreams/{id}/writePOST写入流请求体为八位字节流StreamCache#getOutStream从源码还可以确认两个实现细节错误语义对不存在的流 ID 调用read/write/close代理会返回IllegalArgumentException(stream does not exist)Go 客户端会将其包装为对应错误返回可选 options大部分路径操作端点都接受对应的 gRPC options 请求体如CreateFilePOptions、OpenFilePOptions当 options 为空时代理会以默认参数调用 FileSystem 方法——这与 Java 客户端为所有操作指定额外 options 域的设计一致参见 原生文件系统 Java 客户端。代理本身的信息启动时间、运行时长、版本号可通过GET proxy/info端点获取实现在 AlluxioProxyRestServiceHandler.java。七、相关文档与延伸阅读围绕 Go 客户端与代理 REST API仓库中还有以下关联文档与源码可供深入阅读REST API 文档中文讲解 REST API 与 Java API 在流表示上的差异以及代理部署的注意事项原生文件系统 Java 客户端中文Go 客户端 API 形态与之对应可作为理解 Go 客户端语义的参考代理 REST 服务源码PathsRestServiceHandler、StreamsRestServiceHandler、AlluxioProxyRestServiceHandler三个 Handler 的完整实现代理端口配置源码alluxio.proxy.web.port默认值 39999 的定义代理启停脚本start_proxy()的实现与代理日志位置。八、总结Go 客户端通过 Alluxio 代理的 REST API 访问 Alluxio适合非 JVM 语言的接入场景API 形态与 Java 原生文件系统客户端 相似运行前需先启动代理${ALLUXIO_HOME}/bin/alluxio-start.sh proxy默认端口 39999可通过alluxio.proxy.web.port配置调整安装依赖只需go get -d github.com/Alluxio/alluxio-go文件读写遵循创建/打开流 → 通过流 ID 读写 → 关闭流的模型与代理端paths/streams两类 REST 端点严格对应出于性能考虑应尽量让代理与 Alluxio worker 同节点部署以减少 HTTP 代理带来的额外跳数。赞分享存储分布式文件系统缓存大数据【免费下载链接】alluxioAlluxio, data orchestration for analytics and machine learning in the cloud项目地址https://gitcode.com/gh_mirrors/al/alluxio点击查看免费下载相关推荐Alluxio Python客户端使用指南Alluxio Python客户端使用指南 概述 Alluxio作为一个开源的虚拟分布式文件系统提供了多种语言的客户端接口。本文将重点介绍Alluxio Py存储分布式文件系统缓存大数据Headlamp 前端 Kubernetes API 类型解析NetworkPolicyIngressRule 接口实战指南Headlamp 前端 Kubernetes API 类型解析NetworkPolicyIngressRule 接口实战指南 导读 NetworkPolicy存储分布式文件系统缓存大数据Alluxio POSIX API详解通过FUSE实现分布式文件系统本地挂载Alluxio POSIX API详解通过FUSE实现分布式文件系统本地挂载 什么是Alluxio POSIX API Alluxio POSIX API是A存储分布式文件系统缓存大数据上一篇Flutter Engine终极指南深入理解跨平台渲染核心技术下一篇GitHub_Trending/do/docker-firefox完全指南3分钟搭建跨平台浏览器环境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表