与kylin_Kylin 迁移到 HBase 实践在小米的实践

背景小米Kylin生产环境部署的是基于社区2.5.2修改的内部版本,所依赖HBase集群是一个公共集群,小米内部很多离线计算服务共享使用该HBase集群。由于Kylin已经产生超过6000张HBase表,给HBase的metadata管理造成了不小的压力,HBase metadata节点异常恢复的速度也受到极大的影响。随着业务的增长,Kylin HBase表继续快速增长,HBase集群的运维压力也越来越大。为了应对快速增长的业务需求,我们决定将Kylin使用的HBase集群独立运维。同时,公共集群的HBase是基于社区0.98.11的小米内部版本,版本较旧。在集群独立过程中,HBase团队推荐使用最新基于社区2.2.0的小米内部版本 ,升级后HBase对超大metadata的管理也更友好。目标与挑战小米Kylin生产环境上运行着超过50个项目、300多个cube,服务于很多在线的BI或报表系统。本次升级希望尽量减小对业务的影响:
  1. 迁移数据和切换集群期间,查询服务不中断;
  2. 项目、数据模型和cube的新增、更改、发起构建、发起合并等操作不受影响;
  3. 数据构建任务可延后调度,但不能超过天级别;
Kylin存储在HBase中的数据主要有两类:Kylin metadata(元数据)、Cube预计算数据。元数据中存储着所有的用户、项目和数据模型的信息;数据模型对应的结果数据表;数据任务的执行参数、状态和日志;查询使用的词典等重要信息。由于我们接入了很多自动化BI系统,这部分信息随时在变化。Cube预计算数据是查询使用的结果数据,每一个segment对应着一张数据表,预计算的数据表生成之后不会变化。我们虽然可以通过HBase snapshot复制后在新集群restore的方式将数据复制到新的集群,但是由于生产环境的Kylin中的数据表比较多,且以每天400张的速度不断生成(注:因为有合并和过期删除策略,每天数据表的增加数量要少于400)。新的数据表生成后会在metadata中标记为可查询,若此时数据表的同步未完成,就会导致查询失败。我们面对挑战是如何保障数据迁移的过程中的服务可用性:
  1. Kylin metadata不断变化,Cube预计算数据存量巨大且在持续增加;
  2. metadata可以做到秒级别同步,Cube预计算数据只能做到天级别(存量)和小时级别(增量)的同步;
  3. metadata新旧集群保证一致,Cube预计算数据迁移过程中保障可用;
如下图所示:c180bcf96e11b2dba0080ca00a802bc7.png图1-通常方案的问题迁移方案因为我们维护了基于Kylin-2.5.2的内部版本,希望通过修改代码实现平滑迁移,其关键点是:
  1. 通过HBase replication保证新旧集群Kylin metadata的数据同步
Kylin的meta信息存储在HBase的kylin_metadata表中,两个集群的此表保持同步更新。
  1. Kylin支持连接多个HBase集群
查询时如果在首选HBase中找不到需要的HTable,则回退到备选HBase集群。(已提交社区:KYLIN-4175)
  1. 任务调度支持安全模式
安全模式下,用户可继续提交构建任务,且已在调度中的任务可以继续执行,但新提交的任务暂缓调度。(已提交社区:KYLIN-4178)迁移示意图如下:ca1a4c6a418d3ad8b1a864ef5d4e527d.png图2-支持secondary HBase方案除了上述关键点,还需要注意一些细节问题。1. 超大metadata的数据迁移超过阈值(默认为10MB)的metadata存储在HBase依赖的HDFS上,需要手动迁移这部分数据。我们通过Hadoop distcp来迁移此部分数据。2. coprocessor的更新Kylin使用了HBase的coprocessor机制,在执行查询的时候扫描HBase的数据。起初我们认为可以使用兼容HBase 0.98和2.2的coprocessor,实际测试中发现需要更新为支持HBase2.2的coprocessor。Kylin提供了工具来进行批量的更新。构建基于HBase 2.2的Kylin,需要基于社区的2.5.x-hadoop3.1或2.6.x-hadoop3.1分支。我们选择从Hadoop3.1的分支上移植相关特性。相关的JIRA有:KYLIN-2565、KYLIN-3518

