-
原文地址: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
-
【功能模块】【操作步骤&问题现象】1、flink消费kafka数据输出到hbase中,写不进hbase中,报错信息如下:com.huawei.bigdata.flink.examples.outputs.HbaseSink2 (HbaseSink2.java:132) java.io.InterruptedIOException: Giving up trying to location region in meta: thread is interrupted. at org.apache.hadoop.hbase.client.ConnectionImplementation.locateRegionInMeta(ConnectionImplementation.java:973) at org.apache.hadoop.hbase.client.ConnectionImplementation.locateRegion(ConnectionImplementation.java:790) at org.apache.hadoop.hbase.client.HRegionLocator.getRegionLocation(HRegionLocator.java:64) at org.apache.hadoop.hbase.client.RegionLocator.getRegionLocation(RegionLocator.java:58) at org.apache.hadoop.hbase.client.RegionLocator.getRegionLocation(RegionLocator.java:47) at org.apache.hadoop.hbase.client.RegionServerCallable.prepare(RegionServerCallable.java:223) at org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.callWithRetries(RpcRetryingCallerImpl.java:107) at org.apache.hadoop.hbase.client.HTable.put(HTable.java:540) at com.huawei.bigdata.flink.examples.outputs.HbaseSink2.invoke(HbaseSink2.java:128) at com.huawei.bigdata.flink.examples.outputs.HbaseSink2.invoke(HbaseSink2.java:29) at org.apache.flink.streaming.api.operators.StreamSink.processElement(StreamSink.java:56) at org.apache.flink.streaming.runtime.tasks.OperatorChain$CopyingChainingOutput.pushToOperator(OperatorChain.java:641) at org.apache.flink.streaming.runtime.tasks.OperatorChain$CopyingChainingOutput.collect(OperatorChain.java:616) at org.apache.flink.streaming.runtime.tasks.OperatorChain$CopyingChainingOutput.collect(OperatorChain.java:596) at org.apache.flink.streaming.api.operators.AbstractStreamOperator$CountingOutput.collect(AbstractStreamOperator.java:734) at org.apache.flink.streaming.api.operators.AbstractStreamOperator$CountingOutput.collect(AbstractStreamOperator.java:712) at org.apache.flink.streaming.api.operators.StreamSourceContexts$NonTimestampContext.collect(StreamSourceContexts.java:104) at org.apache.flink.streaming.api.operators.StreamSourceContexts$NonTimestampContext.collectWithTimestamp(StreamSourceContexts.java:111) at org.apache.flink.streaming.connectors.kafka.internals.AbstractFetcher.emitRecordWithTimestamp(AbstractFetcher.java:398) at org.apache.flink.streaming.connectors.kafka.internal.KafkaFetcher.emitRecord(KafkaFetcher.java:185) at org.apache.flink.streaming.connectors.kafka.internal.KafkaFetcher.runFetchLoop(KafkaFetcher.java:150) at org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumerBase.run(FlinkKafkaConsumerBase.java:715) at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:100) at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:63) at org.apache.flink.streaming.runtime.tasks.SourceStreamTask$LegacySourceFunctionThread.run(SourceStreamTask.java:196)2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】【操作步骤&问题现象】1、我在原有flink连接kafka的example中写了一个sinkHbase的代码(说明:运行原来flink连接kafka样例代码没有任何问题),之后进行测试,我将所需要的jar包都上传到flink/lib下面了,然后运行代码报:Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.HBaseConfiguration,具体报错信息如下所示:2、【截图信息】【日志信息】(可选,上传日志内容或者附件)beautiful idea 发表于2021-04-09 14:38:57 2021-04-09 14:38:57 最后回复 beautiful idea 2021-04-14 17:21:5411082 7
-
【功能模块】【操作步骤&问题现象】1、hbase 在linux上运行样例代码报错:2021-04-06 14:36:05,949 INFO [main] examples.HBaseSample: Entering testCreateTable.2021-04-06 14:36:06,575 WARN [main] examples.HBaseSample: table already exists2021-04-06 14:36:06,576 INFO [main] examples.HBaseSample: Exiting testCreateTable.2021-04-06 14:36:06,576 INFO [main] examples.HBaseSample: Entering testMultiSplit.2021-04-06 14:36:06,678 ERROR [main] client.HBaseAdmin: Splits are not inside region key range. Abort multisplit2021-04-06 14:36:06,679 ERROR [main] examples.HBaseSample: MultiSplit failedorg.apache.hadoop.hbase.DoNotRetryIOException: Region multi split failed, splitkeys are not within the region boundary. at org.apache.hadoop.hbase.client.HBaseAdmin.checkAndSortSplitKeys(HBaseAdmin.java:1984) at org.apache.hadoop.hbase.client.HBaseAdmin.multiSplit(HBaseAdmin.java:1937) at org.apache.hadoop.hbase.client.HBaseAdmin.multiSplit(HBaseAdmin.java:1904) at org.apache.hadoop.hbase.client.HBaseAdmin.multiSplitSync(HBaseAdmin.java:2100) at com.huawei.bigdata.hbase.examples.HBaseSample.testMultiSplit(HBaseSample.java:181) at com.huawei.bigdata.hbase.examples.HBaseSample.test(HBaseSample.java:78) at com.huawei.bigdata.hbase.examples.TestMain.main(TestMain.java:48)2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】生产 c70集群 hbase模块【操作步骤&问题现象】同样的代码生产环境1、用java客户端get请求查询hbase,首次查询等待40s秒后出现超时,但接下后续查询就很正常,几十毫秒就可以查到结果2、但如果在上次成功查询后,两分钟后 再去get请求hbase,依旧等待40s后出现超时异常,后面的请求正常测试环境无超时情况,但是首次和间隔两分钟这种get请求,时间稍微久了点
-
使用MRS 3.0.5安装(包含了hbase组件),为何在master1上找不到hbase命令?参考文档:https://support.huaweicloud.com/cmpntguide-mrs/bakmrs_01_0368.html
-
请问,华为云 MRS 集群上的HBASE存储的数据如何做到落盘加密呢? 我看购买MRS 2.1版本时有整盘加密选项,到MRS 3.0 这个选项就没有了。 搜华为文档,发现可以自行配置加密 https://support.huaweicloud.com/usermanual-mrs/admin_guide_000276.html, 但似乎又不推荐。那么今后华为MRS HBASE 落盘加密的规划是怎样的? 是以后会支持整盘加密,还是支持用户通过配置HFile WAL加密?谢谢
-
当前许多用户都是自建集群,对于自建集群,需要有完善的监控才能有效的维护hbase集群,Prometheus+Grafana是当前比较成熟和有效的监控解决方案,下文介绍了如何使用Prometheus+Grafana搭建监控,https://bbs.huaweicloud.com/blogs/249325
-
HBase实用技巧:一种全量+增量数据的迁移方法
-
问题分析 查看regionserver的运行日志(/var/log/Bigdata/hbase/rs/hbase-omm-regionserver-xxx.log)发现报错连接主机失败,原因是主机名后多了.localhost;2. /etc/resolv.conf文件中多了一行search localhost。 问题解决参考 将/ect/resolv.conf文件中的search localhost注释掉重启服务恢复。
-
问题分析 查看regionserver的.out(/var/log/Bigdata/hbase/rs/hbase-omm-regionserver-xxx.out)日志发现重启是由于jvm crash。查看hs_err_pid.log日志,显示异常堆栈未0xb4。问题根因ARM服务器上,openjdk已知bug。简单来说,就是CMS代码中存在逻辑:1.load oop 2.load oop->class 3.load->class.field,这三步本身是需要包再时序的,但是事实上,在arm上由于弱内存续,实际的实行顺序有可能是2/3/1或者2/1/3,这样就没办法保证每一步取到的都是正确的数据,一旦取到的数据有问题,就可能被当作一个地址去做访问二,就SIGSEGV了。问题解决参考 不使用CMS算法。
-
问题分析 排查regionserver运行日志(/var/log/Bigdata/hbase/rs/hbase-omm-regionserver-xxx.log),异常重启的原因为连不上zookeeper集群。查看zookeeper GC日志与运行日志。发现zookeeper gc 日志中存在Full GC打印。问题解决参考 ZooKeeper实例Full GC导致RegionServer连不上zookeeper,需要增大ZooKeeper的GC配置。FI界面修改quorumpeer的GC配置如下,修改完后保存配置,重启zookeeper服务。
-
问题分析查看异常重启的regionserver的hbase.out(/var/log/Bigdata/hbase/rs/hbase-omm-regionserver-xxx.out)日志显示重启原因为jvm crash。查看对应hs_err_pid.log所有显示异常时堆栈再0x43。GC参数配置xmx 41G,表压缩算法ZSTD,两个条件共存时会导致RegionServer重启异常,其中一个不满足,不会触发该问题。问题解决参考 修改GC配置在31G以下或者将表的压缩算法改成其他的。
-
问题分析查看对应RegionServer运行日志(/var/log/Bigdata/hbase/rs/hbase-omm-regionserver-xxx.log),报错在hdfs如下目录下找不到协处理器jar包。File does not exits:hdfs://hacluster/user/CORLU81NETMLB/bulkload/indexProcessor/Coprocessor.jarRegionServer协处理器jar包放置目录不对,导致RegionServer无法加载到协处理器异常重启。问题解决参考 disable使用这个协处理器的表,将协处理器放到对应的hdfs的目录下,重启RegionServer,重新enable表。
上滑加载中
推荐直播
-
OpenHarmony应用开发之网络数据请求与数据解析
2025/01/16 周四 19:00-20:30
华为开发者布道师、南京师范大学泰州学院副教授,硕士研究生导师,开放原子教育银牌认证讲师
科技浪潮中,鸿蒙生态强势崛起,OpenHarmony开启智能终端无限可能。当下,其原生应用开发适配潜力巨大,终端设备已广泛融入生活各场景,从家居到办公、穿戴至车载。 现在,机会敲门!我们的直播聚焦OpenHarmony关键的网络数据请求与解析,抛开晦涩理论,用真实案例带你掌握数据访问接口,轻松应对复杂网络请求、精准解析Json与Xml数据。参与直播,为开发鸿蒙App夯实基础,抢占科技新高地,别错过!
回顾中 -
Ascend C高层API设计原理与实现系列
2025/01/17 周五 15:30-17:00
Ascend C 技术专家
以LayerNorm算子开发为例,讲解开箱即用的Ascend C高层API
回顾中
热门标签