Hadoop 3.3.1 → 3.4.1 版本差異與依賴(lài)兼容性分析
一、版本基本信息
| 項目 | Hadoop 3.3.1 | Hadoop 3.4.1 |
| 發(fā)布日期 | 2021年6月 | 2024年10月 |
| 中間版本 | - | 經(jīng)過(guò) 3.3.x 系列、3.4.0 |
| 主要變化 | 穩定性增強 | 重大功能升級 |
二、核心組件重大變化
1. AWS SDK 升級(最重要的變化)
| 變化項 | 3.3.1 | 3.4.1 |
| AWS SDK 版本 | SDK V1 | SDK V2 (1.12.720+) |
| S3 Select 支持 | 支持 | 已移除 |
| S3 Express One Zone | 不支持 | 完全支持 |
| FIPS 端點(diǎn)支持 | 有限 | 增強支持 |
關(guān)鍵配置變化:
- 新增
fs.s3a.classloader.isolation 選項
- 新增
fs.s3a.retry.http.5xx.errors 控制重試策略
- 目錄標記保留策略從"delete"改為"keep"
2. ABFS (Azure Data Lake) 增強
| 功能 | 3.3.1 | 3.4.1 |
| HTTP 客戶(hù)端 | 僅 JDK HttpURLConnection | 可選 Apache HttpClient |
| Prefetching | 默認啟用 | 默認禁用 |
| Manifest Committer | 非默認 | 默認提交器 |
| 數據緩沖方式 | disk | bytebuffer(默認) |
新增配置:
<property>
<name>fs.azure.networking.library</name>
<value>JDK_HTTP_URL_CONNECTION</value>
<!-- 或 APACHE_HTTP_CLIENT -->
</property>
三、HDFS 新特性
1. 存儲與編碼
| 特性 | 3.3.1 | 3.4.1 |
| NVDIMM 存儲類(lèi)型 | 無(wú) | 新增支持 |
| SM4 加密 | 無(wú) | 新增支持 |
| 糾刪碼驗證 | 無(wú) | DataNode端驗證 |
| 塊放置策略 | 標準策略 | AvailableSpaceRackFaultTolerant |
2. DataNode 增強
動(dòng)態(tài)重配置:支持運行時(shí)重新配置多個(gè)參數:
- 塊報告間隔 (
dfs.blockreport.intervalMsec)
- 緩存報告參數
- 慢盤(pán)/慢節點(diǎn)參數
- 傳輸帶寬限制
性能優(yōu)化:
- 細粒度鎖機制(卷級別鎖)
- 排除慢磁盤(pán)的卷選擇
- 慢節點(diǎn)檢測和指標
3. RBF (Router-Based Federation) 增強
| 特性 | 3.3.1 | 3.4.1 |
| Federation Rename | 基礎支持 | 跨命名空間重命名 |
| Observer 支持 | 無(wú) | ObserverReadConfiguredFailoverProxyProvider |
| Web UI 搜索框 | 無(wú) | 新增 |
四、YARN 改進(jìn)
1. Federation 增強
- Router 完整接口實(shí)現
- SubCluster 自動(dòng)下線(xiàn)機制
- Kerberos 安全支持增強
- 緩存實(shí)體數量限制
- 支持 Caffeine 緩存
2. 調度器改進(jìn)
- 動(dòng)態(tài)隊列 ACL 處理
- 隊列狀態(tài)轉換(DRAINING → RUNNING)
- AM 默認節點(diǎn)標簽配置
- 搶占策略?xún)?yōu)化
五、安全與依賴(lài)升級
1. 關(guān)鍵依賴(lài)版本
| 依賴(lài) | 3.3.1 | 3.4.1 |
| Log4j | 1.x | reload4j |
| Jackson | 1.x + 2.x | 僅 2.12.7+ |
| Netty | 較舊版本 | 4.1.77.Final |
| Protocol Buffers | 2.5 | 3.23.4 |
| ZooKeeper Client | 較舊版本 | 3.8.4 |
| Bouncy Castle | 較舊版本 | 1.77 |
| snappy-java | 較舊版本 | 1.1.8.2 |
2. 安全修復
3.4.1 修復了多個(gè) CVE:
- CVE-2024-23944 (ZooKeeper)
- CVE-2022-23437 (Xerces)
- CVE-2019-20444/20445 (Netty)
- 多個(gè) Jackson CVE
六、移除的功能
| 功能 | 狀態(tài) |
hadoop-openstack 模塊 | 已移除 |
| HTrace 追蹤 | 替換為 No-Op |
| S3 Select | 已移除 |
trace 子命令 | 已移除 |
| Swift 文件系統 | 已移除 |
| Commons Logging(FileSystem類(lèi)) | 已移除 |
七、配置變化
重要默認值變化
| 配置項 | 3.3.1 默認值 | 3.4.1 默認值 |
dfs.image.transfer.bandwidthPerSec | 0 (無(wú)限制) | 50MB/s |
dfs.namenode.quota.init-threads | 4 | 12 |
dfs.client.failover.random.order | false | true |
ipc.client.rpc-timeout.ms | 0 | 120000 |
hadoop.http.idle_timeout.ms | 10000 | 60000 |
fs.s3a.directory.marker.retention | delete | keep |
fs.abfs.enable.readahead | true | false |
八、新API與接口
| API | 描述 |
FileSystem.recoverLease() | 租約恢復 |
FileSystem.setSafeMode() | 安全模式控制 |
FileSystem.isFileClosed() | 文件關(guān)閉狀態(tài)檢查 |
UGI#getGroupsSet() | 高效組查詢(xún) |
PositionedReadable.readVectored() | 向量化讀取 |
九、性能改進(jìn)
1. NameNode
- 并行加載 FsImage 的塊映射和名稱(chēng)緩存
- 延遲計算安全模式下的活躍 DataNode
- 減少鎖競爭
2. DataNode
- 卷級別鎖替代全局鎖
- DirectoryScanner 優(yōu)化
- 塊掃描速度提升
3. 客戶(hù)端
- URI 緩存減少對象創(chuàng )建
- LongAdder 替代 AtomicLong
- DistCp 內存優(yōu)化(
-useiterator 選項)
十、依賴(lài)兼容性檢查清單
1. HDFS 客戶(hù)端 API 兼容性
新增 API(可選用)
| API | 用途 | 影響 |
FileSystem.recoverLease(path) | 租約恢復 | 新功能 |
FileSystem.setSafeMode(action) | 安全模式控制 | 新功能 |
FileSystem.isFileClosed(path) | 文件關(guān)閉檢查 | 新功能 |
PositionedReadable.readVectored() | 向量化讀取 | 性能優(yōu)化 |
已移除/棄用的 API
| 變化 | 影響 | 遷移方案 |
FileSystem.LOG (commons-logging) | 已移除 | 使用私有 SLF4J Logger |
DFSClient#getGroups() | 已棄用 | 使用getGroupsSet() |
行為變化
| 變化點(diǎn) | 3.3.1 | 3.4.1 | 檢查項 |
| 默認字符集 | 系統默認 | UTF-8 | 檢查依賴(lài)系統編碼的代碼 |
| RPC 超時(shí) | 0 (無(wú)限) | 120000ms | 檢查需要長(cháng)超時(shí)的操作 |
| Failover 順序 | 固定順序 | 隨機順序 | 檢查依賴(lài)特定 NN 順序的邏輯 |
2. YARN API 兼容性
已移除的類(lèi)
| 移除的類(lèi) | 替代方案 |
org.apache.hadoop.yarn.webapp.hamlet.* | 使用hamlet2 包 |
新增功能
| 功能 | 說(shuō)明 |
| 動(dòng)態(tài)隊列 ACL | YARN-11069 |
| AM 默認節點(diǎn)標簽 | yarn.am.default.node-label |
| 隊列狀態(tài)轉換 | DRAINING → RUNNING |
3. 自定義擴展檢查
FileSystem 自定義實(shí)現
// 舊代碼(3.3.1)- 會(huì )編譯失敗
public class MyFileSystem extends FileSystem {
// 繼承了 protected CommonsLogging LOG
}
// 新代碼(3.4.1)- 必須修改
public class MyFileSystem extends FileSystem {
private static final Logger LOG = LoggerFactory.getLogger(MyFileSystem.class);
}
S3A 擴展(如果使用 S3)
| 擴展點(diǎn) | 變化 |
AWSCredentialsProvider | V1 SDK 類(lèi)需遷移到 V2 |
S3ACommitter | Manifest Committer 成為默認 |
| S3 Select | 已移除 |
Writable 序列化
// 如果有序列化類(lèi)使用了舊類(lèi)名,需添加別名
WritableName.addName("com.example.OldClass", NewClass.class);
4. 依賴(lài)版本沖突檢查
需要排除的舊依賴(lài)
<!-- 排除舊的 log4j 1.x -->
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<!-- 排除 reload4j(如果不需要)-->
<exclusion>
<groupId>ch.qos.reload4j</groupId>
<artifactId>reload4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
</exclusion>
需要顯式添加的依賴(lài)
<!-- 如果使用 LZ4 壓縮 -->
<dependency>
<groupId>org.lz4</groupId>
<artifactId>lz4-java</artifactId>
<version>1.8.0</version>
</dependency>
<!-- 如果使用 Snappy 壓縮 -->
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
<version>1.1.8.2</version>
</dependency>
5. 檢查步驟建議
□ 1. 掃描代碼中對以下包的引用:
- org.apache.hadoop.fs.s3a.S3A* (AWS SDK V2 變化)
- org.apache.hadoop.fs.FileSystem.LOG (已移除)
- org.apache.hadoop.yarn.webapp.hamlet.* (已移除)
□ 2. 檢查 Maven/Gradle 依賴(lài):
- Jackson 版本沖突(確保僅使用 2.12.7+)
- 排除 log4j 1.x 相關(guān)依賴(lài)
□ 3. 測試關(guān)鍵路徑:
- HDFS 讀寫(xiě)操作
- YARN 任務(wù)提交
- 自定義 Committer/FileSystem
□ 4. 驗證配置:
- rpc-timeout 相關(guān)配置
- 編碼相關(guān)(UTF-8)
十一、升級建議
從 3.3.1 升級到 3.4.1 需要:
- 檢查依賴(lài)兼容性 - AWS SDK V2 變化較大
- 驗證 S3 Select 使用 - 該功能已移除
- 調整 ABFS 配置 - 默認值有變化
- 測試 Log4j 配置 - 遷移到 reload4j
- 審查自定義代碼 - 移除的 API 和類(lèi)
十二、Protocol Buffers 版本變化兼容性分析
1. 版本變化概覽
| 項目 | Hadoop 3.3.1 | Hadoop 3.4.1 |
| Protocol Buffers 版本 | 2.5.0 | 3.21.12 ~ 3.23.4 |
| protobuf-java | 2.5.0 | 3.23.4 |
| protoc 編譯器 | 2.5.x | 23.x |
| 協(xié)議格式 | proto2 | proto2 + proto3 |
2. 核心兼容性問(wèn)題
2.1 二進(jìn)制兼容性(關(guān)鍵問(wèn)題)
問(wèn)題:Proto2 和 Proto3 生成的 Java 類(lèi)不兼容
| 兼容性層面 | 狀態(tài) | 說(shuō)明 |
| 線(xiàn)格式(Wire Format) | ? 兼容 | 二進(jìn)制序列化格式不變,舊數據可被新版本讀取 |
| Java API | ? 不兼容 | 生成的 Java 類(lèi) API 完全不同 |
| 運行時(shí)類(lèi) | ? 不兼容 | protobuf-java 2.x 和 3.x 不能共存 |
影響范圍:
- 所有依賴(lài) Hadoop RPC 通信的組件
- 自定義 Writable 序列化
- YARN/MapReduce 協(xié)議消息
2.2 Java API 變化
Proto2 (Hadoop 3.3.1):
// 生成的 Message 類(lèi)
public class MyMessage extends GeneratedMessage {
// 使用 Builder 模式
public static MyMessage parseFrom(byte[] data);
// 字段訪(fǎng)問(wèn)
public String getName();
public boolean hasName();
}
Proto3 (Hadoop 3.4.1):
// 生成的 Message 類(lèi)(API 變化)
public class MyMessage extends GeneratedMessageV3 {
// 解析方法類(lèi)似但實(shí)現不同
public static MyMessage parseFrom(byte[] data);
// 字段訪(fǎng)問(wèn) - 空字段處理不同
public String getName(); // 空字段返回空字符串而非 null
// 新增方法
public Builder toBuilder();
}
2.3 依賴(lài)沖突
類(lèi)路徑?jīng)_突問(wèn)題:
| 沖突類(lèi) | 3.3.1 | 3.4.1 |
com.google.protobuf.Message | 2.5.0 | 3.23.4 |
com.google.protobuf.GeneratedMessage | 2.5.0 | 3.23.4 (GeneratedMessageV3) |
com.google.protobuf.CodedInputStream | 2.5.0 | 3.23.4 |
同一個(gè) JVM 中不能同時(shí)存在兩個(gè)版本!
3. Hadoop 組件影響分析
3.1 HDFS RPC 協(xié)議
| 協(xié)議 | 影響 | 說(shuō)明 |
| ClientProtocol | ?? 高 | 客戶(hù)端與 NameNode 通信 |
| DatanodeProtocol | ?? 高 | DataNode 與 NameNode 通信 |
| JournalProtocol | ?? 中 | JournalNode 同步 |
| HAServiceProtocol | ?? 中 | NameNode HA |
影響:所有跨版本 RPC 調用都會(huì )失敗
3.2 YARN 協(xié)議
| 協(xié)議 | 影響 | 說(shuō)明 |
| ApplicationClientProtocol | ?? 高 | 客戶(hù)端提交作業(yè) |
| ApplicationMasterProtocol | ?? 高 | AM 與 RM 通信 |
| ContainerManagementProtocol | ?? 高 | AM 與 NM 通信 |
3.3 MapReduce
- 任務(wù)提交協(xié)議
- Shuffle 協(xié)議
- 任務(wù)狀態(tài)上報
4. 具體兼容性問(wèn)題
問(wèn)題 1:混合版本集群不兼容
┌─────────────────┐ ┌─────────────────┐
│ Hadoop 3.3.1 │ ─RPC─? │ Hadoop 3.4.1 │
│ (Proto 2.5) │ ? │ (Proto 3.23) │
└─────────────────┘ └─────────────────┘
錯誤:Protobuf 版本不匹配,無(wú)法反序列化消息
結論:集群必須統一升級,不能混版本運行
問(wèn)題 2:自定義協(xié)議擴展
如果項目自定義了 Hadoop 協(xié)議(如自定義 Committer、自定義插件):
// 舊代碼(使用 Proto 2.5 生成的類(lèi))
public class MyCustomProtocol implements ProtocolProxy {
MyMessage parseRequest(byte[] data) {
return MyMessage.parseFrom(data); // Proto 2.5 API
}
}
// 升級后需要重新生成類(lèi)并修改代碼
public class MyCustomProtocol implements ProtocolProxy {
MyMessage parseRequest(byte[] data) {
return MyMessage.parseFrom(data); // Proto 3.x API,但類(lèi)已重新生成
}
}
問(wèn)題 3:第三方依賴(lài)沖突
| 第三方組件 | 潛在沖突 | 解決方案 |
| Spark | 可能使用舊版 protobuf | 顯式依賴(lài)新版本 |
| Flink | 可能使用舊版 protobuf | 使用 shade 重定位 |
| HBase | 使用自己的 protobuf | 獨立管理依賴(lài) |
| Kafka | 內置 protobuf | 版本需對齊 |
5. Hadoop 的緩解策略
5.1 hadoop-thirdparty 項目
Hadoop 3.4.x 使用 hadoop-thirdparty 來(lái)重定位 protobuf:
<dependency>
<groupId>org.apache.hadoop.thirdparty</groupId>
<artifactId>hadoop-shaded-protobuf_3_25</artifactId>
<version>1.3.0</version>
</dependency>
作用:
- 將 protobuf 類(lèi)重定位到
org.apache.hadoop.thirdparty.protobuf.*
- 允許 Hadoop 內部使用新版 protobuf
- 隔離外部依賴(lài)沖突
5.2 相關(guān) JIRA
| JIRA | 描述 |
| HADOOP-16604 | 升級 protobuf 相關(guān)討論 |
| YARN-11657 | 移除 protobuf 2.5 作為 yarn-api 依賴(lài) |
| HADOOP-19065 | 更新 Protocol Buffers 到 3.21.12 |
| HADOOP-19090 | 更新 Protocol Buffers 到 3.23.4 |
6. 遷移檢查清單
□ 1. 檢查項目依賴(lài)
├─ 搜索所有 protobuf-java 依賴(lài)
├─ 確認版本統一為 3.23.x+
└─ 排除沖突的 protobuf 2.x
□ 2. 重新生成 Protocol 類(lèi)
├─ 使用新版 protoc (23.x) 重新編譯 .proto 文件
└─ 更新所有生成的 Java 類(lèi)
□ 3. 檢查代碼兼容性
├─ 檢查 hasXxx() 方法調用(proto3 中空值處理不同)
├─ 檢查字段默認值邏輯
└─ 檢查 Builder 模式使用
□ 4. 驗證第三方組件
├─ Spark/Flink 等的 protobuf 版本
└─ 必要時(shí)使用 shade 插件重定位
□ 5. 集群升級策略
├─ 全量升級,不支持滾動(dòng)升級
└─ 升級期間服務(wù)不可用
7. 升級建議
| 場(chǎng)景 | 建議 |
| 純 Hadoop 集群 | 全量升級,確保所有節點(diǎn)版本一致 |
| 依賴(lài) Spark/Flink | 確認兼容性后統一升級 |
| 自定義 RPC 協(xié)議 | 重新生成 protobuf 類(lèi)并測試 |
| 多租戶(hù)環(huán)境 | 統一 protobuf 版本,避免沖突 |
8. 核心結論
Protocol Buffers 2.5 → 3.23 是一個(gè)不兼容的破壞性升級。升級時(shí)必須:
- 全集群統一升級 - 不支持混合版本
- 重新生成所有 protobuf 類(lèi) - 使用新版 protoc
- 處理第三方依賴(lài)沖突 - 確保 protobuf 版本一致
十三、Log4j 版本變化兼容性分析
1. 版本變化概覽
| 項目 | Hadoop 3.3.1 | Hadoop 3.4.1 |
| Log4j 版本 | 1.2.x (log4j 1.x) | reload4j 1.2.18+ |
| 包命名空間 | org.apache.log4j | org.apache.log4j (兼容) |
| 配置文件 | log4j.properties / log4j.xml | log4j.properties / log4j.xml |
| 維護狀態(tài) | 已 EOL (2015年) | 社區維護 fork |
2. Log4j 1.x EOL 背景說(shuō)明
Log4j 1.x 于 2015 年停止維護,2015 年 8 月后報告的漏洞不再修復。reload4j 是 Log4j 1.x 的社區維護分支,修復了關(guān)鍵安全問(wèn)題。
3. 核心兼容性問(wèn)題
3.1 API 兼容性
| 兼容性層面 | 狀態(tài) | 說(shuō)明 |
| 包名 | ? 兼容 | 均為org.apache.log4j |
| 配置文件 | ? 兼容 | 格式完全兼容 |
| 二進(jìn)制兼容 | ? 兼容 | drop-in 替換 |
| 行為一致性 | ?? 基本兼容 | 少數邊緣情況可能不同 |
3.2 主要變化
reload4j 相對于 Log4j 1.x 的改進(jìn):
-
安全修復
- 修復了 Log4j 1.x 的已知安全漏洞
- 移除了有風(fēng)險的 JMSAppender 默認配置
- 加強了配置文件加載的安全性
-
行為變化
- 默認禁用某些不安全的功能
- 改進(jìn)了錯誤處理和日志輸出
4. 遷移影響
4.1 無(wú)需修改的場(chǎng)景
以下場(chǎng)景可以直接替換,無(wú)需修改代碼:
- 使用標準 Log4j 1.x API 的應用
- 使用
log4j.properties 或 log4j.xml 配置
- 使用標準 Appender(ConsoleAppender、FileAppender 等)
4.2 需要檢查的場(chǎng)景
| 場(chǎng)景 | 檢查項 |
| 自定義 Appender | 驗證兼容性 |
| JMSAppender | 檢查配置是否被禁用 |
| SocketAppender | 驗證連接配置 |
| 自定義 Layout | 驗證輸出格式 |
4.3 配置文件兼容性
# log4j.properties - 完全兼容
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
5. 相關(guān) JIRA
| JIRA | 描述 |
| HADOOP-18088 | Replace log4j 1.x with reload4j |
6. 遷移建議
□ 1. 更新 Maven 依賴(lài)
<dependency>
<groupId>ch.qos.reload4j</groupId>
<artifactId>reload4j</artifactId>
<version>1.2.25</version>
</dependency>
□ 2. 排除舊的 log4j 依賴(lài)
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
□ 3. 驗證日志配置文件
□ 4. 測試關(guān)鍵日志輸出
十四、Jackson 版本變化兼容性分析
1. 版本變化概覽
| 項目 | Hadoop 3.3.1 | Hadoop 3.4.1 |
| Jackson 1.x | 存在 | 已移除 |
| Jackson 2.x | 2.x (多版本) | 僅 2.12.7+ |
| jackson-core | 多版本 | 2.12.7 |
| jackson-databind | 多版本 | 2.12.7 |
| jackson-annotations | 多版本 | 2.12.7 |
2. 核心兼容性問(wèn)題
2.1 Jackson 1.x 完全移除
Hadoop 3.4.1 完全移除了 Jackson 1.x 依賴(lài):
| 影響 | 說(shuō)明 |
| API 不兼容 | org.codehaus.jackson.* 包不再存在 |
| 類(lèi)路徑?jīng)_突 | 必須確保沒(méi)有 Jackson 1.x 殘留 |
| 第三方庫 | 檢查依賴(lài)是否使用 Jackson 1.x |
2.2 Jackson 2.x 版本統一
Hadoop 3.4.1 統一使用 Jackson 2.12.7:
<!-- 統一版本 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.7</version>
</dependency>
3. Jackson 2.12 重要變化
3.1 新特性
| 特性 | 說(shuō)明 |
| Java 14 Record 支持 | 原生支持java.lang.Record |
| CoercionConfig | 可配置的類(lèi)型強制轉換規則 |
@JsonIncludeProperties | 白名單式屬性包含 |
| 多態(tài)類(lèi)型推導 | @JsonTypeInfo(use=DEDUCTION) |
| ConstructorDetector | 注解無(wú)關(guān)的構造函數檢測 |
3.2 行為變化
| 變化 | 影響 |
| 空字符串處理 | XML 模塊EMPTY_ELEMENT_AS_NULL 默認改為 false |
| 單字段 Record | 綁定方式從 Delegating 改為 Properties |
| JDK 基線(xiàn) | 最低 JDK 7(部分模塊需要 JDK 8) |
4. 遷移影響
4.1 包名遷移
// 舊代碼(Jackson 1.x)- 不再支持
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.JsonNode;
// 新代碼(Jackson 2.x)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;
4.2 API 變化
| Jackson 1.x | Jackson 2.x |
ObjectMapper.serialize() | ObjectMapper.writeValueAsString() |
ObjectMapper.deserialize() | ObjectMapper.readValue() |
JsonNode.getPath() | JsonNode.at() |
4.3 第三方依賴(lài)檢查
| 組件 | 檢查項 |
| Spark | 內置 Jackson 版本 |
| Flink | 內置 Jackson 版本 |
| Spring | 版本兼容性 |
| Jersey | JSON 處理配置 |
5. 相關(guān) JIRA
| JIRA | 描述 |
| HADOOP-15983 | Use jersey-json that is built to use jackson2 |
| HADOOP-18332 | Remove rs-api dependency by downgrading jackson to 2.12.7 |
6. 遷移建議
□ 1. 掃描代碼中 Jackson 1.x 引用
grep -r "org.codehaus.jackson" .
□ 2. 更新 Maven 依賴(lài)
- 確保只使用 Jackson 2.x
- 排除 Jackson 1.x 傳遞依賴(lài)
□ 3. 修改代碼中的包名導入
□ 4. 驗證 JSON 序列化/反序列化
□ 5. 檢查第三方組件兼容性
十五、Netty 版本變化兼容性分析
1. 版本變化概覽
| 項目 | Hadoop 3.3.1 | Hadoop 3.4.1 |
| Netty 版本 | 3.x / 4.0.x | 4.1.77.Final |
| netty-all | 較舊版本 | 4.1.77.Final |
| netty-buffer | 較舊版本 | 4.1.77.Final |
| netty-codec | 較舊版本 | 4.1.77.Final |
2. 安全修復
Hadoop 3.4.1 升級 Netty 修復了以下 CVE:
| CVE | 描述 | 嚴重程度 |
| CVE-2019-20444 | HTTP 請求走私漏洞 | 高 |
| CVE-2019-20445 | HTTP 請求走私漏洞 | 高 |
| CVE-2022-24823 | 資源管理錯誤 | 中 |
3. 核心兼容性問(wèn)題
3.1 Netty 3.x → 4.x 破壞性變化
| 變化 | 影響 |
| 包名 | org.jboss.netty.* → io.netty.* |
| API 重構 | 大部分 API 不兼容 |
| Buffer 模型 | ChannelBuffer → ByteBuf |
| Channel 體系 | 完全重構 |
3.2 Netty 4.0.x → 4.1.x 變化
| 變化 | 說(shuō)明 |
| 內存管理 | 改進(jìn)的內存分配器 |
| SSL/TLS | 更好的 SSL 支持 |
| HTTP/2 | 原生 HTTP/2 支持 |
| 性能優(yōu)化 | 多項性能改進(jìn) |
4. Hadoop 中的 Netty 使用
| 組件 | 用途 |
| HDFS DataNode | 數據傳輸 |
| YARN NodeManager | Container 通信 |
| MapReduce Shuffle | Shuffle 服務(wù) |
| WebHDFS | HTTP 服務(wù) |
5. 遷移影響
5.1 包名變化
// 舊代碼(Netty 3.x)
import org.jboss.netty.channel.Channel;
import org.jboss.netty.buffer.ChannelBuffer;
// 新代碼(Netty 4.x)
import io.netty.channel.Channel;
import io.netty.buffer.ByteBuf;
5.2 Buffer API 變化
// Netty 3.x
ChannelBuffer buffer = ChannelBuffers.buffer(1024);
buffer.writeBytes(data);
// Netty 4.x
ByteBuf buffer = Unpooled.buffer(1024);
buffer.writeBytes(data);
5.3 Channel 變化
// Netty 3.x
Channel channel = ...;
channel.write(message); // 直接寫(xiě)入
// Netty 4.x
Channel channel = ...;
channel.writeAndFlush(message); // 需要顯式 flush
6. 遷移建議
□ 1. 檢查代碼中 Netty 包引用
grep -r "org.jboss.netty" .
□ 2. 更新 Maven 依賴(lài)到 4.1.77.Final
□ 3. 修改導入語(yǔ)句
org.jboss.netty.* → io.netty.*
□ 4. 更新 Buffer 相關(guān)代碼
ChannelBuffer → ByteBuf
□ 5. 更新 Channel 操作
write() → writeAndFlush()
□ 6. 驗證網(wǎng)絡(luò )通信功能
十六、Bouncy Castle 版本變化兼容性分析
1. 版本變化概覽
| 項目 | Hadoop 3.3.1 | Hadoop 3.4.1 |
| Bouncy Castle 版本 | 1.60-1.68 | 1.77+ |
| bcprov-jdk15on | 較舊版本 | 1.77 |
| bcprov-jdk18on | 無(wú) | 新增 |
| 多版本 JAR | 無(wú) | 支持 |
2. 多版本 JAR 特性
Bouncy Castle 1.68+ 是多版本 JAR(Multi-Release JAR),包含針對不同 JDK 版本優(yōu)化的代碼:
META-INF/versions/
├── 9/ # JDK 9+
├── 11/ # JDK 11+
└── 17/ # JDK 17+
3. 核心兼容性問(wèn)題
3.1 JDK 版本要求
| Bouncy Castle 版本 | JDK 要求 | 說(shuō)明 |
| bcprov-jdk15on | JDK 1.5+ | 舊版本 |
| bcprov-jdk18on | JDK 18+ | 新版本 |
3.2 API 變化
| 變化 | 影響 |
| 安全提供者注冊 | 可能需要重新配置 |
| 加密算法 | 新增算法支持 |
| 棄用 API | 部分舊 API 被標記棄用 |
4. 加密功能影響
| 功能 | 3.3.1 | 3.4.1 |
| SM4 加密 | 無(wú) | 支持 |
| AES-GCM | 支持 | 改進(jìn) |
| RSA | 支持 | 改進(jìn) |
| ECC | 支持 | 改進(jìn) |
5. Hadoop 中的使用場(chǎng)景
| 組件 | 用途 |
| HDFS 加密 | 數據加密 |
| KMS | 密鑰管理 |
| Security | 認證加密 |
| WebHDFS | HTTPS 加密 |
6. 遷移建議
□ 1. 更新 Maven 依賴(lài)
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.77</version>
</dependency>
□ 2. 檢查 Security Provider 配置
Security.addProvider(new BouncyCastleProvider());
□ 3. 驗證加密功能
- HDFS 加密區域
- KMS 密鑰操作
- HTTPS 通信
□ 4. 檢查 ASM 版本兼容性
- Bouncy Castle 1.68+ 可能與舊版 ASM 沖突
十七、snappy-java 版本變化兼容性分析
1. 版本變化概覽
| 項目 | Hadoop 3.3.1 | Hadoop 3.4.1 |
| snappy-java 版本 | 1.1.7.x | 1.1.8.2 |
| 壓縮編解碼器 | 需要原生庫 | 內置原生庫 |
| 平臺支持 | 需手動(dòng)配置 | 跨平臺支持 |
2. 核心改進(jìn)
2.1 內置原生庫
snappy-java 1.1.8+ 內置了多平臺原生庫:
| 平臺 | 架構 | 支持 |
| Linux | x86_64 | ? |
| Linux | aarch64 | ? |
| Windows | x86_64 | ? |
| macOS | x86_64 | ? |
| macOS | aarch64 (M1) | ? |
2.2 純 Java 回退
當原生庫不可用時(shí),自動(dòng)回退到純 Java 實(shí)現。
3. SnappyCodec 變化
Hadoop 3.4.1 使用 snappy-java 替代原生 Snappy:
// Hadoop 3.3.1 - 需要系統安裝 snappy
// 配置: 需要安裝 libsnappy-dev
// Hadoop 3.4.1 - 使用 snappy-java
// 無(wú)需額外安裝,開(kāi)箱即用
4. 配置變化
<!-- Hadoop 3.4.1 壓縮配置 -->
<property>
<name>io.compression.codec.snappy.java.class</name>
<value>org.apache.hadoop.io.compress.snappy.SnappyCodec</value>
</property>
5. 性能對比
| 版本 | 壓縮速度 | 解壓速度 | 壓縮率 |
| 1.1.7 | 基準 | 基準 | 基準 |
| 1.1.8.2 | +5% | +3% | 持平 |
6. 遷移影響
6.1 依賴(lài)更新
<!-- 添加 snappy-java 依賴(lài) -->
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
<version>1.1.8.2</version>
</dependency>
6.2 系統要求變化
| 項目 | 3.3.1 | 3.4.1 |
| 系統安裝 Snappy | 需要 | 不需要 |
| 原生庫路徑配置 | 需要 | 不需要 |
| 跨平臺部署 | 復雜 | 簡(jiǎn)單 |
7. 相關(guān) JIRA
| JIRA | 描述 |
| HADOOP-17125 | Using snappy-java in SnappyCodec |
| HADOOP-17425 | Bump up snappy-java to 1.1.8.2 |
8. 遷移建議
□ 1. 更新 Maven 依賴(lài)到 1.1.8.2
□ 2. 移除系統 Snappy 安裝要求
- 不再需要 libsnappy-dev
- 不再需要配置原生庫路徑
□ 3. 驗證壓縮功能
- MapReduce 輸出壓縮
- HDFS 文件壓縮
- 中間數據壓縮
□ 4. 測試跨平臺兼容性
- Linux x86_64
- Linux aarch64
- macOS M1
十八、依賴(lài)兼容性總結
1. 版本變化匯總表
| 依賴(lài) | 3.3.1 | 3.4.1 | 兼容性 |
| Log4j | 1.2.x | reload4j 1.2.x | ? 兼容 |
| Jackson | 1.x + 2.x | 僅 2.12.7 | ?? 需遷移 |
| Netty | 3.x/4.0.x | 4.1.77 | ?? 需遷移 |
| Bouncy Castle | 1.60-1.68 | 1.77+ | ? 兼容 |
| snappy-java | 1.1.7.x | 1.1.8.2 | ? 改進(jìn) |
| Protocol Buffers | 2.5 | 3.23.4 | ? 不兼容 |
2. 遷移優(yōu)先級
| 優(yōu)先級 | 依賴(lài) | 原因 |
| P0 | Protocol Buffers | RPC 通信完全中斷 |
| P1 | Jackson | API 不兼容,JSON 處理失敗 |
| P1 | Netty | 網(wǎng)絡(luò )通信問(wèn)題 |
| P2 | Log4j | 需驗證配置 |
| P3 | Bouncy Castle | 通常向后兼容 |
| P3 | snappy-java | 自動(dòng)回退機制 |
3. 檢查清單
□ Protocol Buffers
├─ 全集群統一升級
├─ 重新生成 proto 類(lèi)
└─ 處理依賴(lài)沖突
□ Jackson
├─ 移除 Jackson 1.x 依賴(lài)
├─ 更新包名導入
└─ 驗證 JSON 處理
□ Netty
├─ 更新包名導入
├─ 修改 Buffer/Channel API
└─ 驗證網(wǎng)絡(luò )通信
□ Log4j
├─ 更新依賴(lài)到 reload4j
├─ 排除舊 log4j
└─ 驗證日志配置
□ Bouncy Castle
├─ 更新依賴(lài)版本
├─ 檢查 Provider 配置
└─ 驗證加密功能
□ snappy-java
├─ 更新依賴(lài)版本
├─ 移除原生庫配置
└─ 驗證壓縮功能
參考資料