>>>>

迁移步骤

具体迁移步骤如下:
  • HBase团队搭建好基于HBase 2.2的独立HBase集群
  • HBase团队添加新老集群kylin_metadata表的异步replication;
  • HBase团队通过snapshot + restore同步HBase其他表,并更新coprocessor;
  • 在测试节点上回放生产环境查询请求,验证新集群HBase数据表可正常提供查询;
  • 开启JobServer的安全模式,禁用新的任务调度;
  • 滚动升级QueryServer,切换至兼容新旧HBase;
  • 等待安全模式下所有任务运行完成,切换JobServer至新HBase并关闭安全模式;
  • 等待表全部迁移完成,使用KylinHealthCheck工具检查HBase表,确认所有在用cube segment对应的HBase表存在;
  • 检查确认后,从Kylin去除旧HBase集群配置;
  • 旧HBase集群数据保留一段时间,最后清理删除。
问题&解决在演练和执行的过程中,我们遇到了如下的一些问题:

>>>>

Kylin metadata的一致性验证

Metadata作为最重要的HBase表,影响着Kylin的主要功能。虽然有HBase replication来保证数据同步,也最好双重确认来保障服务可用性。我们在Kylin中开发了一个脚本来批量对比两个meta表,通过扫描meta表所有的键值和时间戳来发现差异。在初期确实发现了差异,也依此来修正了replication的配置。在HBase团队的协助下,该表做到了实时的同步。

>>>>

新HBase数据表的可用性验证

为了验证新集群的数据可用性,我们启动了一个测试的Kylin实例用以模拟兼容多个HBase集群的查询。测试实例不直接对用户服务,而是通过回放SQL query来进行可用性测试。回放测试自动验证查询是否正常返回。这种测试方式弥补了回归测试用例覆盖范围的不足,通过测试我们确实发现了隐藏的问题并进行了修复。在生产环境的切换中,未发生新的问题。

>>>>

HBase2 protobuf变更带来的影响

测试中发现,若HBase返回数据量较大时会查询报错,提示消息的长度超过限制:InvalidProtocolBufferException:Protocol message was too large. May be malicious.在查询时,HBase和Kylin之间的数据发送通过protobuf序列化。HBase 2修改了返回数据的方式,从一次性返回变成了流式的返回,从而触发了protobuf的长度检查逻辑。这个长度在protobuf 3之前的版本被限制为64M,支持通过setSizeLimit()方法来修改。实际上,大多数Hadoop项目都会使用shaded protobuf并修改这个限制。由于Kylin项目中未使用自己打包的protobuf,因此这里需要通过接口修改长度限制。相关讨论见:KYLIN-3973。

>>>>

HBase写大文件的异常

当Cube的预计算结果数据量比较大,单HBase region的文件大小超过配置的阈值时,向HBase 2.2写文件会造成海量的小文件。这一步发生在将计算的结果转换为HFile时,此步骤的任务执行时间也比较长。这是由HBase 2.2的BUG导致,HBase的修复方案已合入最新分支。可以移植该patch以解决问题,也修改配置hbase.hregion.max.filesize来解决。相关讨论见:HBASE-22887、KYLIN-4292、KYLIN-4293。

>>>>

部分数据构建任务失败

