有赞是一家商家服务公司,向商家提供强大的基于社交网络的,全渠道经营的 SaaS 系统和一体化新零售解决方案。随着近年来社交电商的火爆,有赞大数据集群一直处于快速增长的状态。在 2019 年下半年,原有云厂商的机房已经不能满足未来几年的持续扩容的需要,同时考虑到提升机器扩容的效率(减少等待机器到位的时间)以及支持弹性伸缩容的能力,我们决定将大数据离线 Hadoop 集群整体迁移到其他云厂商。
在迁移前我们的离线集群规模已经达到 200+ 物理机器,每天 40000+ 调度任务,本次迁移的目标如下:
上文说了 Hadoop 集群迁移的背景和目的,我们回过头来再看下目前有赞大数据离线平台整体的技术架构,如图1.1所示,从低往上看依次包括:
图1.1 有赞大数据离线平台的技术架构
本次迁移会涉及到从底层基础设施到上层平台各个层面的工作。
在开始迁移之前,我们调研了业界在迁移 Hadoop 集群时,常用的几种方案:
两个机房公用一个 Hadoop 集群(同一个Active NameNode,DataNode节点进行双机房部署),具体来讲有两种实现方式:
优点:
缺点:
在新机房搭建一套新的 Hadoop 集群,第一次将全量 HDFS 数据通过 Distcp 拷贝到新集群,之后保证增量的数据拷贝直至两边的数据完全一致,完成切换并把老的集群下线,如图2.2所示。
这种场景也有两种不同的实施方式:
图2.2 多集群迁移方案
优点:
缺点:
从用户感知透明度来考虑,我们肯定会优先考虑单集群方案,因为单集群在迁移过程中,能做到基本对用户无感知的状态,但是考虑到如下几个方面的因素,我们最终还是选择了多集群方案:
因此我们通过评估,最终采用了方案 D。
在方案确定后,我们便开始了有条不紊的迁移工作,整体的流程如图3.1所示
图3.1 离线Hadoop多集群跨机房迁移流程图
上述迁移流程中,核心要解决几个问题:
首先我们在新机房搭建了一套 Hadoop 集群,在进行了性能压测和容量评估后,使用DistCp工具在老集群资源相对空闲的时间段做了 HDFS 数据的全量复制,此次复制 HDFS 数据时新集群只开启了单副本,整个全量同步持续了两周。基于 DistCp 本身的特性(带宽限制:-bandwidth / 基于修改时间和大小的比较和更新:-update)较好的满足全量数据复制以及后续的增量更新的需求。
目前有赞所有的大数据离线任务都是通过 DP 平台来开发和调度的,由于底层采用了两套 Hadoop 集群的方案,所以迁移的核心工作变成了怎么把 DP 平台上任务迁移到新集群。
有赞的 DP 平台是提供用户大数据离线开发所需的环境、工具以及数据的一站式平台(更详细的介绍请参考另一篇博客),目前支持的任务主要包括:
本次由于采用多集群跨机房迁移方案(两个 Hadoop 集群),因此需要在新旧两个机房搭建两套 DP 平台,同时由于迁移周期比较长(几个月)且用户迁移的时间节奏不一样,因此会出现部分任务先迁完,部分任务还在双跑,还有一些任务没开始迁移的情况。
在新旧两套 DP 平台都允许用户创建和更新任务的前提下,如何保证两边任务状态一致呢(任务状态不限于MySQL的数据、Gitlab的调度文件等,因此不能简单使用MySQL自带的主从复制功能)?我们采取的方案是通过事件机制来实现任务操作时间的重放,展开来讲:
DP 底层的改造对用户来说是透明的,最终暴露给用户的仅是一个迁移界面,每个工作流的迁移动作由用户来触发。工作流的迁移分为两个阶段:双跑和全部迁移,状态流转如图 3.3 所示
图 3.3 工作流迁移状态流转
工作流的初始状态为未迁移,然后用户点击迁移按钮,会弹出迁移界面,如图 3.4 所示,用户可以指定工作流的任意子任务的运行方式,主要选项如下:
图 3.4 工作流点击迁移时,弹框提示选择子任务需要运行的方式
不同类型的子任务建议的运行方式如下:
双跑期间的数据流向如下图 3.5 所示:
图 3.5 DP 任务双跑期间数据流向
由于某个工作流迁移的持续时间可能会比较长(比如DW层任务需要等到所有DM层任务全部迁移完),因此我们既要保证在迁移期间工作流可以继续开发,同时也要做好预防误操作的限制,具体规则如下:
工具都已经开发好了,接下来就是推动 DP 上的业务方进行迁移,DP 上任务数量大、种类多、依赖复杂,推动业务方需要一定的策略和顺序。有赞的数据仓库设计是有一定规范的,所以我们可以按照任务依赖的上下游关系进行推动:
工具已经开发好,迁移计划也已经确定,是不是可以让业务进行迁移了呢?慢着,我们还少了一个很重要的环节,如何保证迁移的稳定呢?在迁移期间一旦出现 bug 那必将是一个很严重的故障。因此如何保证迁移的稳定性也是需要着重考虑的,经过仔细思考我们发现问题可以分为三类,迁移工具的稳定,数据一致性和快速回滚。
Hive 表数据一致性指的是,双跑任务产出的 Hive 表数据,如何检查数据一致性以及识别出来不一致的数据的内容,具体方案如下(如图3.6所示):
本次的大数据离线集群跨机房迁移工作,时间跨度近6个月(包括4个月的准备工作和2个月的迁移),涉及PB+的数据量和4万日均调度任务。虽然整个过程比较复杂(体现在涉及的组件众多、任务种类和实现复杂、时间跨度长和参与人员众多),但通过前期的充分调研和探讨、中期的良好迁移工具设计、后期的可控推进和问题修复,我们做到了整体比较平稳的推进和落地。同时针对迁移过程中遇到的问题,在后续的类似工作中我们可以做的更好:
Github地址:https://github.com/NetEase/hive-tools
在网易集团内部有大大小小几百套 hive 集群,为了满足网易猛犸大数据平台的元数据统一管理的需求,我们需要将多个分别独立的 hive 集群的元数据信息进行合并,但是不需要移动 HDFS 中的数据文件,比如可以将 hive2、hive3、hive4 的元数据全部合并到 hive1 的元数据 Mysql 中,然后就可以在 hive1 中处理 hive2、hive3、hive4 中的数据。
我们首先想到的是 hive 中有自带的 EXPORT 命令,可以把指定库表的数据和元数据导出到本地或者 HDFS 目录中,再通过 IMPORT 命令将元数据和数据文件导入新的 hive 仓库中,但是存在以下问题不符合我们的场景
于是我们便考虑自己开发一个 hive 元数据迁移合并工具,满足我们的以下需求:
hive 的元数据信息(metastore)一般是通过 Mysql 数据库进行存储的,在 hive-1.2.1 版本中元数据信息有 54 张表进行了存储,比如存储了数据库名称的表 DBS
、存储表名称的表 TBLS
、分区信息的 PARTITIONS
等等。
元数据信息的这 54 张表通过 ID
号形成的很强的主外健依赖关系,例如
DBS
表中的 DB_ID
字段被 20 多张表作为外健进行了引用;TBLS
表中的 TBL_ID
字段被 20 多张表作为外健进行了引用;TBLS
表中的 DB_ID
字段是 DBS
表的外健、SD_ID
字段是 SDS
表的外健;PARTITIONS
表中的 TBL_ID
字段是 TBLS
表的外健、SD_ID
字段是 SDS
表的外健;DATABASE_PARAMS
表中的 DB_ID
字段是 DBS
表的外健;这样的嵌套让表与表之间的关系表现为 [DBS]=>[TBLS]=>[PARTITIONS]=>[PARTITION_KEY_VALS],像这样具有 5 层以上嵌套关系的有4-5 套,这为元数据合并带来了如下问题。
我们使用了一个巧妙的方法来解决 ID 修改的问题:
我们使用了 mybatis 进行了源和目标这 2 个 Mysql 的数据库操作,从源 Mysql 中按照上面的逻辑关系取出元数据修改主外健的 ID 号再插入到目标 Mysql 数据库中。
druid
解析 hive 的建表语句,再通过 codemodel
自动生成出了对应每个表的 54 个 JAVA 类对象。参见代码:com.netease.hivetools.apps.SchemaToMetaBean
第一步:备份元数据迁移前的目标和源数据库
第二步:将源数据库的元数据导入到临时数据库 exchange_db 中,需要一个临时数据库是因为源数据库的 hive 集群仍然在提供在线服务,元数据表的 ID 流水号仍然在变化,hive-tools 工具只支持目的数据库是在线状态;
通过临时数据库 exchange_db 能够删除多余 hive db 的目的,还能够通过固定的数据库名称,规范整个元数据迁移操作流程,减低因为手工修改执行命令参数导致出错的概率
在 hive-tools.properties 文件中配置源和目的数据库的 JDBC 配置项
# exchange_db
exchange_db.jdbc.driverClassName=com.mysql.jdbc.Driver
exchange_db.jdbc.url=jdbc:mysql://10.172.121.126:3306/hivecluster1?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
exchange_db.jdbc.username=src_hive
exchange_db.jdbc.password=abcdefg
# dest_hive
dest_hive.jdbc.driverClassName=com.mysql.jdbc.Driver
dest_hive.jdbc.url=jdbc:mysql://10.172.121.126:3306/hivecluster1?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
dest_hive.jdbc.username=dest_hive
dest_hive.jdbc.password=abcdefg
执行元数据迁移命令
export SOURCE_NAME=exchange_db
export DEST_NAME=dest_hive
/home/hadoop/java-current/jre/bin/java -cp "./hive-tools-current.jar" com.netease.hivetools.apps.MetaDataMerge --s=$SOURCE_NAME --d=$DEST_NAME
hive-tools 会在迁移元数据之前首先检查源和目的元数据库中重名的 hive db,终止元数据迁移操作并给出提示
执行删除重名数据库命令
# 修改脚本中的 DEL_DB(多个库之间用逗号分割,default必须删除)参数和 DEL_TBL(为空则删除所有表)
export SOURCE=exchange_db
export DEL_DB=default,nisp_nhids,real,azkaban_autotest_db
export DEL_TBL=
~/java-current/jre/bin/java -cp "./hive-tools-current.jar" com.netease.hivetools.apps.DelMetaData --s=$SOURCE --d=$DEL_DB --t=$DEL_TBL
再次执行执行元数据迁移命令
检查元数据迁移命令窗口日志或文件日志,如果发现元数据合并出错,通过对目的数据库进行执行删除指定 hive db 的命令,将迁移过去的元数据进行删除,如果没有错误,通过 hive 客户端检查目的数据库中是否能够正常使用新迁移过来的元数据
严格按照我们的元数据迁移流程已经在网易集团内部通过 hive-tools 已经成功迁移合并了大量的 hive 元数据库,几乎没有出现过问题
mvn clean compile package -Dmaven.test.skip=true
Release Notes - Hive-tools - Version 0.1.4
[hive-tools-0.1.5]
MetaDataMerge add update SEQUENCE_TABLE NO
[hive-tools-0.1.4]
MetastoreChangelog -z=zkHost -c=changelog -d=database -t=table
thrift -gen java src/main/thrift/MetastoreUpdater.thrift
[hive-tools-0.1.3]
[hive-tools-0.1.2]
[hive-tools-0.1.1]
[hive-tools-0.1.0]
文章浏览阅读905次。*本文作者:yangyangwithgnu,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。在一次漏洞赏金活动中,挖掘到一个不标准的命令注入漏洞,我无法用命令分隔符、命令替换符注入新命令让系统执行,所以,从”型态”上讲,它不算是命令注入漏洞;但我又可以借助目标环境让载荷到达系统命令行,实现读写文件、执行新命令,所以,”神态”来看,..._获取据点 攻防沙盘演练
文章浏览阅读170次。GWT是Google Web Toolkit的缩写.是google为了开发ajax而做的一个框架.采用的概念是用java开发程序之后,用GWT转换成js和html.debug之类的也可以在java的IDE中调试。为java程序员开发ajax提供也方便。也给那些熟练c/s开发b/s人带来了惊喜。本文主要介绍用gwt编写一个hello world!准备工作:eclipse3.2 gwt安装GW..._gwt hello world
文章浏览阅读7.1k次。Uni-app的特点是使用Vue.js作为开发语言,可以在不同的移动端平台上共享组件库和业务逻辑代码,大大提高了开发效率和代码重用率。pages.json :文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。App.vue:是我们的跟组件,所有页面都是在App.vue下进行切换的,是页面入口文件,可以调用应用的生命周期函数。manifest.json :文件是应用的配置文件,用于指定应用的名称、图标、权限等。pages:所有的页面存放目录。_uniapp
文章浏览阅读8.4k次,点赞16次,收藏80次。以下的效果演示图,是关于快速移动光标、快速选择文字的功能,前期用了一点时间记这些快捷键,但时间久了,就像你去打一个字一样,不会去想这个字的拼音是什么了,换回来的是减少了来回切换鼠标、键盘的频率,个人觉得还是很值得一用的。Undo 操作可以撤销你的修改,如果你想反撤销,即还想要撤销前的内容,就要用到与 Undo 相反的功能 Redo 了,关键字:Redo、快捷键:Ctrl + Shift + Z。设置好书签后,按 Ctrl + 你设置的数字 就可以跳转了,注意数字是主键盘区的,不是右侧数字键区的。_idea快捷键大全最新
文章浏览阅读2.7w次。N.作为名词,是常见的“主题,题目,话题,学科,课程”, “绘画,摄影,被描绘对象,题材”,臣民(君主制)等adj. 可能受。。。影响,受……支配,取决于……Subject to ……E.G.:Flights are subject to delay because of the fog.取决于;视…而定:The article is ready to publish, subject to your approval.V.使臣服; 使顺从; (尤指)压服;The Roman Empire _suhject
文章浏览阅读1.2w次。**1、远程桌面连接**远程桌面连接(以前称为“终端服务客户端”)主要是用于对远程托管的服务器进行远程管理,使用非常方便,如同操作本地电脑一样方便,而远程桌面连接工具,我个人喜好IIS7。IIS7远程桌面管理工具(3389、vps、服务器批量管理、批量远程工具) 是一款绿色小巧,功能实用的远程桌面管理工具,其界面简洁,操作便捷,能够同时远程操作多台服务器,并且多台服务器间可以自由切换,适用于网...
文章浏览阅读276次。`class mask_rcnn_fcn_head_v1upXconvs_gn_adp_ff(nn.Module):“”“v1upXconvs design: X * (conv 3x3), convT 2x2, with GroupNorm”""def init(self, dim_in, roi_xform_func, spatial_scale, num_convs):super()...._roi xform
文章浏览阅读495次。UIPageControl 在页面下方显示一系列点,每个点对应一个页面UIPageControl : UIControl numberOfPages; // 用于设置总共有的页数,默认0 NSInteger currentPage; // 设置当前页,默认0 hidesForSinglePage; // bool值,如果只有一页是否隐藏指_deferscurrentpagedisplay
文章浏览阅读415次。方法一:在线安装 1.打开Help---MyEclipse Configuration Center。切换到SoftWare标签页。 2.点击Add Site 打开对话框,在对话框Name输入Svn,URL中输入:http://subclipse.tigris.org/update_1.6.x3.在左边栏中找到Personal Site中找到SVN展开。将Core SVNKit_myeclipse 集成安装svn
文章浏览阅读2.6k次,点赞2次,收藏25次。Wireshark是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。网络管理员使用Wireshark来检测网络问题,网络安全工程师使用Wireshark来检查资讯安全相关问题,开发者使用Wireshark来为新的通讯协定除错,普通使用者使用Wireshark来学习网络协定的相关知识。当然,有的人也会“居心叵测”的用它来寻找一些敏感信息……这儿就不多赘述了。如何安装选择自己电脑_1. wireshark的安装与使用 (1) 将实验文件wireshark-win64-3.2.2.exe复制到物理机
文章浏览阅读5.4k次,点赞6次,收藏81次。本系统由bootstrap,eclipse和Mysql共同开发完成。其主要功能根据角色大致可分为基于用户的登录注册,浏览菜品,添加修改购物车,查看以下单的订单信息,留言评论并查看所有人评论,查看并修改个人信息及密码等基于管理员的有添加和修改菜品,查看所有用户订单信息,查看并管理所有用户的评论,查看所用用户信息,管理个人管理员信息等1.数据库作为一个点餐管理系统,大致建表如图列数据这里贴出用户表的和购物车表的用户表购物车表2.前端前端重要运用bootstr..._1+xweb前端 点餐系统
文章浏览阅读2.9k次。hashMap 默认容量(capacity)是16当size的值超过75%的时候,就会进行扩容,capacity翻倍写了个小程序验证,代码如下:import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;public class HashMapTest { publ..._map的capacity