hbase的2.2.4版本支持哪个版本的hadoop_Hadoop 2.7 不停服升级到 3.2 在滴滴的实践

桔妹导读:Hadoop 3的第一个稳定版本在2017年底就已经发布了,有了很多重大的改进。在HDFS方面,支持了Erasure Coding、More than 2 NameNodes、Router-Based Federation、Intra-datanode balancer 等功能,大家可能对这些功能很感兴趣,打算将集群升级到HDFS 3.x 版本。本篇文章会介绍我们是如何将 HDFS 从2.7滚动升级到3.2版本的,在升级中会遇到哪些问题以及我们是如何解决掉的。HDFS 升级过程漫长,但是收益是非常多的。在此基础上,我们可以继续做非常有意义的工作,持续在稳定性、性能、成本等多个方面深入探索,使用技术为公司创造可见的价值。

1.

为什么要升级


在2017年底, Hadoop3.0 发布了,到目前为止, Hadoop 发布的最新版本为3.2.1。在 Hadoop3 中有很多有用的新特性出现,如支持 ErasureCoding、多 NameNode、Standby NameNode read、DataNode Disk Balance、HDFS RBF 等等。除此之外,还有很多性能优化以及 BUG 修复。其中最吸引我们的就是 ErasureCoding 特性,数据可靠性保持不变的情况下可以降低数据的存储副本数量,结合公司的降成本目标以及用户的痛点,我们对此做了深入的调研。同时,在实际工作中我们发现,我们遇到的一些 BUG 以及想做的一些优化点,社区早已经修复或者实现。内部使用的 Hadoop 版本对应社区的2.7.2,由于社区很多 BUG 修复是不会移植到太低版本的,我们解决问题时花费了较多精力在移植与测试验证中。如果升级到 HDFS3.2 版本,可以站在巨人肩膀上继续工作,做一些更有意义的事情。

2.

调研升级方案  


升级方式有两种:Express 和 Rolling,Express 升级过程是停止现有服务,然后使用新版本启动服务;Rolling 升级过程是滚动升级,不停服务,对用户无感知。对于公司来说,当然滚动升级是最好的方案,离线集群用户非常之多,影响面非常之大。目前业界还没有滚动升级的方案从2.x 版本升级到3.x 版本,Cloudera 和 Hontonworks 公司(目前两个公司已合并)给出的推荐方案仍然是 Express 升级,例如 Hontonworks 的文档中描述,目前滚动升级存在一些问题尚未解决,推荐用户做 Express 升级。当前滚动升级存在的问题记录在 Apache Hadoop Wiki 中,主要问题是 Edit Log 不兼容,无法进行滚动升级。调研之后,我们对整个升级方案有了一个初步掌握,开始着手解决这些问题。HDFS 整体架构图(网络上获取)如下所示,我们准备对服务端进行升级,包括 JournalNode,NameNode,ZKFC,DataNode 组件。Client 端受到 Spark,Hive,Flink 等等很多组件依赖,目前这些组件还不支持 Hadoop3,因此 Client 版本暂时保持不变。

98f80eda48153653958688abe29e67ae.png

3.

解决滚动升级中遇到的问题


滚动升级的操作流程在 Hadoop 官方升级文档中有介绍,概括起来大致步骤如下:

1.JournalNode 升级,使用新版本依次重启 JournalNode
2. NameNode 升级
2.1升级准备,生成 fallback fsimage 文件
2. 2使用新版本 Hadoop 重启 Standby NameNode,重启 ZKFC
2.3做 failover,使升级后的 NameNode 变成 Active 节点
2.4使用新版本 Hadoop 重启另一个 NameNode,重启 ZKFC
3.升级 DataNode,使用新版本 Hadoop 重启所有 DataNode 节点
4.做 Finalize,确认集群变更到3.2

在测试环境验证 HDFS 滚动升级方案时,升级和降级过程中都遇到了一些问题。