迁移过程中有两种数据构建任务的失败:包更新导致的失败、segment合并的失败。由于Kylin的任务机制,在提交任务的时候就已经指定了使用的jar包的绝对路径。如果Kylin的依赖升级后,jar包版本号发生了变化,就会导致执行异常。社区版本尚未修复,可以通过保留原来版本的文件来避免该问题。相关讨论见:KYLIN-4268。另外,多集群的HBase配置仅支持了查询引擎,在合并最新生成的HBase表时会出现异常。我们认为segment合并可以接受一定时间的延迟,在HBase表同步完成后再触发相关合并操作即可。总结与展望本次Kylin的HBase跨集群迁移和版本升级的挑战点是如何保证对用户的影响最小。迁移的重点是设计一个高效迁移方案、保证迁移过程的数据一致性和正确性、保证测试方案的完整覆盖,同时需要设计执行过程中的异常情况的判定和处理机制。最后的Kylin滚动升级过程耗时2小时,也就意味着用户作业的调度延后为2小时。基于前期的大量工作,最终实现了对业务的影响最小。我们在维护的内部版本的基础上,通过技术修改优雅解决问题,相关成果也反馈给社区。>>>>

后续改进

目前使用HBase作为Kylin的预计算结果存储有着诸多问题。除了本文提到的海量表,还包括不支持第二索引、查询引擎无法分布式、扫描表的数据量和时间存在限制等问题,这些都限制了Kylin的能力。社区正在实现Kylin on Parquet的方案,数据存储使用Parquet,查询引擎使用SparkSQL,此方案能够极大的提升Kylin的能力。我们期待该方案的落地,也会积极的参与相关讨论、开发和测试。致谢感谢HBase团队同学在迁移期间的给力支持!关于我们小米云平台计算平台团队,负责为小米集团各业务线提供高品质的弹性调度和计算服务。包括离线平台(Spark,Hadoop Yarn,Kylin,Doris等),流式平台(Kafka,Flink及自研Talos等),弹性平台(Docker,Kubernetes等)。武汉团队主要负责Kylin、Druid等OLAP引擎开发。4ef493799ba058cf3f85da3ceeed1520.png

we want you

北京武汉均有职位,欢迎优秀的你加入~

联系方式:computing-hr@xiaomi.com

参考资料[1] Apache Kylin跨机房迁移实战 https://blog.bcmeng.com/post/kylin-migrate.html[2] KYLIN-4175: Support secondary hbase storage config for hbase cluster migration https://issues.apache.org/jira/browse/KYLIN-4175[3] KYLIN-4178: Job scheduler support safe mode https://issues.apache.org/jira/browse/KYLIN-4178[4] KYLIN-3973: InvalidProtocolBufferException: Protocol message was too large. May be malicious. https://issues.apache.org/jira/browse/KYLIN-3973[5] KYLIN-3997: Add a health check job of Kylin https://issues.apache.org/jira/browse/KYLIN-3997[6] KYLIN-4268: build job failed caused by hadoop utils update https://issues.apache.org/jira/browse/KYLIN-4268[7] HBASE-22887: HFileOutputFormat2 split a lot of HFile by roll once per rowkey https://issues.apache.org/jira/browse/HBASE-22887[8] KYLIN-4293: Backport HBASE-22887 to Kylin HFileOutputFormat3 https://issues.apache.org/jira/browse/KYLIN-4293[9] [DISCUSS] Columnar storage engine for Apache Kylin: http://apache-kylin.74782.x6.nabble.com/DISCUSS-Columnar-storage-engine-for-Apache-Kylin-td11821.html猜你喜欢

1、Delta Lake 0.5.0 正式发布,支持包括 Hive/Presto 等多种查询引擎

2、当小内存遇上大量数据,你该怎么解决这个问题?

3、从 Hive 大规模迁移作业到 Spark 在有赞的实践

4、Docker 核心技术与实现原理

3957dc45d523d2322f11c9a62e651e3f.png

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

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

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

相关文章

LeetCode 1227. 飞机座位分配概率(DP+数学归纳法)

1. 题目 有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。 剩下的乘客将会: 如果他们自己的座位还空着,就坐到自己的座位上, 当他们自己的座位被占用时,随机选择…

LeetCode 1025. 除数博弈(动态规划)

