360 HDFS集群跨版本升级

360大数据研发工程师左欢作的题为“360 HDFS集群跨版本升级之路”的报告。此前360的HDFS集群版本老旧,已成为360大数据平台发展的瓶颈,在背负沉重历史负担的情况下,如何实现HDFS的轻盈转身?左欢详细介绍了他们在多种升级方案间的权衡,以及如何在HDFS 3.x的基础之上实现对0.20版本HDFS的数据兼容、API兼容,从而实现HDFS的就地无缝升级。

展开查看详情

1.360 HDFS集群跨版本升级 系统部·左欢

2. 01 HDFS在360的实践与优化 目录 02 跨版本升级方案介绍 03 跨版本升级的实现

3.01 HDFS在360的实践与优化

4.360 HDFS存储平台介绍 2011年引入HDFS,经过近十年的发展已经形成比较大的规 模,存储数据达EB级别。 HDFS在360的发展: • 2011年:ha,federation,fastcopy • 2012年:balance,raid • 2013年:REST,fuse, permission • ……

5.急需升级 低版本hdfs所带来的问题: 稳定性不足; 其他原因: 回归社区。

6.02 跨版本升级方案介绍

7.hdfs跨版本升级 跨版本升级介绍 升级版本:0.20 3.0 升级对象: NameNode,DataNode,Client 难点:所有客户端需要同步升级 需要满足两个前提条件: 第一,所有集群可快速、同时升级; 第二,所有客户端可统一升级。 升级方案介绍 方案一:客户端向上兼容 方案二:服务端向下兼容 最终目标:将客户端、集群都升级到3.0

8.升级方案一:客户端向上兼容 Client Client 3.00.20 + 0.20 HDFS HDFS 0.20 3.0 Client Client 3.00.20 + 0.20 HDFS0.20 HDFS 3.0 Client Client 3.00.20 + 0.20

9.SpinnerDistributedFileSystem介绍 用户 viewfs 客户端 SpinnerDistribute FileSystem FileSystem system-classloader hdfs-0.20.jar hdfs-3.0.jar DistributeFileSystem DistributeFileSystem classloader-1 classloader-2 集群 HDFS 0.20 HDFS 3.0

10.升级方案一的优缺点 优点:实现相对简单,可以实现不停服升级,集群可逐步升级。 缺点:要求所有客户端可统一升级。 360 hdfs客户端的特点: 部分客户端处于托管的状态; 存在一些老版本的上层服务。

11.升级方案二:服务端向下兼容 Client Client 0.20 3.0 HDFS HDFS 3.00.20 HDFS 3.0 + 0.20 Client Client 0.20 3.0 HDFS HDFS 3.00.20 HDFS 3.0 + 0.20 Client Client 0.20 3.0

12.升级方案二的优缺点 优点:升级方式更加灵活。 缺点:实现相对复杂,需要: 1、兼容0.20客户端; 2、兼容0.20数据。

13.03 跨版本升级的实现

14.客户端兼容 在3.0的基础上,兼容0.20的数据、API,原地升级HDFS集 群,同时兼容0.20客户端。 API兼容包括: 3.0 NameNode兼容0.20客户端RPC请求; 3.0 DataNode兼容0.20客户端读写请求。 数据兼容包括: 3.0 NameNode兼容0.20元数据; 3.0 DataNode兼容0.20实际数据。

15.客户端RPC请求报文格式 3.0 RPC请求报文格式 RPC 版本号:9 RPC请求头:protocol,UGI RPC请求主体:方法名, (int) (Protobuff) 参数类型,参数值 (Protobuff)

16.NameNode处理RPC请求逻辑 客户端 集群 验证 RPC 版本 ProtoBuff反序列化 验证 IP/UGI ClientProtocol 动态代理 method, args NameNode实例 ProtoBuff序列化 NameNode

17.客户端RPC请求报文格式 3.0 RPC请求报文格式 RPC 版本号:9 RPC请求头:protocol,UGI RPC请求主体:方法名, (int) (Protobuff) 参数类型,参数值 (Protobuff) 0.20 RPC请求报文格式 RPC 版本号:3 RPC请求头:protocol,UGI RPC请求主体:方法名, (int) (Writable) 参数类型,参数值 (Writable)