在滚动升级中,当 Active NameNode 为3.2版本,Standby NameNode 为2.7版本时,会出现 EditLog 不兼容问题。此时,Active NameNode 写 EditLog 时会将 EC 相关的结构写入到 EditLog 当中,当 Standby NameNode 读取 EditLog 时,会出现识别不了的情况,导致 Standby NameNode 直接 Shutdown。我们的解决方案是,考虑当前有效版本是否支持 EC,如果支持 EC 则会写入 EC 信息到 EditLog,否则不会写入。而在升级过程中,有效版本实际上还是2.7,是不支持 EC 的,这个时候忽略 EC 即可,这样 Standby NameNode 读取 EditLog 做合并时,不会出现 EC 相关信息,可正常工作。解决问题的 ISSUE 为 HDFS-13596。

在滚动降级中,当3.2版本的 NameNode 使用3.2版本 Hadoop 重启时,如果当前最新的 Fsimage 是3.2版本 NameNode 产生的,则2.7版本 Hadoop 重启 NameNode 会直接 Shutdown,原因是,3.2版本 Haodop 产生的 Fsimage 文件,2.7版本的 Hadoop 无法进行加载,这将导致如果升级中遇到问题想回滚的话,无法完成回滚操作。经过深入分析,我们发现有两个问题会导致这种情况出现。

第一个问题,Fsimage 的不兼容是由于3.2版本的 NameNode 将 EC 信息写入到了 Fsimage 当中,2.7版本的 Hadoop 无法识别 EC 信息,导致失败。解决方案与上面类似,在保存 Fsimage 时考虑当前的有效版本,如果不支持 EC 则不会将 EC 信息写入到 Fsimage 文件中。解决问题的 ISSUE 为 HDFS-14396。

第二个问题,由于 NameNode 对 StringTable 的修改导致了 Fsimage 的不兼容,目前该问题可以通过回滚 commit 进行解决,社区反馈修复也不是很必要,可以通过先升级到无该 commit 的版本,滚动升级稳定后,直接进行小版本升级,跨过这个不兼容特性。记录 ISSUE 为 HDFS-14831。

由于滴滴使用的是内部的用户名密码认证机制,社区出现的一个问题我们没有遇到, ISSUE 为 HDFS-14509 ,升级过程中 NameNode 和 DataNode 由于数据结构的变化,生成了不同的 password,导致无法认证,读写数据会失败。该 ISSUE 记录了这个问题,需要先升级到 2.x 的最新版本进行过度,之后才能滚动升级到 3.x 版本。

总结起来,需要做 HDFS2.x 到 3.x 的滚动升级,需要关注这些 ISSUE,HDFS-13596,HDFS-14396,HDFS-14831,HDFS-14509。

4.

测试与上线


从19年初开始关注 HDFS 滚动升级,在解决遇到的已知问题之后,开发与测试不断讨论升级方案,将可能遇到的风险进行总结。

在这个过程中,我们详细阅读分析了滚动升级的源码,确定升级中 NameNode,DataNode 会做哪些动作,以明确风险点。同时我们还分析了从2.7到3.2版本引入的关于 HDFS 的4000左右的 Patch ,找出可能存在兼容性问题的点,进行深入地分析。同时我们对3.2中新引入的 Feature 也进行了分析,以确保新功能对升级没有影响。种种总结、分析、测试相关的工作,我们写了四五十篇的 WIKI 文档进行记录。在测试环境中升级步骤进行了数次演练,确认没问题之后,我们开始了升级之路。相关的具体里程碑上线过程如下:

1.19年5月左右,升级演练多次,准备全量 Hadoop、Hive、Spark Case 进行测试,确定方案没有问题2.19年7月左右,离线小集群1(百台)升级到3.2版本,用户未受到影响。3.19年10月左右,离线小集群2(数百台)升级到3.2版本,用户未受到影响。4.19年11月底,离线大集群(数千台)升级到3.2版本,用户未受到影响.

升级过程中,DataNode 在删除 Block 时,是不会真的将 Block 删除的,而是先将Block 文件放到一个 Trash 目录中,为了能够使用原来的 FallBack Fsimage 恢复以前的数据。当升级周期比较长时,Trash 中的数据就会很多,例如我们这边大集群升级周期就有3周之长。升级操作在短时间之内,是可以确定是否有问题的,并且三周之后也不可能真的回滚到以前的数据,倘若真的遇到问题,是需要及时修复的。我们开发了额外的工具,对 Trash 中的 Block 文件进行按天归档,设置好保留时间,例如设置1天。我们会每天例行将1天之前的数据进行删除,这样可以大大减少 DataNode 上磁盘的存储压力。

