-
【功能模块】目前收到新的项目,申请了新的开发账号,现在想把旧账号中的BO配置、开发的项目全部迁移到新的账号,请问平台支持相关操作么?【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
方案设计模板: 一、项目概述 1、项目背景和现状 2、项目面临的风险和挑战 3、项目方案设计原则 4、给客户带来的价值和收益 二、项目需求分析 1、项目现状分析 2、总体需求分析 三、公有云设计方案 1、公有云计算方案设计 1.1 计算容量规划 1.2 上云服务器规划 1.3 上云服务器部署 2、公有云存储方案设计 2.1 存储容量规划(一般做10%的冗余,备份到OBS、SFS等,windows-》cfs,lin-》nfs) 2.2 上云存储规划 2.3 上云存储部署 3、公有云网络方案设计 3.1 网络总体规划 3.2 网络配置(IP地址) 4、公有云数据库方案设计 4.1 数据库容量、规格规划(DDM、性能(DDM+RDS)、安全、管理(DAS)) 4.2 数据库上云部署 5、公有云安全方案设计(网络安全、备份、容灾) 5.1 备份规划(可靠性) 5.2 容灾规划(可用性、高可用性) 5.3 网络安全规划(应用层、网络层(DEW、IAM)、主机层、网络边界,) 四、迁移方案设计(源端准备、目的准备、实施过程、后续验证) 1、主机迁移方案; 2、应用迁移方案 3、数据库迁移方案 五、迁移方案设计(源端准备、目的准备、实施过程、后续验证) 1、主机迁移方案; 2、应用迁移方案 3、数据库迁移方案 五、配置清单和计费说明 请各位补充: 附详细的一个章节内容: 设计项目(方案和思路): 1、信息受理 2、需求 2.1 先确定已有DC,再确定如何与云打通,在确定云上资源规划(网络规划) 3、架构设计 3.1架构设计需要和客户的需求进行匹配 4、计算分层(数据库、中间件、应用) 4.1四个维度(横向-计算、存储、网络、数据库、应用;纵向-安全性、可扩展性、可用性/可靠性、性能(CDN、ELB+AS、Reddis、DDM、MQ、BMS、读写分离等)、成本) 4.2 如网站,应用架构:三层(接入 【负载均衡-cdn、EIP+ELB、网络安全】,应用【】,数据库) 4.3 网络:与DC互联,外网访问,内网访问; 可靠(双线,vpn+专线),安全(WAF、Anti-DDOS) 4.4 计算:线下三层,上云后对应三层; 4.5 数据库:RDS、自建(oracle) 5、存储、备份与容灾 5.1 数据转存(热数据-冷数据,OBS,高频、低频、归档) 5.2 数据备份(备份策略、备份时间点、周期) 5.3 数据源(应用、数据库)、保持的方式(CBR、RMAN等)、保存到哪里(OBS、SFS) 6、迁移 6.1 迁移步骤(流程、调研与评估、规划设计、实施、优化) 6.2 细节: 数据库(类型、版本、容量、迁移网络(离线、在线)、迁移工具、迁移后的回滚、实施(演练)、优化(业务运行测试和监控) 7、安全 7.1 安全设计分层(网络、应用、数据、管理)
-
业务使用过程中,经常需要将大量数据批量导入到Elasticsearch中,总结在MRS ES中能够快速实现数据导入的方式,可以学习使用。方式一:通过Logstash导入数据Logstash 是Elasticsearch官方提供的数据采集工具,能够动态地采集、转换和传输数据,不受格式或复杂度的影响。Logstash 支持各种输入选择,可以同时从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。MRS ES对接Logstash指南详见MRS产品文档的《Elasticsearch对接Logstash》章节,该章节指导用户快速对接安全/普通模式的MRS ES。方式二:使用ES2ES工具迁移/导入数据使用该工具客户已将开源ES/其他MRS ES集群的数据导入到本地集群中。支持两种迁移方式:Scroll和reindex。Scroll跨集群数据拷贝工具包的原理是通过利用滚动遍历策略和bulkAPI,每次完成一个index的数据迁移。主要用于完全兼容的两个ES版本之间数据迁移/拷贝Reindex跨集群数据拷贝工具包的原理是通过利用reindex API,完成多个index的数据迁移。支持ES跨大版本之间的数据迁移和拷贝。工具详细使用方法见MRS产品文档的《使用ES2ES工具迁移Elasticsearch数据》方式三:使用HBase2ES工具导入数据该工具支持使用TableScanMR并发或HBase直接扫描方式从HBase中获取数据并导入到Elasticsearch集群中。在ES替换Solr的场景中,若源数据保存在HBase时,可以使用该工具快速完成数据迁移。工具详细使用方法见MRS产品文档的《使用HBase2ES工具迁移HBase数据》方式四:HDFS2ES工具导入数据若源数存储在HDFS上,可以通过该工具运行Mapreduce方式将HDFS中格式化的数据导入到Elasticsearch中。工具详细使用方法见MRS产品文档的《使用HDFS2ES工具迁移HDFS数据》 不推荐使用:Hive on ES,性能较差,且导入过程中不稳定。
-
引言:最近被数据库迁移、云数据库迁移、主机迁移和存储迁移搞的有点懵。华为云上好多迁移工具啊,我到底要用哪个迁移工具啊?今天就来细说下这些迁移工具的使用场景和区别。首先,华为云上涉及数据迁移的服务有以下几个:主机迁移服务 SMS对象存储迁移服务 OMS数据复制服务 DRS云数据迁移 CDM数据库和应用迁移 UGO数据快递服务 DES 什么是主机迁移服务 SMS?服务器相信大家都不陌生,即使我们不直接和服务器打交道,实际上我们现在的生活已经离不开服务器。各种手机APP都是部署在不同服务器上的应用软件。那么,业务上云时,物理服务器或虚拟机迁移使用“主机迁移服务 SMS”最合适不过了。主机迁移服务 SMS 是一种P2V/V2V迁移服务,可以把X86物理服务器、私有云或公有云平台上的虚拟机迁移到华为ECS上。有图更清晰:)单击这里了解更多主机迁移服务 什么是对象存储迁移服务 OMS?对象存储迁移服务(Object Storage Migration Service,OMS)是一种线上数据迁移服务,帮助您将其他云服务商对象存储服务中的数据在线迁移至华为云的对象存储服务(Object Storage Service,OBS)中。简言之,入云迁移、对象存储迁移。OMS主要功能有以下两个:线上数据迁移服务:帮助用户把对象存储数据从其他云服务商的公有云轻松、平滑地迁移上云。跨区域的复制:指的是华为云各个Region之间的数据复制和备份。目前支持以下他云对象存储数据的入云迁移:亚马逊云、阿里云、微软云、百度云、华为云、金山云、青云、七牛云、腾讯云云数据迁移CDM服务也同样支持对象存储数据迁移,两者的区别为:OMS用于他云到华为云的数据迁移;CDM主要用于OBS数据迁移到数据湖或其他大数据系统,以便对数据进行开发、清洗、治理等。单击这里了解更多对象存储迁移服务 什么是数据复制服务 DRS?数据复制服务(Data Replication Service,简称DRS)是一种易用、稳定、高效、用于数据库实时迁移和数据库实时同步的云服务。DRS适合迁移OLTP->OLTP、OLTP->DWS的场景都可以由DRS来完成数据迁移。即主流数据库到数据库(含第三方数据库)的场景,使用DRS进行迁移。目前支持的数据库链路有:自建/他云MySQL->RDS for MySQL自建/他云PostgreSQL->RDS for PostgreSQL 自建/他云MongoDB->DDSOracle->RDS for MySQL......单击这里了解更多支持的数据库信息。DRS与CDM的区别:DRS的目的端为数据库系统,例如MySQL、MongoDB等。CDM的目的端主要为数据湖或其他大数据系统,例如MRS HDFS、FusionInsight HDFS。DRS和UGO的区别:DRS是针对数据的全量/增量迁移或数据同步;而UGO用于异构数据库迁移前的评估、结构迁移和语法转化。上图:单击这里了解更多DRS什么是云数据迁移 CDM?云数据迁移(Cloud Data Migration, 简称CDM),是一种高效、易用的批量数据迁移服务。 CDM围绕大数据迁移上云和智能数据湖解决方案, 提供了简单易用的迁移能力和多种数据源到数据湖的集成能力,降低了客户数据源迁移和集成的复杂性,有效的提高您数据迁移和集成的效率。CDM进行数据迁移时,目标端为数据湖或其他大数据系统;源端可以是数据库也可以是对象存储。上图:CDM与DRS的区别:目的端是大数据系统时,推荐使用CDM;目的端是OLTP数据库或DWS时,推荐使用DRS迁移。CDM与OMS的区别:OMS用于入云迁移,支持以下源端云服务商: 亚马逊云、阿里云、微软云、百度云、青云、七牛云、腾讯云 CDM主要用于OBS数据迁移到数据湖或其他大数据系统,以便对数据进行开发、清洗、治理等。同时,整桶迁移建议使用OMS。单击这里了解更多CDM 什么是数据库和应用迁移 UGO?数据库和应用迁移 UGO(Database and Application Migration UGO,以下简称为UGO)是专注于异构数据库结构迁移的专业服务。可将数据库中的DDL、业务程序中封装的数据库SQL一键自动将语法转换为华为云GaussDB/RDS的SQL语法,通过预迁移评估、结构迁移两大核心功能和自动化语法转换,提前识别可能存在的改造工作、提高转化率、最大化降低用户数据库迁移成本。简言之,UGO用于异构数据库迁移前的数据库评估、结构迁移、语法转化单击这里了解更多UGO 什么是数据快递服务 DES?一种海量数据传输解决方案,支持TB级到PB级数据上云,使用物理介质(Teleport设备、外置USB硬盘驱动器、SATA硬盘驱动器、SAS硬盘驱动器等)向华为云传输大量数据,致力于解决海量数据传输网络成本高、传输时间长等难题。简言之,海量数据传输、使用物理介质单击这里了解更多DES小结:服务名主要功能和其他服务的区别主机迁移服务 SMS主机迁移含物理机到华为云、其他自建或他云虚拟机到华为云-对象存储迁移服务 OMS对象存储迁移他云对象存储数据迁移到华为云华为云各Region间的数据迁移OMS用于他云到华为云的数据迁移。CDM主要用于OBS数据迁移到数据湖或其他大数据系统,以便对数据进行开发、清洗、治理等。数据复制服务 DRS支持主流数据库到华为云的入云和出云迁移数据库在线迁移数据库实时同步和CDM的区别:数据库迁移使用DRS;到大数据系统的迁移使用CDM。和UGO的区别:DRS支持同构和异构的数据库迁移/同步;UGO用于异构数据库的结构迁移、数据库迁移前评估、语法迁移等云数据迁移 CDM大数据迁移上云多种数据源到数据湖的迁移和DRS的区别:数据库迁移使用DRS;到大数据系统的迁移使用CDM。数据库和应用迁移 UGO数据库结构迁移数据库迁移前评估语法迁移和DRS的区别:DRS支持同构和异构的数据库迁移/同步;UGO用于异构数据库的结构迁移、数据库迁移前评估、语法迁移等数据快递服务 DES海量数据,支持TB级到PB级数据上云使用物理介质-
-
我们经常面临向HBase中导入大量数据的情景,向HBase中批量加载数据的方式有很多种,最直接方式是调用HBase的API使用put方法插入数据;另外一种是用MapReduce的方式从HDFS上加载数据。但是这两种方式效率都不是很高,因为HBase频繁进行flush、compact、split操作需要消耗较大的CPU和网络资源,并且RegionServer压力也比较大。本实践基于华为云MapReduce服务,用于指导您创建MRS集群后,使用BulkLoad方式向HBase中批量导入本地数据,在首次数据加载时,能极大的提高写入效率,并降低对Region Server节点的写入压力。本案例基本操作流程如下所示:创建MRS离线查询集群。将本地数据导入到HDFS中。创建HBase表。生成HFile文件并导入HBase。场景描述BulkLoad方式调用MapReduce的job直接将数据输出成HBase table内部的存储格式的文件HFile,然后将生成的StoreFiles加载到集群的相应节点。这种方式无需进行flush、compact、split等过程,不占用Region资源,不会产生巨量的写入I/O,所以需要较少的 CPU 和网络资源。BulkLoad适合的场景:大量数据一次性加载到HBase。对数据加载到HBase可靠性要求不高,不需要生成WAL文件。使用put加载大量数据到HBase速度变慢,且查询速度变慢时。加载到HBase新生成的单个HFile文件大小接近HDFS block大小。创建MRS离线查询集群登录华为云MRS控制台,选择“EI企业智能 > MapReduce服务”,单击“购买集群”,选择“快速购买”,填写相关软件配置参数,单击“下一步”。 参数项取值区域华北-北京四计费模式按需计费集群名称MRS01集群版本MRS 3.0.5组件选择HBase查询集群可用区可用区1虚拟私有云vpc-01子网subnet-01企业项目default用户名root/admin密码设置密码,例如:Huawei@12345。该密码用于登录集群管理页面及ECS节点。确认密码再次输入设置用户密码通信安全授权勾选“确认授权”单击“立即购买”,等待约15分钟,MRS集群创建成功。将本地数据导入到HDFS中在本地准备一个学生信息文件“info.txt”。例如字段信息依次为:学号、姓名、生日、性别、住址。20200101245,张晓明,20150324,男,龙岗区 20200101246,李敏林,20150202,男,宝安区 20200101247,杨小刚,20151101,女,龙岗区 20200101248,陈嘉玲,20150218,男,宝安区 20200101249,李明耀,20150801,女,龙岗区 20200101250,王艳艳,20150315,男,南山区 20200101251,李荣中,20151201,男,福田区 20200101252,孙世伟,20150916,女,龙华区 20200101253,林维嘉,20150303,男,福田区登录华为云OBS管理控制台,单击“创建桶”,填写以下参数,单击“立即创建”。 参数项取值区域华北-北京四数据冗余存储策略单AZ存储桶名称mrs-hbase存储类别标准存储桶策略私有默认加密关闭归档数据直读关闭企业项目default标签-等待桶创建好,单击桶名称,选择“对象 > 上传对象”,将数据文件上传至OBS桶内。切换回MRS控制台,单击创建好的MRS集群名称,进入“概览”,单击“IAM用户同步”所在行的“单击同步”,等待约5分钟同步完成。将数据文件上传HDFS。在“文件管理”页签,创建“/tmp/test”目录,单击“导入数据”。OBS路径:选择上面创建好的OBS桶名,找到txt文件,单击“是”。HDFS路径:创建并选择“/tmp/test”,单击“是”。单击“确定”,等待导入成功,此时数据文件已上传至HDFS。创建HBase表登录MRS集群的FusionInsight Manager页面(如果没有弹性IP,需提前购买弹性IP),新建一个用户hbasetest,绑定用户组supergroup,绑定角色System_administrator。下载并安装集群全量客户端,例如客户端安装目录为“/opt/client”,相关操作可参考安装客户端。为主Master节点绑定一个弹性IP,然后使用root用户登录主Master节点,进入客户端所在目录并认证用户。cd /opt/client source bigdata_env kinit hbasetest执行hbase shell进入HBase Shell命令行界面。需要根据导入数据,规划HBase数据表的表名、rowkey、列族、列,考虑好row key分配在创建表时进行预分割。执行以下命令创建表“student_info”。create 'student_info', {NAME => 'base',COMPRESSION => 'SNAPPY', DATA_BLOCK_ENCODING => 'FAST_DIFF'},SPLITS => ['1','2','3','4','5','6','7','8']− NAME => 'base':HBase表列族名称。− COMPRESSION:压缩方式− DATA_BLOCK_ENCODING:编码算法− SPLITS:预分region查看表是否创建成功,然后退出HBase Shell命令行界面。list生成HFile文件并导入HBase创建自定义导入的模板文件,例如模板文件为“/opt/configuration_index.xml”(模板文件样例可从“集群客户端安装目录/HBase/hbase/conf/index_import.xml.template”获取)。vi /opt/configuration_index.xml例如本案例中,模板文件如下:<?xml version="1.0" encoding="UTF-8"?> <configuration> <!--column_num要和数据文件中的列的数量对应:5列 --> <import column_num="5" id="first"> <columns> <column type="string" index="1">P_ID</column> <column type="string" index="2">P_NAME</column> <column type="string" index="3">P_BIRTH</column> <column type="string" index="4">P_GENDER</column> <column type="string" index="5">P_DISTRICT</column> </columns> <!--reverse(P_BIRTH):反转出生年月避免热点 --> <!--substring(P_NAME,0,1):截取姓 --> <!--substring(P_ID,0,6):截身学号前六位 --> <rowkey> reverse(P_BIRTH)+'_'+substring(P_NAME,0,1)+'_'+substring(P_ID,0,6) </rowkey> <qualifiers> <!--family的指定要和表的列族名称对应。 --> <normal family="base"> <qualifier column="P_ID">H_ID</qualifier> <qualifier column="P_NAME">H_NAME</qualifier> <qualifier column="P_BIRTH">H_BIRTH</qualifier> <qualifier column="P_GENDER">H_GENDER</qualifier> <qualifier column="P_DISTRICT">H_DISTRICT</qualifier> </normal> </qualifiers> </import> </configuration>执行如下命令,生成HFile文件。hbase com.huawei.hadoop.hbase.tools.bulkload.ImportData -Dimport.separator=',' -Dimport.hfile.output=/tmp/test/hfile /opt/configuration_index.xml student_info /tmp/test/info.txt− -Dimport.separator:分隔符。− -Dimport.hfile.output:执行结果输出路径。− /opt/configuration_index.xml:指向自定义的模板文件。− student_info:要操作的HBase表名。− /tmp/test/info.txt:指的是要批量上传的HDFS数据目录。− com.huawei.hadoop.hbase.tools.bulkload.IndexImportData:导入时创建二级索引使用IndexImportData;如果不创建二级索引,使用ImportData。等待MapReduce任务执行成功,输出路径下生成HFile文件。hdfs dfs -ls /tmp/test/hfile执行后显示如下:Found 2 items -rw-r--r-- 3 hbasetest hadoop 0 2021-05-14 11:39 /tmp/test/hfile/_SUCCESS drwxr-xr-x - hbasetest hadoop 0 2021-05-14 11:39 /tmp/test/hfile/base执行如下命令将HFile导入HBase表。hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /tmp/test/hfile student_info命令执行完成后,执行hbase shell命令进入HBase Shell命令行界面,查看表内容。scan 'student_info', {FORMATTER => 'toString'}执行后显示如下:ROW COLUMN+CELL 10115102_杨_202001 column=base:H_BIRTH, timestamp=2021-05-14T15:28:56.755, value=20151101 10115102_杨_202001 column=base:H_DISTRICT, timestamp=2021-05-14T15:28:56.755, value=龙岗区 10115102_杨_202001 column=base:H_GENDER, timestamp=2021-05-14T15:28:56.755, value=女 10115102_杨_202001 column=base:H_ID, timestamp=2021-05-14T15:28:56.755, value=20200101247 10115102_杨_202001 column=base:H_NAME, timestamp=2021-05-14T15:28:56.755, value=杨小刚 10215102_李_202001 column=base:H_BIRTH, timestamp=2021-05-14T15:28:56.755, value=20151201 10215102_李_202001 column=base:H_DISTRICT, timestamp=2021-05-14T15:28:56.755, value=福田区 ...数据导入集群后,就可以继续基于大数据平台上层应用对数据进行分析处理了。转自【云小课】EI第19课 MRS离线数据迁移-使用BulkLoad向HBase中批量导入数据-云社区-华为云 (huaweicloud.com)
-
6月24日,经中国信息通信研究院(以下简称“信通院”)严格测试,华为云数据库应用迁移解决方案顺利通过“数据库应用迁移服务能力”评测,成为国内首批通过该项的商用数据库迁移方案。该项是国内首个针对数据库迁移能力的全面评估测试,包括6大能力域、16个能力项,共154个测试用例,评估结果分为基础级、增强级和先进级三个等级,填补了数据库领域在迁移服务能力标准方面的空白,切实为用户解决数据库产品替换难的根本顾虑。同时,也标志着国产数据库领军企业已经不再局限于仅关注产品本身的能力,还具备了为用户提供全方位、高标准的数据库迁移服务的能力,让用户不仅敢于选择,而且选的放心。华为在数据库迁移技术领域里一直有着深厚的技术积累,作为第一家参与的企业,华为云数据库应用迁移整体解决方案在本次评测中经历了迁移评估、业务改造、迁移执行、迁移验证、运维优化、安全能力6大方面的严苛考验,设计了完备的Oracle到GaussDB的迁移测试用例展示,成功取得了国内首批评测最高级别的成绩。华为云数据库应用迁移解决方案由华为云数据库和应用迁移UGO、华为云数据复制服务DRS两款产品组成。UGO专注于异构数据库结构迁移和应用SQL转换,实现商用数据库的一键迁移。DRS负责数据库毫秒级数据同步,支持同构异构数据库之间的数据传输/搬迁,降低数据库之间数据流通的复杂性,减少数据传输成本。该方案覆盖了数据库迁移、管理等环节,提供了一站式上云迁移解决方案,让用户真正做到迁移放心、管理省心!华为云数据库应用迁移解决方案架构图在信通院6大考验中,华为云UGO基于各种迁移成本为用户提供精准的评估结果;支持亿级别样本训练,当前综合语法转化率接近85%,并在持续提升中;支持预迁移评估和语法转换、对象校正等。充分满足信通院对迁移评估能力、业务改造能力、迁移执行能力等方面的要求。华为云DRS支持全量+增量迁移,能够最大限度将业务系统中断时间和业务影响最小化;严格控制使用者的操作权限,多方面保障数据库安全。充分满足信通院对迁移执行能力、迁移验证能力、安全能力等方面的要求。华为云GaussDB数据库已广泛应用于金融、政府、运营商、交通、物流、互联网等领域,服务于1000+客户,应用迁移解决方案成功帮助各行各业客户顺利高效的完成数据与应用迁移。此番通过信通院评测,进一步得到了市场和行业的广泛认可。华为云数据库将联合更多合作伙伴,持续为各行业提供极具竞争力的数据库迁移解决方案。
-
感谢各位小伙伴参与本次活动,本次活动获奖名单如下:活动中奖公示奖项名称获奖楼层社区昵称奖品备注优秀提问69wolfandy华为无线充电器 幸运奖9nukinsan笔记本套装与#69优秀提问重复,顺延至#1032//#32内容无效,顺延至#34仍然无效78客家鱻粉笔记本套装 100linghz666笔记本套装 112//与#69优秀提问重复,顺延至下一楼层仍为同一人请各位获奖的伙伴在8月3日之前点击此处填写收货地址,如逾期未填写视为自动弃奖。再次感谢各位小伙伴参与本次活动,欢迎关注华为云更多活动~【直播简介】【专家简介】 南风 华为云数据迁移DRS产品架构师【直播简介】 DRS是一款易用、稳定、高效,用于数据库在线迁移和数据库实时同步的云服务,它提供了以Oracle、MySQL、PostgreSQL、华为云RDS等多种数据库作为源端的数据迁移上云服务,其中GaussDB(for openGauss)作为华为云上的主力云数据库,DRS对其做了深度的开发支持,在迁移的功能和性能上具有很大优势,可以帮助客户简单、快捷、一键式的完成数据迁移。【直播时间】2021年6月22日 星期二 19:00-20:00直播链接:https://bbs.huaweicloud.com/live/cloud_live/202106221900.html 【活动介绍】【互动方式】直播前您可以在本帖留下您感兴趣的问题,专家会在直播时为您解答。直播后您可以继续在本帖留言,与专家互动交流。我们会在全部活动结束后对参与互动的用户进行抽奖。【活动时间】6月17日—6月30日 【奖励说明】活动1:提问有礼评奖规则:在本帖提出与直播相关的问题,由专家在所有互动贴中选出1名最优互动贴的开发者进行奖励。奖品:华为无线充电器1个 活动2:盖楼有礼评奖规则在活动结束后(截止6月30日),在本帖所有盖楼的用户中抽取获奖楼层,获奖楼层=总楼层*中奖百分比,中奖百分比为8%、28%、68%、88%、98%。例如:活动束后总楼层为200,200*8%=16,即第16楼获奖,其他获奖楼层同理可得。如出现小数点,则四舍五入,例如:活动结束后总楼层为220,220*8%=17.6,即第18楼获奖。无效楼层不参与中奖,请勿连续刷楼超过5层或回复无关内容,否则视为无效。奖品:笔记本套装1套【注意事项】1、为保证您顺利领取活动奖品,请您提前填写奖品收货信息,如您没有填写,视为放弃奖励【点击此处填写信息】。2、活动获奖信息填写时间截止2021年7月9日,如未填写视为弃奖。本次先发活动奖品将于2021年7月30日前统一发出,请您耐心等待。3、活动期间每个ID(同一姓名/电话/收货地址)只能获奖一次,若重复则中奖资格顺延至下一个合格楼层,仅一次顺延。4、如活动奖品出现没有库存的情况,华为云工作人员将会替换等价值的奖品,获奖者不同意此规则视为放弃奖品。5、其他事宜请参考【华为云社区常规活动规则】。
-
请假大神们一个问题,现在项目面临的问题是在gaussdb中大概2000多张表,如何将这些表的数据同步到hive中去。请教了一下华为的客服,推荐用loader组件,可是这个组件对于这种大批量的数据迁移来说实在是太麻烦了,有没有大神有过这方面的经验,烦请告知!先谢谢了
-
### 数据迁移中的字符集 DRS数据迁移要求源库和目标库的字符集一致,否则会导致数据迁移异常或者数据不一致,原因得从字符集及其原理说起 #### 字符与字节 在计算机中,数据都是以二进制进行存储的,也就是 在物理上,最小的物理存储单元是字节byte(B), 也就是8个bit位,物理上基于字节可以扩展出KB, MB, GB等 在逻辑上,把一个或多个byte进行组合,来代表更多逻辑世界的东西 比如:在java中用4个字节为一个单元来表示范围为2^31~2^31-1的整数(int),用8个字节为一个单元表示一个双精度浮点数(double),用2个字节为一个单元,表示一个字符char ##### 字符集 为了用字节来表示各种文字,各个组织制定了多套字节到字符的映射关系,这些映射关系就是字符集 例如:在ascii表中用固定1个字节表示1个字符,但是ascci码表只能表示256个字符;在gbk字符集中用2个字节表示1个字符,但是gbk只能表示65535个字符,有许多汉字不一定包括进去了,其它外国文字就更不用说了;在UNICODE字符集中用2~4个字节表示一个字符,基本实现了所有语言文字使用同一套映射的功能(unicode.org) java的字符是基于unicode的 ###### 查看字符的unicode值 ``` System.out.println("我的uniocode编码 hex:" + Integer.toHexString('我') + " bin:" + Integer.toBinaryString('我')); //我的uniocode编码 hex:6211 bin:110001000010001 ``` ##### 字符编码 有些字符集只有一种字符编码,比如ascii, gbk等,byte值在什么地方都可以直接映射成对应的字符,但是UNICODE的字符集却有多种编码,因为在UNICODE中规定,用2~4个字节表示一个字符,如果文件内容全是英文的,那么每个字符用2~4个字节相对于ascii来说在存储或者传输中就会占用浪费太多的空间,为了解决这个问题,对于UNICODE出现了多种使用变长字符编码,其中最常使用的UTF8编码,分别用1-4个字节来表示一个字符。UTF8是基于UNICODE的一种编码,UTF8编码格式如下: 首字节:0xxxxxxx(单字节), 110xxxxx(2字节), 1110xxxx(3字节), 11110xxx(4字节) 剩余字节:10xxxxxx ###### 查看一个字符的编码 ``` for (byte b : new String(new char[]{'我'}).getBytes("UTF8")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + " "); } //e6:11100110 88:10001000 91:10010001 for (byte b : new String(new char[]{'我'}).getBytes("GBK")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + " "); } //ce:11001110 d2:11010010 ``` ##### UNICODE与UTF8的转换 ``` Unicode符号范围 | UTF-8编码方式 (十六进制) | (二进制) --------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx ``` 其中二进制中xxx部分即为unicode的内容 “我” unicode值为:110 001000 010001 utf8值为:11100110 10001000 10010001 ##### 字符排序规则 数据库中除了字符集外,还有字符排序规则, ### java中的字符集 根据不同的编码,一串字节流可以翻译成不同的字符,那么想正确翻译出文件或者数据流的内容,就需要知道对应的字符集或字符编码才行 ###### 读写数据 ``` Socket socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1", 8080)); InputStreamReader netIn = new InputStreamReader(socket.getInputStream()); char[] charsNet = new char[10]; netIn.read(charsNet); OutputStreamWriter netOut = new OutputStreamWriter(socket.getOutputStream()); netOut.write(new char[]{'我', '是', 'D', 'R', 'S'}); InputStreamReader fileIn = new InputStreamReader(new FileInputStream("/tmp/t.txt")); char[] fileChars = new char[10]; fileIn.read(fileChars); OutputStreamWriter fileOut = new OutputStreamWriter(new FileOutputStream("/tmp/t.txt")); fileOut.write(new char[]{'我', '是', 'D', 'R', 'S'}); ``` ![java中的字符集.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/30/162300eogvkbor7nafqtpi.png) 写入的时候,通过CharsetDecoder把CharBuffer转换成ByteBuffer 读取的时候,通过CharsetEncoder把ByteBuffer转换成CharBuffer ###### 错误的字符集 当我们用一个GBK的字符集去读取UTF8的byte的时候,程序不会报错,而且对于异常字符会由其它字符填充,不会保持byte的原样 注:这是因为java的String在处理字符集格式异常的时候,默认用的CharsetDecoder策略的替换(REPLACE), 另外两个是忽略(IGNORE)和报错(REPORT),如果是replace的情况下,会用一些特殊字符替换,于是byte内容就会失真 ``` char[] chars = new char[]{'我'}; System.out.print("UTF8:\t\t\t我\t\t"); for (byte b : new String(chars).getBytes("UTF8")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + "\t"); } System.out.println(); System.out.print("UTF8=>GBK:\t\t" + new String(new String(chars).getBytes("UTF8"), Charset.forName("GBK")) + "\t"); for (byte b : new String(new String(chars).getBytes("UTF8"), Charset.forName("GBK")).getBytes("GBK")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + "\t"); } System.out.println(); System.out.print("GBK:\t\t\t我\t\t"); for (byte b : new String(chars).getBytes("GBK")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + "\t"); } System.out.println(); System.out.print("GBK=>UTF8:\t\t" + new String(new String(chars).getBytes("GBK"), Charset.forName("UTF8")) + "\t"); for (byte b : new String(new String(chars).getBytes("GBK"), Charset.forName("UTF8")).getBytes("GBK")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + "\t"); } //UTF8: 我 e6:11100110 88:10001000 91:10010001 //UTF8=>GBK: 鎴 e6:11100110 88:10001000 3f:111111 //GBK: 我 ce:11001110 d2:11010010 //GBK=>UTF8: 3f:111111 3f:111111 ``` ### MySQL中的字符集 ###### 不同字符集的表,对于相同的字符(char),存储的内容(byte)不同 ``` CREATE TABLE `t_charset_gbk` ( `val` varchar(32) ) CHARSET=gbk; insert into t_charset_gbk values ('我'),('是'); select val,hex(val) from t_charset_gbk; +------+----------+ | val | hex(val) | +------+----------+ | 我 | CED2 | | 是 | CAC7 | +------+----------+ CREATE TABLE `t_charset_utf8` ( `val` varchar(32) ) DEFAULT CHARSET=utf8; insert into t_charset_utf8 select * from t_charset_gbk; select val,hex(val) from t_charset_utf8; +------+----------+ | val | hex(val) | +------+----------+ | 我 | E68891 | | 是 | E698AF | +------+----------+ ``` ###### 客户端选用不同显示字符集,数据存储内容也不同 ``` >mysql --default-character-set=utf8 mysql> select hex('我'), '我', convert(unhex('E68891') using utf8); +------------+-----+-------------------------------------+ | hex('我') | 我 | convert(unhex('E68891') using utf8) | +------------+-----+-------------------------------------+ | E68891 | 我 | 我 | +------------+-----+-------------------------------------+ >mysql --default-character-set=gbk mysql> select hex('我'), '我', convert(unhex('CED2') using gbk); +-----------+----+----------------------------------+ | hex('我') | 我 | convert(unhex('CED2') using gbk) | +-----------+----+----------------------------------+ | CED2 | 我 | 我 | +-----------+----+----------------------------------+ ``` ###### 字符集的转换 可以用convert函数来转换不同字符集的字符 ``` mysql> select convert(unhex('CED2') using gbk),convert(unhex('E68891') using utf8),hex(convert(convert(unhex('CED2') using gbk) using utf8)); +----------------------------------+-------------------------------------+-----------------------------------------------------------+ | convert(unhex('CED2') using gbk) | convert(unhex('E68891') using utf8) | hex(convert(convert(unhex('CED2') using gbk) using utf8)) | +----------------------------------+-------------------------------------+-----------------------------------------------------------+ | 我 | 我 | E68891 | +----------------------------------+-------------------------------------+-----------------------------------------------------------+ ``` ##### 错误的字符集的时候 跟java不同,MySQL错误的字符集转换会变为空值,类似于java的报错策略,而如果格式符合要求,它会存储成乱码但会保持byte原样存储 ``` > select convert(unhex('E68891') using gbk), convert(unhex('E68891E68891') using gbk), convert(unhex('E68891') using utf8); +------------------------------------+------------------------------------------+-------------------------------------+ | convert(unhex('E68891') using gbk) | convert(unhex('E68891E68891') using gbk) | convert(unhex('E68891') using utf8) | +------------------------------------+------------------------------------------+-------------------------------------+ | NULL | 鎴戞垜 | 我 | +------------------------------------+------------------------------------------+-------------------------------------+ ``` ##### 字符集校验规则 当collate不同的时候,有可能会把不同的字符认为是相同的字符 ``` mysql> select 'A'='a'; +---------+ | 'A'='a' | +---------+ | 1 | +---------+ 1 row in set (0.00 sec) mysql> select convert('a',CHAR CHARACTER SET utf8) COLLATE utf8_bin=convert('A', CHAR CHARACTER SET utf8) COLLATE utf8_bin; +--------------------------------------------------------------------------------------------------------------+ | convert('a',CHAR CHARACTER SET utf8) COLLATE utf8_bin=convert('A', CHAR CHARACTER SET utf8) COLLATE utf8_bin | +--------------------------------------------------------------------------------------------------------------+ | 0 | +--------------------------------------------------------------------------------------------------------------+ ``` 一些简单的名称规则 ``` 后缀名称 | 含义 _ai | 口音不敏感 _as | 口音敏感 _ci | 不区分大小写 _cs | 区分大小写 _ks | 假名敏感 _bin | 二进制 ``` ##### 默认字符集 1、创建库的时候,如果不指定库的字符集,默认用character_set_server,默认排序规则用infomation_schema.collations中对应的default值 2、创建表的时候,如是不指定表的字符集,默认用库的字符集和排序规则 ``` mysql> set character_set_server=gbk; Query OK, 0 rows affected (0.00 sec) mysql> create database test1; Query OK, 1 row affected (0.01 sec) mysql> show create database test1; +----------+---------------------------------------------------------------+ | Database | Create Database | +----------+---------------------------------------------------------------+ | test1 | CREATE DATABASE `test1` /*!40100 DEFAULT CHARACTER SET gbk */ | +----------+---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> create table t (name varchar(32)); Query OK, 0 rows affected (0.02 sec) mysql> show create table t; +-------+------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------------------------------------------+ | t | CREATE TABLE `t` ( `name` varchar(32) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=gbk | +-------+------------------------------------------------------------------------------------------+ mysql> set character_set_server=utf8mb4; Query OK, 0 rows affected (0.00 sec) mysql> create database test3; Query OK, 1 row affected (0.01 sec) mysql> show create database test3; +----------+-------------------------------------------------------------------+ | Database | Create Database | +----------+-------------------------------------------------------------------+ | test3 | CREATE DATABASE `test3` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ | +----------+-------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> create table t (name varchar(32)); Query OK, 0 rows affected (0.03 sec) mysql> show create table t; +-------+----------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------+ | t | CREATE TABLE `t` ( `name` varchar(32) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | +-------+----------------------------------------------------------------------------------------------+ ``` ### DRS数据迁移中的字符集 在DRS做数据迁移的时候,我们要求 1、源和目标库的字符集保持一致,如果字符集不一致,源表字符集在目标表字符集中没有,就会出现异常或者乱码 例如韩文“조선글”不在gbk的字符集里面,但是在unicode字符集里面 ``` mysql> create table t_charset_gbk (val varchar(32) character set gbk); Query OK, 0 rows affected (0.03 sec) mysql> create table t_charset_utf8 (val varchar(32) character set utf8); Query OK, 0 rows affected (0.02 sec) mysql> mysql> insert into t_charset_utf8 value('汉字'), ('조선글'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into t_charset_gbk select * from t_charset_utf8; ERROR 1366 (HY000): Incorrect string value: '\xEC\xA1\xB0\xEC\x84\xA0...' for column 'val' at row 2 ``` 2、源和目标库的字符集校验规则一致,如果校验规则不一致,有可能会出现数据惟一约束失败的问题 ``` mysql> create table t_collate_ci (val varchar(32) character set gbk collate gbk_chinese_ci,unique key uk_v(val)); Query OK, 0 rows affected (0.02 sec) mysql> create table t_collate_bin (val varchar(32) character set gbk collate gbk_bin,unique key uk_v(val)); Query OK, 0 rows affected (0.03 sec) mysql> insert into t_collate_bin values ('a'), ('A'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into t_collate_ci select * from t_collate_bin; ERROR 1062 (23000): Duplicate entry 'a' for key 'uk_v' mysql> ``` 因此在做数据迁移的时候,源目标端的配置一定要相同,否则就会导致写入异常或者失败的情况
-
概览● 本文主要是想谈一下如何给HBase做增量数据的迁移,也就是迁移实时数据。在之前的博文HBase实用技巧:一种全量+增量数据的迁移方法-云社区-华为云 (huaweicloud.com)中提到HBase增量数据迁移可以使用Replication的方式去做,但是在实际搬迁时,要给原集群设置Replication可能需要重启,这样会影响业务,我们需要做到不停机迁移才行。WAL原理正常情况下,HBase新增的数据都是有日志记录的,数据在落盘成HFile之前,任何一个Put和Delete操作都是记录日志并存放在WALs目录中,日志中包含了所有已经写入Memstore但还未Flush到HFile的更改(edits)。默认情况下每个RegionServer只会写一个日志文件,该RS管理的所有region都在向这一个日志文件写入Put和Delete记录,直到日志文件大小达到128MB(由hbase.regionserver.hlog.blocksize设置)后roll出一个新的日志文件,总共可以roll出32个日志文件(由hbase.regionserver.maxlogs设置)。如果日志文件未写满128MB,RegionServer间隔1小时也会roll出新一个新日志文件(由hbase.regionserver.logroll.period设置)。当日志文件中涉及的所有region的记录都flush成HFile后,这个日志文件就会转移至oldWals目录下归档, Master没间隔10分钟(hbase.master.cleaner.interval)会检查oldWALs目录下的过期日志文件,当文件过期时会被Master清理掉,(日志过期时间由hbase.master.logcleaner.ttl控制)。RegionServer默认间隔1小时(由hbase.regionserver.optionalcacheflushinterval设置)会对它管理的region做一次flush动作,所以WALs目录中一直会有新的日志文件生成,并伴随着老的日志文件移动到oldWALs目录中。迁移方式一、迁移oldWALs目录中的文件,使用WALPlayer回放由于日志文件文件最终移动到oldWALs目录下,只需要写个脚本,定时检查oldWALs目录下是否有新文件生成,如果有文件,则move至其他目录,并使用WALPlayer工具对这个目录进行回放。优点:无代码开发量,仅需脚本实现缺点:无法做到实时,因为从数据写入到最后到达oldWAL目录会间隔很长时间。二、开发独立工具,解析日志文件,写入目的集群在网上查找迁移方法的时候了解到了阿里开发了一个专门的HBase迁移工具,可以实现不停机。通过阅读其设计BDS - HBase数据迁移同步方案的设计与实践了解到阿里开发了应用去读取HBase的WAL日志文件并回放数据至目的集群。优点:可以做到实时;缺点:需要一定的代码开发量;要做出这样一个工具,需要了解上面说的WAL文件归档的原理以及日志回放工具WALPlayer,下面简单说一下可以怎么去实现。独立工具实现这里简单说明下如何去做这样一个工具,只介绍读取WAL方面,任务编排就不描述了定时扫描WALs目录获取所有的日志文件,这里按ServerName去分组获取,每个分组内根据WAL文件上的时间戳排序;● 获取所有RS的ServerNameClusterStatus clusterStatus = admin.getClusterStatus(); Collection<ServerName> serverNames = clusterStatus.getServers();● 根据ServerName去组成Path获取日志Path rsWalPath = new Path(walPath, serverName.getServerName()); List<FileStatus> hlogs = getFiles(fs, rsWalPath, Long.MIN_VALUE, Long.MAX_VALUE);● getFiles()参考HBase源码中WALInputFormat.java中的实现,可以指定时间范围去取日志文件private List<FileStatus> getFiles(FileSystem fs, Path dir, long startTime, long endTime) throws IOException { List<FileStatus> result = new ArrayList<FileStatus>(); LOG.debug("Scanning " + dir.toString() + " for WAL files"); FileStatus[] files = fs.listStatus(dir); if (files == null) return Collections.emptyList(); for (FileStatus file : files) { if (file.isDirectory()) { // recurse into sub directories result.addAll(getFiles(fs, file.getPath(), startTime, endTime)); } else { String name = file.getPath().toString(); int idx = name.lastIndexOf('.'); if (idx > 0) { try { long fileStartTime = Long.parseLong(name.substring(idx+1)); if (fileStartTime <= endTime) { LOG.info("Found: " + name); result.add(file); } } catch (NumberFormatException x) { idx = 0; } } if (idx == 0) { LOG.warn("File " + name + " does not appear to be an WAL file. Skipping..."); } } } return result; }对于取到的每一个WAL文件,当做一个任务Task执行迁移,这个task主要有下面一些步骤● 使用WALFactory为每个日志文件创建一个ReaderWAL.Reader walReader = WALFactory.createReader(fileSystem, curWalPath, conf);● 通过Reader去读取key和edit,并记录下position,为了加快写入速度,这里可以优化为读取多个entryWAL.Entry entry = walReader.next(); WALKey walKey = entry.getKey(); WALEdit walEdit = entry.getEdit(); long curPos = reader.getPosition();● 记录position的目的是为了Reader的reset以及seek,因为这个原始WAL文件还正在写入的时候,我们的Reader速度很可能大于原WAL的写入速度,当Reader读到底的时候,需要等待一段时间reset然后再重新读取entryWAL.Entry nextEntry = reader.next(); if (nextEntry == null) { LOG.info("Next entry is null, sleep 10000ms."); Thread.sleep(5000); curPos = reader.getPosition(); reader.reset(); reader.seek(curPos); continue; }● 在读取WAL的过程中很可能会遇到日志转移到oldWALs目录下,这个时候捕获到FileNotFoundException时,需要重新生成一个oldWALs目录下Reader,然后设置curPos继续读取文件,这个时候如果再次读取到文件最后的时候,就可以关闭Reader了,因为oldWALs中的日志文件是固定大小的,不会再有追加数据。这里需要注意的是这个参数hbase.master.logcleaner.ttl不能设置过小,否则会出现这个在oldWALs目录下的日志文件还没读取完被清理掉了。Path oldWALPath = new Path(oldWalPath, walFileName); WAL.Reader reader = WALFactory.createReader(fileSystem, oldWALPath, conf); reader.seek(curPos)● 根据通过WAL.Reader可以读取到walKey,walEdit进而解析出Cell并写入目的集群,这个可以参考WALPlay的map()方法
-
原文地址:https://bbs.huaweicloud.com/blogs/259874 ## 概览 ● 本文主要是想谈一下如何给HBase做增量数据的迁移,也就是迁移实时数据。在之前的博文[HBase实用技巧:一种全量+增量数据的迁移方法-云社区-华为云 (huaweicloud.com)](https://bbs.huaweicloud.com/blogs/199399)中提到HBase增量数据迁移可以使用Replication的方式去做,但是在实际搬迁时,要给原集群设置Replication可能需要重启,这样会影响业务,我们需要做到不停机迁移才行。 ## WAL原理 正常情况下,HBase新增的数据都是有日志记录的,数据在落盘成HFile之前,任何一个Put和Delete操作都是记录日志并存放在WALs目录中,日志中包含了所有已经写入Memstore但还未Flush到HFile的更改(edits)。 默认情况下每个RegionServer只会写一个日志文件,该RS管理的所有region都在向这一个日志文件写入Put和Delete记录,直到日志文件大小达到128MB(由**hbase.regionserver.hlog.blocksize**设置)后roll出一个新的日志文件,总共可以roll出32个日志文件(由**hbase.regionserver.maxlogs**设置)。 如果日志文件未写满128MB,RegionServer间隔1小时也会roll出新一个新日志文件(由**hbase.regionserver.logroll.period**设置)。 当日志文件中涉及的所有region的记录都flush成HFile后,这个日志文件就会转移至oldWals目录下归档, Master没间隔10分钟(**hbase.master.cleaner.interval**)会检查oldWALs目录下的过期日志文件,当文件过期时会被Master清理掉,(日志过期时间由**hbase.master.logcleaner.ttl**控制)。 RegionServer默认间隔1小时(由**hbase.regionserver.optionalcacheflushinterval**设置)会对它管理的region做一次flush动作,所以WALs目录中一直会有新的日志文件生成,并伴随着老的日志文件移动到oldWALs目录中。 ## 迁移方式 ### 一、迁移oldWALs目录中的文件,使用WALPlayer回放 由于日志文件文件最终移动到oldWALs目录下,只需要写个脚本,定时检查oldWALs目录下是否有新文件生成,如果有文件,则move至其他目录,并使用WALPlayer工具对这个目录进行回放。 优点:无代码开发量,仅需脚本实现 缺点:无法做到实时,因为从数据写入到最后到达oldWAL目录会间隔很长时间。 ### 二、开发独立工具,解析日志文件,写入目的集群 在网上查找迁移方法的时候了解到了阿里开发了一个专门的HBase迁移工具,可以实现不停机。通过阅读其设计[BDS - HBase数据迁移同步方案的设计与实践](#)了解到阿里开发了应用去读取HBase的WAL日志文件并回放数据至目的集群。 优点:可以做到实时; 缺点:需要一定的代码开发量; 要做出这样一个工具,需要了解上面说的WAL文件归档的原理以及日志回放工具WALPlayer,下面简单说一下可以怎么去实现。 ### 独立工具实现 这里简单说明下如何去做这样一个工具,只介绍读取WAL方面,任务编排就不描述了 1. 定时扫描WALs目录获取所有的日志文件,这里按ServerName去分组获取,每个分组内根据WAL文件上的时间戳排序; ● 获取所有RS的ServerName ``` ClusterStatus clusterStatus = admin.getClusterStatus(); Collection serverNames = clusterStatus.getServers(); ``` ● 根据ServerName去组成Path获取日志 ``` Path rsWalPath = new Path(walPath, serverName.getServerName()); List hlogs = getFiles(fs, rsWalPath, Long.MIN_VALUE, Long.MAX_VALUE); ``` ● getFiles()参考HBase源码中WALInputFormat.java中的实现,可以指定时间范围去取日志文件 ``` private List getFiles(FileSystem fs, Path dir, long startTime, long endTime) throws IOException { List result = new ArrayList(); LOG.debug("Scanning " + dir.toString() + " for WAL files"); FileStatus[] files = fs.listStatus(dir); if (files == null) return Collections.emptyList(); for (FileStatus file : files) { if (file.isDirectory()) { // recurse into sub directories result.addAll(getFiles(fs, file.getPath(), startTime, endTime)); } else { String name = file.getPath().toString(); int idx = name.lastIndexOf('.'); if (idx > 0) { try { long fileStartTime = Long.parseLong(name.substring(idx+1)); if (fileStartTimeLettle whale 发表于2021-04-20 16:58:45 2021-04-20 16:58:45 最后回复 Lettle whale 2021-04-20 16:58:452828 0
-
在进行大数据迁移过程中,往往老集群上还会不断地生产新文件,当老集群上整体数据量不大的时候,可以直接借助CDM的全量扫描+跳过重复文件的方式来迁移新增的文件。但是当老集群上数据量较大(比如>1PB以上,又存在大量小文件5千万以上甚至上亿个),CDM的全量扫描会耗费大量时间,搬迁效率较低。因此本文给出了一种借助HDFS审计日志解析来识别出增量的文件范围,然后将该列表输出给CDM,由CDM只按照列表中的文件进行迁移的方法,可以在增量文件迁移期间,避免全量扫描老集群的文件。 以下的操作步骤实际操作过程中可以考虑自行开发脚本自动定时运行。 操作方式: 将HDFS namenode审计日志定期上传到HDFS或OBS,由Hive分区表加载每天的日志信息。通过hive sql查询获取每天或者某个时间段之后的新增的文件列表。 (1) 按照每天一个文件夹方式,借助公有云的hdfs客户端或者Obsutil 上传HDFS namenode审计日志到公有云HDFS或者OBS路径下。hdfs dfs –put 2020-07-06 /user/audit/2020-07-06/ -r(2) 在公有云集群上创建Hive分区表,以日期作为主键,表名可以自己指定,当前演示的表名叫audit. 备注:由于HDFS审计日志格式不同集群可能配置输出不一致,表中各个字段需要根据实际HDFS审计日志的格式进行修改调整CREATE TABLE `audit`( `allow` String, `ugi` string, `ip` string, `cmd` string, `src` string, `dst` string, `perm` string, `proto` string) partitioned by(`date_time` string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ; (3) 加载每天的分区数据到Hive表中 LOAD DATA INPATH '/user/audit/2020-07-06/' INTO TABLE audit PARTITION (date_time = '2020-07-06');(4) 查询某天,或者某个时间段的新增文件列表, 并将输出结果写到OBS路径上 // create 过滤掉.hive-staging 和_temporary临时文件 INSERT OVERWRITE DIRECTORY 'obs://obs-auditlog-chenkaifeng/auditlog/output-2020-07-08' select regexp_extract(src,'src=(.*)',1) as output from audit where src like 'src=/apps/hive/warehouse%' and src not rlike '.*/\.hive-staging.*' and src not rlike '.*/_.*' and cmd='cmd=create' and date_time>='2020-07-06'; // rename结果 INSERT OVERWRITE DIRECTORY 'obs://obs-auditlog-chenkaifeng/auditlog/output-2020-07-08' select regexp_extract(dst,'dst=(.*)',1) as output from audit where dst like 'dst=/apps/hive/warehouse%' and dst not rlike '.*/\.hive-staging_hive_.*' and dst not rlike '.*/_.*' and cmd='cmd=rename' and date_time>='2020-07-06' // apend INSERT OVERWRITE DIRECTORY 'obs://obs-auditlog-chenkaifeng/auditlog/output-2020-07-08' select regexp_extract(src,'src=(.*)',1) as output from audit where src like 'src=/apps/hive/warehouse%' and src not rlike '.*/\.hive-staging_hive_.*' and src not rlike '.*/_.*' and cmd='cmd=append' and date_time>='2020-07-06';(5) 查找某天或某个时间段的删除文件列表SQL,并将输出结果存到OBS//查询删除语句delete INSERT OVERWRITE DIRECTORY 'obs://obs-auditlog-chenkaifeng/auditlog/output-2020-07-08' select regexp_extract(src,'src=(.*)',1) as output from audit where src like 'src=/apps/hive/warehouse%' and src not rlike '.*/\.hive-staging.*' and src not rlike '.*/_.*' and cmd='cmd=delete' and date_time>='2020-07-06'; //rename操作引起的删除 INSERT OVERWRITE DIRECTORY 'obs://obs-auditlog-chenkaifeng/auditlog/output-2020-07-08' select regexp_extract(src,'src=(.*)',1) as output from audit where src like 'src=/apps/hive/warehouse%' and src not rlike '.*/\.hive-staging.*' and src not rlike '.*/_.*' and cmd='cmd=rename' and date_time>='2020-07-06'; (6)配置CDM作业在CDM(华为云云迁移服务)作业上选择步骤4中输出的新增文件列表作为迁移的范围,进行新增文件迁移。
-
在HBase 1.x中,经常会遇到元数据不一致的情况,这个时候使用HBCK的命令,可以快速修复元数据,让集群恢复正常。另外HBase数据迁移时,大家经常使用到一种迁移方式是:拷贝HBase的数据目录/hbase/data/default到新的集群,然后在新集群执行HBCK的命令让元数据重建,这种拷贝数据目录然后恢复元数据的方式是一种快速直接的手段。HBase升级到2.X版本之后,hbase hbck中的一些修复命令已经不再支持,包括,所以在HBase遇到集群故障,无法通过HBCK快速把元数据修复,通过HBase数据目录迁移的方式也就使用不了。在HBase 2.X的客户端执行hbase hbck时,常用的fixMeta命令已经不再支持。原文地址:https://bbs.huaweicloud.com/blogs/199075
上滑加载中
推荐直播
-
全面解析华为云EI-API服务:理论基础与实践应用指南
2024/11/29 周五 18:20-20:20
Alex 华为云学堂技术讲师
本期直播给大家带来的是理论与实践结合的华为云EI-API的服务介绍。从“主要功能,应用场景,实践案例,调用流程”四个维度来深入解析“语音交互API,文字识别API,自然语言处理API,图像识别API及图像搜索API”五大场景下API服务,同时结合实验,来加深开发者对API服务理解。
回顾中 -
企业员工、应届毕业生、在读研究生共探项目实践
2024/12/02 周一 19:00-21:00
姚圣伟 在职软件工程师 昇腾社区优秀开发者 华为云云享专家 HCDG天津地区发起人
大神带你一键了解和掌握LeakyReLU自定义算子在ONNX网络中应用和优化技巧,在线分享如何入门,以及在工作中如何结合实际项目进行学习
即将直播 -
昇腾云服务ModelArts深度解析:理论基础与实践应用指南
2024/12/03 周二 14:30-16:30
Alex 华为云学堂技术讲师
如何快速创建和部署模型,管理全周期AI工作流呢?本期直播聚焦华为昇腾云服务ModelArts一站式AI开发平台功能介绍,同时结合基于ModelArts 的实践性实验,帮助开发者从理论到实验更好地理解和使用ModelArts。
去报名
热门标签