
存储分布式文件系统缓存大数据【免费下载链接】alluxioAlluxio, data orchestration for analytics and machine learning in the cloud项目地址https://gitcode.com/gh_mirrors/al/alluxio点击查看免费下载本文围绕 docs/cn/api/Clients-Hadoop.md 展开系统讲解 Alluxio 提供的兼容 Hadoop 的 Java 客户端Hadoop-Compatible Java Client它包装 Alluxio 原生文件系统客户端对外暴露 Hadoop 标准的FileSystem接口使基于 Hadoop API 编写的程序可以零改造地读写 Alluxio 中的数据。读完本文你将掌握其工作原理、Maven 依赖引入方式、Hadoop 配置绑定方法、完整可运行的 Java 示例以及它在 MapReduce/Spark 等生态中的接入要点。背景Alluxio 的一次性写文件模型与两类文件系统 APIAlluxio 通过统一的文件系统接口提供数据访问能力其文件采用一次性写write-once语义文件只有在完整写入完成后才变为不可变状态且在写完之前不允许被读取。这一模型与许多分布式文件系统包括 HDFS的使用习惯一致也为数据缓存与一致性管理提供了基础。围绕这一模型Alluxio 向 Java 用户提供两种文件系统 APIAlluxio 文件系统 API原生 API功能完整支持诸如 TTL、pin、位置策略等 Alluxio 特有能力详细介绍见 docs/cn/api/FS-API.md兼容 Hadoop 的 API在原生 API 之上封装出 Hadoop 标准的FileSystem接口牺牲部分 Alluxio 特有功能换取已有 Hadoop 代码无需修改即可运行的便利。两种 API 访问的是同一个 Alluxio 文件系统区别仅在于调用方式与能力边界Alluxio API 提供额外的功能性而兼容 Hadoop 的 API 让用户直接复用 Hadoop 原生 API 的编程习惯与既有代码。核心实现alluxio.hadoop.FileSystem 如何包装原生客户端兼容 Hadoop 的客户端本质上是一个适配层。仓库中该模块位于 core/client/hdfs/src/main/java/alluxio/hadoop由以下几个关键类组成类职责alluxio.hadoop.FileSystem实现 Hadooporg.apache.hadoop.fs.FileSystem接口是用户直接使用的主要入口alluxio.hadoop.AbstractFileSystem抽象基类真正完成 Hadoop 操作到 Alluxio 操作的委托转换alluxio.hadoop.AlluxioFileSystem实现 HadoopAbstractFileSystemHadoop 2.x 体系委托给上面的FileSystemalluxio.hadoop.HadoopUtils/HadoopConfigurationUtilsHadoop 配置与 Alluxio 配置之间的互转工具其中AbstractFileSystem.java 的类注释明确说明该类really just delegates toalluxio.client.file.FileSystemfor most operations即所有 Hadoop 文件操作最终都被转换为 Alluxio 原生客户端的文件系统操作。例如open、create、mkdirs、listStatus等 Hadoop 方法都会先通过getAlluxioPath(Path)将 HadoopPath转换成AlluxioURI再调用底层mFileSystem的对应方法。FileSystem.java 的类注释还提示了一个重要事实该兼容 API 的性能可能不如 Alluxio 原生 API 高效因为每个调用都多了一层转换开销。因此文档与源码都建议追求极致性能时优先考虑原生 API追求兼容性与迁移便利时使用本客户端。URI 解析单机与高可用模式的支持从 FileSystem.java 的getConfigurationFromUri实现可以看出客户端会根据alluxio://URI 的 authority 形态自动推导出对应的 Alluxio 配置单 Master 模式如alluxio://localhost:19998解析出alluxio.master.hostname与alluxio.master.rpc.port多 MasterRPC 地址列表模式如alluxio://host1:19998,host2:19998解析出alluxio.master.rpc.addressesZooKeeper 模式如alluxio://zkHost1:2181,zkHost2:2181解析出alluxio.zookeeper.enabledtrue与alluxio.zookeeper.address逻辑名称logical name模式支持嵌入日志embedded journal与 ZooKeeper 两种逻辑名需要配合 Hadoop 配置中的alluxio.master.nameservices等模板属性使用。可以推断这套 authority 解析机制正是客户端无需额外配置即可按 URI 直达对应 Master/HA 集群的实现基础URI 本身携带的地址信息优先级最高会覆盖配置文件中的默认值。引入依赖Maven 坐标与三种可选 artifact要在 Java 应用中使用兼容 Hadoop 的客户端需要通过 Maven 引入依赖。官方推荐使用自包含shaded客户端在pom.xml中添加dependency groupIdorg.alluxio/groupId artifactIdalluxio-shaded-client/artifactId version${alluxio.version}/version /dependency该 artifact 以 shaded重定位形式打包了全部传递依赖能有效避免与其他 Hadoop 组件的依赖冲突是通用场景下的推荐选择详见 docs/en/api/Java-API.md 中的依赖说明。如果希望依赖更轻量也可以按需选择alluxio-core-client-fs仅提供 Alluxio 原生文件系统接口alluxio-core-client-hdfs仅提供兼容 Hadoop 的文件系统接口即本主题的核心 artifact对应 core/client/hdfs/pom.xml。这两个 artifact 不打包传递依赖体积更小且都包含在alluxio-shaded-client之中。绑定 FileSystem 实现让 Hadoop 认识 alluxio:// 协议要让 Hadoop 框架以及基于它的计算引擎识别alluxio://协议需要将协议 scheme 绑定到 Alluxio 的实现类。绑定方式有三种可任选其一或组合使用。方式一在 Java 代码中动态设置在创建 HadoopConfiguration后显式声明两个属性对应英文文档与仓库示例中的标准做法org.apache.hadoop.conf.Configuration conf new org.apache.hadoop.conf.Configuration(); conf.set(fs.alluxio.impl, alluxio.hadoop.FileSystem); conf.set(fs.AbstractFileSystem.alluxio.impl, alluxio.hadoop.AlluxioFileSystem);fs.alluxio.impl将 schemealluxio绑定到alluxio.hadoop.FileSystem这是 Hadoop 1.x/2.x 老式FileSystem机制的注册点fs.AbstractFileSystem.alluxio.impl将 scheme 绑定到alluxio.hadoop.AlluxioFileSystem供 Hadoop 2.x 的AbstractFileSystemViewFs 等新式机制使用。从 AlluxioFileSystem.java 的注释可见该类继承 Hadoop 的DelegateToFileSystem并委托给alluxio.hadoop.FileSystem是 Hadoop 2.x 下必要的一环。方式二写入 Hadoop 的 core-site.xml在 Hadoop 安装目录的core-site.xml中增加property namefs.alluxio.impl/name valuealluxio.hadoop.FileSystem/value descriptionThe Alluxio FileSystem/description /property这样所有读取该配置的 Hadoop 客户端都能识别alluxio://URI。docs/en/compute/Hadoop-MapReduce.md 指出该步骤在 Hadoop 1.x 下是必选项Hadoop 2.x 及以上通常可以省略新版 Hadoop 会通过 ServiceLoader 自动发现实现类。方式三命令行 / 环境变量通过-Dfs.alluxio.implalluxio.hadoop.FileSystem形式的 JVM 参数注入或在使用hadoop jar时通过-libjars附带 Alluxio 客户端 jar借助 Hadoop DistributedCache 分发到所有节点。此外无论哪种方式都必须确保Alluxio 客户端 jar 位于应用的 classpath 上。以 MapReduce 为例可将客户端 jar 加入HADOOP_CLASSPATH$ export HADOOP_CLASSPATHALLUXIO_CLIENT_JAR_PATH:${HADOOP_CLASSPATH}完整示例用 Hadoop API 读写 Alluxio仓库中的 AlluxioHDFS.java 提供了一个开箱即用的完整示例演示通过兼容 Hadoop 的 API 完成一次写入与读取final int bufSize alluxio.Constants.KB * 4; System.out.println(Starting write); Configuration conf new Configuration(); conf.set(fs.alluxio.impl, alluxio.hadoop.FileSystem); conf.set(fs.AbstractFileSystem.alluxio.impl, alluxio.hadoop.AlluxioFileSystem); conf.set(fs.defaultFS, alluxio://localhost:19998); FileSystem fs FileSystem.get(conf); String filename /AlluxioHDFS.txt; FSDataOutputStream out fs.create(new Path(filename)); byte[] buffout new byte[bufSize]; for (int i 0; i bufSize; i) { buffout[i] (byte) (a i % 26); } out.write(buffout); out.close(); FSDataInputStream in fs.open(new Path(filename)); byte[] buffin new byte[bufSize]; in.read(buffin); in.close(); System.out.println(Got: (new String(buffin))); System.out.println(End write);这段代码与使用 HDFS 的写法完全一致获取FileSystem实例、create创建文件、open打开文件。区别仅在于 URI 的 scheme 是alluxio://以及预先绑定了实现类。示例中还把fs.defaultFS设为alluxio://localhost:19998这样所有未显式指定 scheme 的Path都会默认解析到 Alluxio默认端口 19998 对应 Alluxio Master 的 RPC 端口。读取 ORC 等 Hadoop 生态格式由于兼容客户端暴露的是标准 HadoopFileSystem任何构建在 Hadoop 文件系统之上的格式与引擎都可以直接使用。英文文档 docs/en/api/Java-API.md 中给出了通过 ORC 库直接读取 Alluxio 上文件的示例org.apache.hadoop.conf.Configuration conf new org.apache.hadoop.conf.Configuration(); conf.set(fs.alluxio.impl, alluxio.hadoop.FileSystem); conf.set(fs.AbstractFileSystem.alluxio.impl, alluxio.hadoop.AlluxioFileSystem); org.apache.orc.OrcFile.ReaderOptions options new org.apache.orc.OrcFile.ReaderOptions(conf); org.apache.orc.Reader orc org.apache.orc.OrcFile.createReader( new Path(alluxio://localhost:19998/path/file.orc), options);同理Parquet、SequenceFile、Avro 等格式以及 Hive、Presto、Spark 等引擎都可以通过同一套机制透明地访问 Alluxio 数据。与计算生态的集成从 MapReduce 到 Spark/Flink兼容 Hadoop 客户端最大的价值在于生态兼容。任何以org.apache.hadoop.fs.FileSystem为抽象的计算框架都可以通过配置直接读写 AlluxioMapReduce在core-site.xml注册fs.alluxio.impl后作业的输入/输出路径即可使用alluxio://URI详见 docs/en/compute/Hadoop-MapReduce.mdSpark / Flink / Hive / Presto这些引擎内部都通过 HadoopFileSystem访问底层存储只要其配置中包含 Alluxio 客户端与上述 scheme 绑定即可无侵入地把数据路径指向 AlluxioHDFS 作为底层存储时Alluxio 可以配置 HDFS 作为 under storage见 docs/cn/ufs/HDFS.md此时兼容客户端访问的是Alluxio 缓存层 HDFS 持久层的组合上层应用无需感知底层存储的切换。这种上层无感、下层可替换的架构正是 Alluxio 作为数据编排层data orchestration layer的核心价值迁移到 Alluxio 不需要重写任何业务代码。使用限制与注意事项性能权衡兼容 API 每笔操作都经过 Hadoop → Alluxio 的转换与状态维护开销高于原生 API对性能敏感的场景建议直接使用 Alluxio 原生FileSystem。一次性写语义Alluxio 文件写完即不可变。从 AbstractFileSystem.java 的append实现可以看到对已存在的路径调用append()会直接抛出IOException(append() to existing Alluxio path is currently not supported)因为该语义与 Alluxio 的一次性写模型冲突。线程安全AbstractFileSystem.java 标注了NotThreadSafe同一个FileSystem实例不应被多线程共享需要为每个线程/任务创建独立实例。Hadoop 版本AlluxioFileSystem是面向 Hadoop 2.x 的AbstractFileSystem实现使用不同 Hadoop 版本时需确认 Alluxio 发行包/客户端与之匹配Hadoop 3.x 客户端同样通过alluxio.hadoop.FileSystem工作。URI 优先级alluxio://URI 中携带的 authority 会覆盖配置文件中的对应项如alluxio.master.rpc.addresses、alluxio.zookeeper.address配置冲突时以 URI 为准见 FileSystem.java。总结Alluxio 兼容 Hadoop 的 Java 客户端alluxio.hadoop.FileSystem是连接 Alluxio 与既有 Hadoop 生态的桥梁它以适配器模式包装 Alluxio 原生客户端对外提供标准的 HadoopFileSystem接口通过fs.alluxio.impl与fs.AbstractFileSystem.alluxio.impl两个配置项完成协议绑定。用户只需引入alluxio-shaded-client或alluxio-core-client-hdfs依赖即可让 MapReduce、Spark、Hive、Presto 以及 ORC/Parquet 等一切基于 Hadoop 文件系统抽象的代码以alluxio://URI 透明地读写 Alluxio 中的数据而无需修改任何业务逻辑。赞分享存储分布式文件系统缓存大数据【免费下载链接】alluxioAlluxio, data orchestration for analytics and machine learning in the cloud项目地址https://gitcode.com/gh_mirrors/al/alluxio点击查看免费下载相关推荐JuiceFS Hadoop Java SDK 完全指南在 Hadoop 生态中平滑接入 JuiceFSJuiceFS Hadoop Java SDK 完全指南在 Hadoop 生态中平滑接入 JuiceFS 本指南以 docs/zh_cn/deployment存储分布式文件系统云原生大数据Alluxio S3 API 兼容接口接入指南REST 调用、AWS CLI 与 Python 客户端实战Alluxio S3 API 兼容接口接入指南REST 调用、AWS CLI 与 Python 客户端实战 导读 本文围绕 Alluxio 内置的 S3 兼容存储分布式文件系统缓存大数据突破Hadoop存储瓶颈JuiceFS Java客户端的三大性能革命突破Hadoop存储瓶颈JuiceFS Java客户端的三大性能革命 你是否正面临Hadoop集群存储扩容难、小文件读写慢、云存储适配复杂等痛点作为大数据处存储分布式文件系统云原生大数据上一篇终极SDR体验为什么SDR正在彻底改变频谱监测体验下一篇深度解码开源媒体播放器5大模块架构揭秘与性能突破实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考