升级之后,我们对各个集群进行都进行自己观察,目前服务一切正常。

5.


非常高兴在如此大规模的集群上完成从2.7到3.2的滚动升级,走在了行业的前列。HDFS 升级过程漫长,但是收益是非常多的。在此基础上,我们可以继续做非常有意义的工作,持续在稳定性、性能、成本等多个方面深入探索,使用技术为公司创造可见的价值。

bd4467167a45aa5a450c8d8239b8d981.png

本文作者

费辉|滴滴 | 大数据架构技术专家滴滴出行大数据架构技术专家,负责离线存储。在加入滴滴之前,曾在阿里巴巴参与过JVM和EMR产品的开发。开源大数据爱好者,积极参与社区的交流讨论,Hadoop/Hive/Tez 社区贡献者。猜你喜欢

1、过往记忆大数据,2019年原创精选69篇

2、盘点2019年晋升为Apache TLP以及进去Apache孵化器的大数据相关项目

3、字节跳动 EB 级 HDFS 实践

4、深入学习 Redis 集群搭建方案及实现原理

75c4eaafcb95b58c51d29d3be1cccde8.png

过往记忆大数据微信群,请添加微信:fangzhen0219,备注【进群】

点一下你会更好看耶

cd0fa9d0ae9446e975dedc0266a68d79.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pcb只开窗不镀锡_案例图解射频PCB设计要点

在电子产品和设备中,电路板是一个不可缺少的部件,它起着电路系统的电气和机械等的连接作用。如何将电路中的元器件按照一定的要求,在PCB上排列组合起来,是PCB设计师的主要任务之一。布局设计不是简单的将元器件在PCB上排列起来&am…

HDFS Java API 实践

文章目录1. 启动 Hadoop 集群2. 使用 HDFS Shell3. 使用 HDFS Web UI4. 安装 Eclipse IDE4.1 上传文件4.2 查询文件位置4.3 创建目录4.4 读取文件内容4.5 写入文件1. 启动 Hadoop 集群 安装集群:https://michael.blog.csdn.net/article/details/114607857 启动命令…

python 一组数据 正态分布散点图_利用Python进行数据分析之多元线性回归案例

