一、业务背景: 业务方需要搭建一套hbase集群,数据来源是hive表。 集群数据规模:每天4.5kw个key,420亿条左右数据,平均每个key每天1000个记录。每天总数据量1.2T左右,3备份需要存储2年约2.5P。 为响应公司业务上云,通过腾讯云上EMR搭建hbase集群。hive集群是在IDC机房,和普通集群迁移相比,这涉及到跨机房、跨集群的数据迁移,以及hive表数据到hbase集群数据的转换。 二、技术方案步骤 1、IDC机房与EMR网络的联通性验证
2、在EMR上搭建hbase集群及hive组件
3、迁移hdfs数据,数据校验
4、在目标集群创建对应hive库、表
5、在目标集群中将数据转换为HFile文件、创建hbase表,通过bulkload方式将数据导入hbase表
6、hbase集群性能及数据验证
7、目标集群与调度组件环境通过接口机打通,编排脚本节点任务,整个hive至hbase集群迁移实现自动化调度
三、具体实施
1、IDC机房与EMR网络的联通性验证
需要自建集群和EMR各个节点网络互通。distcp操作如果有xx 节点无法连接xx节点的异常,说明没有连通,需要继续设置。
2、在EMR上搭建hbase集群,hive组件(略)
3、迁移数据,数据校验
i)迁移数据
一般在新集群上运行同步,这样同步的作业可以在新集群上运行,对老集群影响较小。
方式:通过distcp命令同步集群数据
hadoop distcp -pbug -m xx 源集群 目标集群(hdfs路径为hive表的location位置)
迁移整体速度受集群间带宽,集群规模影响。
-m指定map数,和集群规模,数据量有关;先同步几个分区,调整-m参数,找到一个适合该集群的值并评估一下整体时间。
-bandwidth指定单个map的同步速度,是靠控制副本复制速度实现的,是大概值,由于IDC与EMR 是万兆带宽,就没设置该参数。
-pb,当源集群中的dfs块的大小与目标集群不一致,需设置该参数,不然会报FileNotFoundException。
-u,-g, 同步新老集群用户、用户组的权限。
-p, hdfs有权限设置,确定老集群是否有acl规则,是否要同步,检查dfs.permissions.enabled 和dfs.namenode.acls.enabled的配置新老集群是否一致,按照实际需要修改。如果有acl规则要同步,distcp参数要加-p同步权限参数。如果distcp操作提示xx集群不支持acl,说明对应集群没配置。新集群没配置可以修改配置并重启NM。旧集群不支持,说明旧集群根本就没有acl方面的设置,也不需要同步。
如果迁移过程中老集群还有写入,可以用-udpate再将变化同步过来。一般完全同步,需要有个短暂的业务停写,以启用双写双算或直接将业务切换到新集群上。由于本业务源数据是按天生成的,并且可以当天同步前天数据,所以没有加update参数。
ii) 数据校验
通过 hadoop -fs du命令分别统计每个分区数据的大小,与原集群进行对比,做一个初步的数据校验。在第四步完成后通过hive命令统计每个分区的条数做对比。
4、在目标集群创建对应hive库、表
i) 通过hive -e "create database/table xxx"
ii) 由于hive的元数据放在MySQL或其他db里,通过上述步骤,并没绑定hive表与数据的关系,需执行msck repair table *** ,修复hive表元数据。
5、在目标集群中将数据转换为HFile文件、创建hbase表,通过bulkload方式将数据导入hbase表
i) 通过mr生成hfile
需要注意的是同一个rowkey的不同版本指定不同long型timestamp
ii) 创建hbase表,通过bulkload方式将数据导入hbase表
需要注意的是创建hbase表时指定region的划分策略,以及version的最大版本数。
6、hbase集群性能及数据验证
通过hbase shell的scan,get命令获取一定量数据,统计所需时间。测试获取最大版本数和在hive里查询的rowkey的个数进行对比,是否一致。
7、目标集群通过接口机和调度组件环境打通。通过编排脚本节点任务,将数据工厂hive集群迁至EMR的hbase集群过程自动化调度
在接口机安装EMR上一样的hadoop,hbase集群环境,然后调整脚本中的hadoop,hbase命令为该环境下的,编排脚本任务实施调度。