1. 题目 爱丽丝和鲍勃一起玩游戏&#xff0c;他们轮流行动。爱丽丝先手开局。 最初&#xff0c;黑板上有一个数字 N 。在每个玩家的回合&#xff0c;玩家需要执行以下操作&#xff1a; 选出任一 x&#xff0c;满足 0 < x < N 且 N % x 0 。用 N - x 替换黑板上的数字…

BN / LN / IN / GN /

链接 但是代码不敢苟同! 所以自己写了两种代码! 由于这只是测试, 并不是用来训练, 所以α和β参数就没有加! def BN(inputs):c inputs.shape[1]for i in range(c):channel inputs[:,i,:,:]mu np.mean(channel)var np.var(channel)channel_new ((channel - mu)/(np.sqrt(…

中文验证码 php_还在苦恼验证码怎么实现?看看这个验证码组件合集,你想要的都有...

随着安全性的要求越来越高&#xff0c;如今的验证码已经不再是简单的四个数字或者字母了&#xff0c;更复杂的图形验证码和行为验证码已经成为了更流行的趋势&#xff0c;但更难的实现也让很多开发者头秃&#xff0c;Gitee 已经替你们想到了这一点。不多说了&#xff0c;下面这…

reload端口 tomcat_tomcat上部署网站的三种方式

一、利用webapps文件夹自动部署这是最简单的方式&#xff0c;只要将网站直接拷贝到&#xff1a;tomcat根目录下的webapps文件夹里举例&#xff1a;helloworld文件夹下创建里index.html文件&#xff0c;然后把helloworld文件夹移动到tomcat根目录下webapps文件夹里&#xff0c;重…

不能用蛮力法解决的问题_溆浦事蒙汉:脱贫攻坚绝不能心浮气躁骄傲自满疲倦厌战...

脱贫攻坚绝不能心浮气躁骄傲自满疲倦厌战——蒙汉到卢峰镇检查“四支队伍”集村部工作情况检查南华山村“四支队伍”集村部工作情况与大潭村贫困户舒采米座谈红网溆浦讯(记者 伍交才)8月28日&#xff0c;市人大常委会副主任、县委书记蒙汉到卢峰镇南华山村、大潭村检查“四支队…

mock模拟接口测试 vue_vue+mock.js实现前后端分离

之前都是介绍在普通项目中使用mock.js&#xff0c;那么本次就来介绍一下在vue中使用mock.js实现前后端分离。安装&#xff1a;npm install mockjs这里先写个小案例介绍一下具体使用&#xff0c;写法不规范&#xff0c;仅供参考。然后案例讲完后我们讲具体的规范使用那么一起来看…

mysql slow log 分析工具_mysql slow log分析工具的比较

mysql 中的 slow log 是用来记录执行时间较长(超过 long_query_time 秒)的 sql 的一种日志工具。启用 slow log在 my.cnf 中设置[mysqld]slow_query_logonslow_query_log_filemysql-slow重启 MySQL 服务。五款常用工具mysqldumpslowmysqlslamyprofimysql-explain-slow-logmysql…

利用寄存器进入栈值交换

代码 varA, B: Word;beginA :1; B :2; asmmov ax, a //赋值 mov bx, b push ax //进栈 push bx pop ax //退栈 pop bx mov a, ax //利用栈先进后出, ax已退栈, 寄存器里的值为原bx 的值 mov b, bx //利用栈先进后出, bx已退栈, 寄存…

处理Excel,填充空白区域

在企业应用开发中经常是业务人员提供Excel的数据源&#xff0c;而开发人员将Excel数据导入到数据库中&#xff0c;然后在数据库中进行处理。在Excel中为了表示一种层次和所属关系&#xff0c;很多时候会产生很多空白的单元格。比如一个CRM数据&#xff0c;里面有销售团队、销售…

LeetCode 901. 股票价格跨度(单调栈)

1. 题目 编写一个 StockSpanner 类&#xff0c;它收集某些股票的每日报价&#xff0c;并返回该股票当日价格的跨度。 今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数&#xff08;从今天开始往回数&#xff0c;包括今天&#xff09;。 例如&#xff0c…

LeetCode 1300. 转变数组后最接近目标值的数组和(二分查找)

1. 题目 给你一个整数数组 arr 和一个目标值 target &#xff0c;请你返回一个整数 value &#xff0c; 使得将数组中所有大于 value 的值变成 value 后&#xff0c;数组的和 最接近 target &#xff08;最接近表示两者之差的绝对值最小&#xff09;。 如果有多种使得和最接近…

潜在语义分析(Latent Semantic Analysis,LSA)

文章目录1. 单词向量空间、话题向量空间1.1 单词向量空间1.2 话题向量空间2. 潜在语义分析算法2.1 例子3. 非负矩阵分解算法4. TruncatedSVD 潜在语义分析实践一种无监督学习方法&#xff0c;主要用于文本的话题分析其特点是通过矩阵分解发现文本与单词之间的基于话题的语义关系…

python分割提取字符串_Python 字符串操作(截取/替换/查找/分割)

python字符串连接先介绍下效率比较低的&#xff0c;有些新手朋友就会犯这个错误&#xff1a;a [a,b,c,d]content for i in a:content content iprint content说下为什么效率会低呢&#xff1f;原因&#xff1a;在循环连接字符串的时候&#xff0c;他每次连接一次&#xff0…

R语言chorolayer_R语言空间可视化:绘制英国脱欧投票地图

添加法国&#xff0c;它位于右下方&#xff0c;因此我们应该看到一点…plot(FR,addTRUE)然后&#xff0c;我们可以检索英国退欧公投数据referendumddply(referendum,.(Region,HASC_code),summarise,Remainsum(Remain),Leavesum(Leave))我们可以发现&#xff0c;脱欧赢得了51.89…

概率潜在语义分析(Probabilistic Latent Semantic Analysis,PLSA)

文章目录1. 概率潜在语义分析模型1.1 基本想法1.2 生成模型1.3 共现模型1.4 模型性质2. 概率潜在语义分析的算法概率潜在语义分析&#xff08;probabilistic latent semantic analysis&#xff0c;PLSA&#xff09;&#xff0c;也称概率潜在语义索引&#xff08;probabilistic …

马尔可夫链蒙特卡罗法(Markov Chain Monte Carlo,MCMC)

文章目录1. 蒙特卡罗法2. 马尔可夫链3. 马尔可夫链蒙特卡罗法4. Metropolis-Hastings 算法5. 吉布斯抽样蒙特卡罗法&#xff08;Monte Carlo method&#xff09;&#xff0c;也称为统计模拟方法&#xff08;statistical simulation method&#xff09;&#xff0c;是通过从概率…

蒙特卡罗法近似求解圆周率π

文章目录1. 原理2. 模拟代码1. 原理 给出 x∈[0,1),y∈[0,1)x \in [0,1),y\in[0,1)x∈[0,1),y∈[0,1) 的均匀分布随机点&#xff0c;模拟 ttt 次&#xff0c;落在以 (0,0)(0,0)(0,0) 为圆心&#xff0c;半径 r1r1r1 的圆以内的次数为 ccc当模拟次数足够大时&#xff0c;可以看成…

算法导论2.3-7

Q: 请给出一个运行时间为θ(nlgn)的算法&#xff0c;使之能在一个由n个整数构成的集合S和另一个整数X时&#xff0c;判断出S中是否存在有两个其和等于X的元素。A: 先对S[1 TO N]进行合并排序--------------------------------θ(nlgn) FOR a <- [1 TO N-1]-----------------…

LeetCode 1318. 或运算的最小翻转次数(位运算)

1. 题目 给你三个正整数 a、b 和 c。 你可以对 a 和 b 的二进制表示进行位翻转操作&#xff0c;返回能够使按位或运算 a OR b c 成立的最小翻转次数。 「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。 示例 1&#xff1a; 输入&#x…