18.NameNode兼容0.20客户端RPC请求 客户端 集群 3.0 验证 0.20 9 3 ProtoBuff反序列化 RPC Writable反序列化 版本 验证 验证 IP/UGI IP/UGI ClientProtocol NameNode ClientProtocol 动态代理 动态代理 method, args 实例 method, args ProtoBuff序列化 Writable序列化 NameNode 遇到的问题: 1、Writable不支持0.20类的序列化、反序列 2、0.20 RPC方法对齐:addblock、complete

19.客户端Streaming API请求报文格式 3.0 DN读写请求报文格式 版本号:28 请求报文主体:操作类型,参数 (short) (Protobuff) 0.20 DN读写请求报文格式 版本号:22 请求报文主体:操作类型,参数 (short) (Writable)

20.数据兼容 在3.0的基础上,兼容0.20的数据、API,原地升级HDFS集 群,同时兼容0.20客户端。 API兼容包括: 3.0 NameNode兼容0.20客户端RPC请求; 3.0 DataNode兼容0.20客户端读写请求。 数据兼容包括: 3.0 NameNode兼容0.20元数据; 3.0 DataNode兼容0.20实际数据。

21.NameNode元数据兼容 加载0.20 fsimage,edits 3.0可兼容 0.20 fsimage,但不兼容 0.20 edits 修改VERSION文件 namespaceID = 1930786878 clusterID = CID-0f0c3d01-b58a-42c5-a92b-22c8c6fd3358 blockpoolID = BP-917787042-10.10.10.10-1565321661000

22. DataNode实际数据兼容 DataNode目录结构发生变化 hdfs 0.20目录结构 hdfs 3.0目录结构 /data01/block/ /data01/block/ ├── current ├── current │ ├── NS-139749487 │ ├── BP-107959541-10.10.10.10-1412613236271 │ │ ├── current │ │ ├── current │ │ │ ├── VERSION │ │ │ ├── VERSION │ │ │ ├── subdir0 │ │ │ ├── finalized │ │ │ ├── subdir1 │ │ │ │ ├── subdir0 │ │ │ ├── blk_1073741825 │ │ │ │ └── subdir1 │ │ │ └── blk_1073741825_1001.meta │ │ │ ├── lazyPersist │ │ ├── blocksBeingWritten │ │ │ └── rbw │ │ └── tmp │ │ └── tmp │ └── VERSION │ └── VERSION └── in_use.lock └── in_use.lock

23.DataNode实际数据兼容 0.20版的DataNode存储数据的格式有两种: 1、实际数据与其校验和分开存储 2、将数据校验和追加在实际数据之后,存储在同一文件 但是,3.0只支持前者。 分开存储 合并存储 DATA blk_123123123123 blk_123123123123_2069_2_1_512 CheckSum blk_123123123123_2069.meta

24.DataNode实际数据兼容 DataNode中包含有少量的元数据,记录federation的相关信息,存储在文 件当中 current/VERSION storageID=DS-05e26c21-905e-4b99-bfda-bb83d4731712 clusterID=CID-0f0c3d01-b58a-42c5-a92b-22c8c6fd3358 datanodeUuid=771d9cd6-82de-4937-9aaa-6c9b325ae644 current/NS-*/current/VERSION namespaceID=1930786878 blockpoolID=BP-917787042-10.10.10.10-1565321661000

25.遇到的问题 1、vip问题 2、idToBlockdir 0.20 DataNode 3.0 DataNode 存储: 存储: blk_123123123123 /data01/block/ blk_123123123123 … random 35 30 ├─ finalized 22 17 …00111 00101 01010101 │ ├──10101 1100001110110011 subdir0/subdir0 ... finalized/subdir12/subdir6 │ ├── subdir0/subdir1 │ … ... finalized/subdir 21/subdir3 加载: 加载: │ └── subdir32/subdir32 block路径信息: … block路径信息: /data01/block/... finalized/subdir12/subdir6/ finalized 磁盘01 /data01/block/... finalized/subdir21/subdir3/ blk_123123123123 blk_123123123123

26. Thanks