线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(自变量)来预测某个连续的数值变量(因变量)。例如,餐厅根据每天的营业数据(包括菜谱价格、就餐人数、预定人数、特价菜折扣…

php7 关联nginx,nginx+php7配合开发

1 源码安装php7下载php7./configure --eable fpm --prefix路径(指定路径,所有的文件会安装在这里。不然会文件会分散到别的地方)make & make install完成php的安装(如果想要按照php扩展可以用pecl命令或者phpize命令来按照)2 安装nginxyum install nginx开启ng…

python 量化交易_基于Python的量化交易工具清单(上)

—— Python量化工具清单 ——以下内容来源于Wilson Freitas的Github项目"Awesome Quant"。原文中包含了丰富的语言类别,但是后续介绍主要针对Python语言。原网址:https://github.com/ wilsonfreitas/awesome-quant基于Python的量化交易工具清…

jlist放jbutton 按钮事件失效_电动高处作业吊篮操作如何面对一些突发事件

电动吊篮从推广发展初期的不认识,不理解,不使用到今天在大中城市的建筑业中成了一种不可缺少的必备机具,在建筑工程施工技术工艺水平上和以往的脚手架相比,更是有一个空前的飞跃。正是由于电动吊篮加高方便、操作简单、安全可靠、…

LintCode MySQL 1968. 查询首两个字母在 ‘Db‘ 和 ‘Dy‘ 之间的课程名称(REGEXP正则)

文章目录1. 题目2. 解题1. 题目 描述 请编写 SQL 语句,查询 courses 表中,课程名首两个字母在 ‘Db’ 和 ‘Dy’ 之间所有课程的名称 https://www.lintcode.com/problem/1968 2. 解题 -- Write your SQL Query here -- -- example: SELECT * FROM XX_…

erp系统方案书_门禁系统方案书

门禁系统概述传统意义的门禁系统是由琐和钥匙构成,以钥匙代表着出入权限。但社会发展至今,以铁锁和钥匙为代表的传统房门管理方式正在逐渐消失,加上IC卡技术、数字技术、网络技术的应用日益成熟,管理安全、可靠、灵活、和方便的IC…

mybatisplus 操作另一个数据库的数据_MySQL的数据库操作详解

一、mysql查看数据库在 MySQL 中,可使用 SHOW DATABASES 语句来查看或显示当前用户权限范围以内的数据库。查看数据库的语法格式为:SHOW DATABASES [LIKE 数据库名];//例子SHOW DATABASES;SHOW DATABASES like mynews;show databases like %name%;语法说…

LeetCode 385. 迷你语法分析器(栈)

文章目录1. 题目2. 解题1. 题目 给定一个用字符串表示的整数的嵌套列表,实现一个解析它的语法分析器。 列表中的每个元素只可能是整数或整数嵌套列表 提示:你可以假定这些字符串都是格式良好的: 字符串非空 字符串不包含空格 字符串只包含…

php unicode 插入 mysql_关于MySQL的一些骚操作——提升正确性,抠点性能

推荐阅读:我凭借这份pdf拿下了蚂蚁金服、字节跳动、小米等大厂的offer概要回顾以前写的项目,发现在规范的时候,还是可以做点骚操作的。假使以后还有新的项目用到了MySQL,那么肯定是要实践一番的。为了准备,创建测试数据…

docker $PWD路径_Docker 技术系列之安装Redis单机版和集群版

欢迎关注刘哥讲技术。上一节我们讲到通过docker安装了多台的mysql,很简单,那么我们这一节,利用 Docker 在一台机器上部署多个 Redis 实例。那么redis是什么呢?Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持…

LeetCode 1191. K 次串联后最大子数组之和(前缀和+分类讨论)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 arr 和一个整数 k。 首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次。 举个例子,如果 arr [1, 2] 且 k 3,那么修改后的数组就是 [1, 2, 1, 2, 1, 2]。 然后&#x…

sql 拆分_实践参考:MySQL架构设计从开发规范、选型、拆分到减压实战指南

导引作者,李辉,原新浪爱彩票运维负责人,常用网名:门牙没了。曾主导新浪爱彩票的MySQL运维工作。培训合伙人、资深讲师,中国科学院大学在读研究生(大数据方向),擅长大型项目的关系型数据库运维和管理&#x…

PowerBuilder调用.Net编译好的DLL

[ComVisible(true)][ClassInterface(ClassInterfaceType.AutoDual)][ProgId("HelloWorld.MyClass")] //类名public class MyClass{public string UserName { get; set; } //对外提供属性public string SayHello(string content) //对外提供方法{return "用户:&q…

python中流程图_python用graphviz画流程图

问题描述 项目中需要用到流程图,如果用js的echarts处理,不同层级建动态计算位置比较复杂,考虑用python来实现 测试demo实现效果如下完整代码 import yaml import os import ibm_db from graphviz import Digraph from datetime import dateti…

天池 在线编程 牛郎织女(广度优先搜索)

文章目录1. 题目2. 解题1. 题目 描述 又到了七夕节,牛郎织女相约一起去一个n*m大小的迷宫maze里玩耍。 然而没过多久,他们就倒霉地走散了。 现在给定由.,*,S,T组成的矩阵maze, 其中.表示空地,*表示障碍物,S表示牛郎的位置 ,T表示织女的位置&…

BZOJ 1001 狼捉兔子

Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点…

可视化工具Navicat for MySQL-操作三

五、备份和还原MySQL数据库 在数据库的管理中,备份和还原是必须做认真做的事情,如果疏忽或者做粗糙了,那么一旦数据库故障后果不堪设想,所以Navicat同样也有备份和还原的功能,相比较创建功能,其备份功能则…

如何在python中打开文件_Python文件处理:创建、打开、追加、读、写

在Python中,不需要导入外部库来读取和写入文件。Python为创建、写入和读取文件提供了内置的函数。 在本文中,我们将学习 如何创建文本文件 如何将数据附加到文件中 如何读取文件 如何逐行读取文件 Python中的文件模式 如何创建文本文件 使用Python&#…