Apache Hadoop 兼容性

目的

本文档旨在将Hadoop兼容性指南中与系统管理员相关的信息提炼出来。

目标受众

目标受众是负责维护Apache Hadoop集群并必须规划和执行集群升级的管理员。

Hadoop版本发布

Hadoop开发社区会定期发布新版本,以引入新功能并修复现有问题。发布的版本分为三类:

  • 主版本:主版本通常包含重要的新功能,通常代表最大的升级兼容性风险。主版本会增加发布版本号的第一个数字,例如从2.8.2升级到3.0.0。
  • 次要版本:次要版本通常包含一些新功能以及对一些显著问题的修复。在大多数情况下,次要版本不会带来太多升级风险。次要版本会增加发布版本的中间数字,例如从2.8.2升级到2.9.0。
  • 维护版本:维护版本不应包含任何新功能。维护版本的目的是解决开发者社区认为足够重要、值得发布新版本以解决的一系列问题。维护版本应带来极低的升级风险。维护版本会递增版本号的最后一位数字,例如从2.8.2升级到2.8.3。

平台依赖项

Hadoop所依赖的原生组件集合被视为Hadoop ABI的一部分。Hadoop开发社区致力于最大程度地保持ABI兼容性。在次要版本之间,除非必要(例如出于安全或许可问题考虑),否则不会提高Hadoop原生依赖项的最低支持版本号。当发生此类变更时,Hadoop开发者社区会尽量保持相同的主版本号,仅更新次版本号。

Hadoop依赖于Java虚拟机。在Hadoop主要版本之间,JVM的最低支持版本不会改变。如果在主要版本之间当前最低支持的JVM版本变得不再受支持,则可能在次要版本中更改最低支持的JVM版本。

网络

Hadoop依赖一些传输层技术,例如SSL。除非必要(如出于安全或许可问题考虑),否则这些依赖项的最低支持版本不会升级。当此类变更发生时,Hadoop开发者社区会尽量保持主版本号不变,仅更新次版本号。

Hadoop的服务端口号在主版本内将保持不变,但可能会在主版本发布时更改。

Hadoop的内部通信协议将在同一主版本的小版本发布中保持向后和向前兼容性,无论是客户端与服务器之间还是服务器之间,目的是支持滚动升级。跨主版本的通信协议的向前和向后兼容性在某些条件下可能实现,并可能允许滚动升级,但不做任何保证。

脚本编写与自动化

REST API接口

Hadoop REST API提供了一种便捷机制来收集Hadoop系统状态信息。为支持REST客户端,这些API进行了版本控制,确保同一版本内不会出现不兼容变更。无论是端点本身、支持的参数列表还是端点输出,在REST端点版本内都禁止进行不兼容修改。但需注意,新增字段等增量变更被视为兼容性修改,因此任何REST API使用者都应具备足够灵活性以忽略未知字段。

REST API版本是一个单独的数字,与Hadoop版本号无关。版本号编码在端点URL中,以'v'为前缀,例如'v1'。新的REST端点版本只能在次要或主要版本发布时引入。REST端点版本只有在被标记为弃用并经过完整的主要版本发布后才能移除。

解析Hadoop输出

Hadoop会生成各种可能被自动化工具解析的输出。在使用Hadoop的输出时,请考虑以下事项:

  • Hadoop日志输出在维护版本中预计不会改变,除非它解决了正确性问题。虽然日志输出可以直接被软件消费,但它主要是为人类读者设计的。
  • Hadoop会为各种操作生成审计日志。这些审计日志设计为机器可读,尽管新增记录和字段被视为兼容性变更。任何审计日志的使用方都应允许出现意外记录和字段。审计日志格式在主要版本之间不会出现不兼容的变更。
  • Hadoop生成的指标数据主要供自动化系统使用。指标格式在主要版本之间不会以不兼容的方式更改,但可以随时兼容性地添加新记录和字段。指标数据的使用者应能处理未知记录和字段。

命令行界面

Hadoop提供了一系列命令行接口(CLI),可用于管理系统各个方面以及查询系统状态信息。在主要版本之间,所有CLI工具选项都不会被移除或发生语义变化。此规则的例外情况是那些明确标记为实验性且可能发生变更的CLI工具及其选项。除非另有说明,否则在同一主版本号内,CLI工具的输出格式也将保持一致。

请注意,对CLI工具输出的任何更改都被视为不兼容变更,因此在主要版本之间,CLI输出将保持不变。需注意CLI工具输出与CLI工具生成的日志输出不同。日志输出不适用于自动化处理,可能随时发生变化。

Web界面

Hadoop提供的网页用户界面仅供人工查阅。不支持通过抓取界面数据的方式使用。我们不会确保不同版本间网页界面显示数据的任何兼容性。

Hadoop状态数据

Hadoop的内部系统状态是私有的,不应直接修改。以下政策规定了各种内部状态存储的升级特性:

  • Hadoop内部MapReduce状态数据将在同一主版本的小版本更新中保持兼容,以便在执行MapReduce工作负载时支持滚动升级。
  • HDFS以私有的内部版本化格式维护存储在HDFS中的数据的元数据。如果发生不兼容的变更,存储版本号将会递增。在升级现有集群时,元数据存储将尽可能自动升级。元数据存储升级后,始终可以回滚升级过程。
  • AWS S3A防护机制曾维护了一个私有的内部元数据存储。由于该功能已被移除,该存储现已过时,可以删除。
  • YARN资源管理器维护着一个私有的、内部版本化的应用程序和调度器信息状态存储。不兼容的变更将导致版本号递增。如果升级需要重新格式化存储,将在发布说明中予以说明。
  • YARN节点管理器维护着一个私有的、内部版本化的应用程序信息状态存储。不兼容的变更将导致版本号递增。如果升级需要重新格式化存储,将在发布说明中予以说明。
  • YARN联邦服务维护着一个私有的、内部版本化的应用程序和集群信息状态存储。不兼容的变更将导致版本号递增。如果升级需要重新格式化存储,将在发布说明中予以说明。

Hadoop配置

Hadoop使用两种主要的配置文件形式:XML配置文件和日志配置文件。

XML配置文件

XML配置文件包含一组以名称-值对形式呈现的属性。这些属性的名称和含义由Hadoop定义,并保证在小版本更新中保持稳定。只有在主版本更新时才能移除某个属性,且该属性必须已被标记为弃用至少一个完整的主版本周期。大多数属性都具有默认值,如果在XML配置文件中未显式设置该属性,则会使用默认值。维护版本更新期间不会更改默认属性值。有关各Hadoop组件支持的属性详情,请参阅组件文档。

下游项目和用户可以在XML配置文件中添加自己的属性,供其工具和应用程序使用。虽然Hadoop对定义新属性没有正式限制,但与Hadoop定义的属性冲突的新属性可能导致意外和不理想的结果。建议用户避免使用与Hadoop定义属性命名空间冲突的自定义配置属性名称,因此应避免使用Hadoop使用的任何前缀,例如hadoop、io、ipc、fs、net、file、ftp、kfs、ha、file、dfs、mapred、mapreduce和yarn。

日志配置文件

Hadoop守护进程和命令行界面生成的日志输出由一组配置文件控制。这些文件决定了Hadoop各组件输出的最低日志级别,以及这些消息的存储位置和方式。在小版本更新中,不会对日志配置进行任何会减少、消除或重定向日志消息的更改。

其他配置文件

Hadoop利用多种其他格式的配置文件,例如JSON资源配置文件或XML公平调度器配置。在次要版本发布中,配置文件格式不会引入不兼容的更改。即使在次要版本之间,也将尽可能避免不兼容的配置文件格式更改。

Hadoop发行版

配置文件

Hadoop配置文件的位置和基本结构、作业历史信息(由作业历史服务器使用)以及Hadoop生成的日志文件将在维护版本中保持不变。

JAR文件等

Hadoop发行版的内容(例如JAR文件)可能随时变更,除客户端构件外不应被视为稳定可靠。客户端构件及其内容将在主版本内保持兼容。Hadoop开发社区的目标是让应用程序代码能够在次版本升级时无需修改继续运行,并尽可能实现跨主版本的兼容性。当前客户端构件清单如下:

  • hadoop客户端
  • hadoop-client-api
  • hadoop-client-minicluster
  • hadoop-client-runtime
  • hadoop-hdfs-client
  • hadoop-hdfs-native-client
  • hadoop-mapreduce-client-app
  • hadoop-mapreduce-client-common
  • hadoop-mapreduce-client-core
  • hadoop-mapreduce-client-jobclient
  • hadoop-mapreduce-client-nativetask
  • hadoop-yarn-client

环境变量

某些Hadoop组件通过环境变量接收信息。例如,HADOOP_OPTS环境变量被大多数Hadoop进程解释为启动新JVM时要使用的额外JVM参数字符串。在小版本更新之间,Hadoop解释环境变量的方式不会以不兼容的方式改变。换句话说,在同一个主版本的所有Hadoop发行版中,相同的变量值应该产生相同的结果。

库依赖项

Hadoop的运行依赖于大量第三方库。Hadoop开发者社区尽可能地向下游开发者隐藏这些依赖关系。尽管如此,Hadoop确实会暴露部分依赖项,特别是在Hadoop 3之前的版本中。在主要版本发布周期内,Hadoop不会通过客户端构件暴露任何新的依赖项。

一个常见的下游反模式是使用hadoop classpath的输出设置下游应用程序的类路径,或将Hadoop包含的所有第三方JAR包添加到下游应用程序的类路径中。这种做法会在下游应用程序与Hadoop的第三方依赖之间建立紧密耦合,导致应用程序变得脆弱,难以随着Hadoop依赖项的变化而维护。强烈不建议采用这种做法。

Hadoop还包含多个原生组件,包括压缩功能、容器执行器二进制文件以及各种原生集成。这些原生组件为Hadoop引入了一系列原生依赖项。原生依赖项集合可能会在次要版本中发生变化,但Hadoop开发社区将尽可能将依赖项版本变更限制在次要版本范围内。

硬件与操作系统依赖

Hadoop目前由Hadoop开发者社区在运行于x86和AMD处理器的Linux和Windows系统上提供支持。在可预见的未来,这些操作系统和处理器很可能会继续保持支持。如果支持计划发生变化,将被弃用的操作系统或处理器至少会在一个完整的小版本周期(理想情况下是一个完整的大版本周期)中被标记为已弃用,然后才会实际停止支持。Hadoop可能在其他操作系统和处理器架构上运行,但社区可能无法在出现问题时提供协助。

无法保证Hadoop守护进程所需的最低资源在不同版本(包括维护版本)之间会如何变化。尽管如此,Hadoop开发者社区会尽量避免在小版本更新中增加资源需求。

Hadoop支持的任何文件系统,例如通过FileSystem API访问的,在大多数情况下都会在整个主要版本中持续获得支持。唯一可能在一个主要版本中取消对某个文件系统支持的情况是,当提供了迁移到替代客户端实现的清晰路径时。

问题

关于基于Apache Hadoop开发应用程序和项目的问题,请联系用户邮件列表