-
【操作步骤&问题现象】避免网络波动引起的时间问题,想增加这个时间是修改hbase.regionserver.maxclockskew就可以还是说同时要改hbase.master.wait.on.regionservers.timeout?现场调整后重启报错这一台的regionserver发现没有效果为什么?Reported time is too far out of sync with master. Time difference of 37232ms > max allowed of 30000ms
-
1.1 介绍本文根据鲲鹏计算工具链项目组的工具化软件迁移经验,总结了该工具软件包重构功能的实际使用经验,期望能帮助开发者了解如何使用此功能,并提高开发者的软件迁移效率。本次实践总结用到的是鲲鹏代码迁移工具(Porting Advisor)以下两个功能:l 软件迁移评估扫描x86平台软件安装包,识别安装包对系统SO的依赖和包内部的SO、JAR依赖,支持的软件安装包格式包括RPM、DEB、JAR、WAR、ZIP、TAR、GZIP。l 软件包重构根据开发者提供的资源包和x86安装包(RPM/DEB),执行资源包相关的SO库、JAR包的替换,构建生成可用于鲲鹏平台部署的软件包。1.2 环境要求根据软件包重构功能的平台依赖性,需要准备一套鲲鹏环境。本文实际使用了如下环境:项目说明服务器TaiShan 200 2280 服务器CPU鲲鹏920 96核处理器OSCentOS 7.6安装的工具Porting Advisor 2.2.T3使用场景l 软件迁移评估l 软件包重构 1.3 前提条件1. 服务器和操作系统正常运行。2. PC端已经安装SSH远程登录工具。3. Porting Advisor已在准备好的鲲鹏平台环境中完成安装并正常运行。4. 待重构的相关软件包已准备就绪。1.4 重构计划本文通过开源软件HBase的软件包重构案例总结,帮助读者了解如何使用鲲鹏代码迁移工具的软件包重构功能。1. 利用“软件迁移评估”功能对获取到的hbase_2_5_5_0_157-1.1.2.2.5.5.0-157.el6.noarch.rpm进行扫描,获取其依赖关系和可迁移性分析结果。2. 根据“软件迁移评估”功能分析得到的hbase_2_5_5_0_157-1.1.2.2.5.5.0-157.el6.noarch.rpm依赖关系,准备重构鲲鹏平台RPM包时需要的SO库和JAR包。3. 利用准备好的资源包和RPM包,通过“软件包重构”功能,完成鲲鹏版本hbase_2_5_5_0_157-1.1.2.2.5.5.0-157.el6.noarch.rpm的RPM包重构工作。4. 展示在鲲鹏HDP解决方案环境下如何对重构得到的鲲鹏版本hbase_2_5_5_0_157-1.1.2.2.5.5.0-157.el6.noarch.rpm包进行简单的功能验证。1.5 重构HBase软件包1.5.1 软件迁移评估 步骤 1 先获取待使用的RPM包。图1-1 获取RPM包 本例中需要用到的RPM包为hbase_2_5_5_0_157-1.1.2.2.5.5.0-157.el6.noarch.rpm。即存在于HDP-2.5.5.0-centos7-rpm.tar.gz解压后得到的“hdp2.5.5\centos7\hbase”目录下。图1-2 RPM包名 步骤 2 单击左侧导航中的“软件迁移评估”,并在右侧勾选“分析软件包”,单击“上传”,上传前面下载到的RPM包,上传完成后单击“开始分析”。图1-3 分析软件包 步骤 3 查看分析报告。图1-4 分析报告 ----结束1.5.2 准备依赖库图1-5 依赖库 从扫描分析报告提供的依赖库信息看,所依赖的包中,有6个是安装过程中需要的外部依赖相关的软件包,有4个被扫描的RPM包内包含JAR包。报告中针对RPM包内包含的JAR包提供了华为鲲鹏产品官方maven仓库中的下载链接,在联网的情况下直接点击下载即可。也可在步骤3中的软件包重构过程中,通过允许网络下载,将依赖文件自动下载到依赖文件存放路径。1.5.3 重构软件包 步骤 1 单击左侧导航中的“软件包重构”,并在右侧第①步单击“上传”,将hbase_2_5_5_0_157-1.1.2.2.5.5.0-157.el6.noarch.rpm上传到服务器后台路径“/opt/portadv/portadmin/packagerebuild/”。图1-6 软件包重构 步骤 2 通过第②步“上传”按钮将jruby-complete-1.6.8.jar, snappy-java-1.0.4.1.jar ,leveldbjni-all-1.8.jar, netty-all-4.0.23.Final.jar上传到服务器后台路径“/opt/portadv/portadmin/data/”中。图1-7 上传文件 也可通过提前配置外部网络访问权限,并且勾选“授权访问外部网络获取重构软件包需要的依赖文件”,在重构过程中系统自动将依赖文件下载并替换,无需用户提前下载准备。图1-8 通过外网获取依赖文件 步骤 3 在第③步单击“确认重构”。图1-9 确认重构 系统自动进行重构。图1-10 重构进度 步骤 4 重构成功后,单击“下载重构软件包”按钮即可下载重构好的软件包hbase_2_5_5_0_157-1.1.2.2.5.5.0-157.el6.aarch64.rpm,也可以通过“历史记录”列表下载软件包。图1-11 下载重构软件包 步骤 5 通过rpm -V和rpm -ivh两个命令可以大致检查一下重构后的RPM包的完整性。图1-12 检查RPM包完整性 从上面的截图看,检查过程没有报错,重构后的RPM包是完整可用的。----结束1.6 重构后验证HBase安装包在鲲鹏环境安装时,需要依赖hadoop_2_5_5_0_157-hdfs、zookeeper_2_5_5_0_157、ranger_2_5_5_0_157-hbase-plugin等包,读者在执行本章节验证前,需自行搜索相关包完成环境搭建工作,在相关的环境依赖具备条件下,HBase的安装只需要通过最普通的RPM包安装命令(rpm –ivh xx.rpm)即可完成。故环境搭建步骤省略,本节重点介绍环境搭建后如何进行功能验证。 步骤 1 进入HBase命令行模式。hbase shell图1-13 进入HBase命令行 步骤 2 创建命名空间。create_namespace "test" 步骤 3 查看命名空间。list_namespace图1-14 查看空间命名 步骤 4 新建命名空间中的表。create "test:student","info1","info2"图1-15 新建表 步骤 5 向测试表中添加数据。put "test:student","rk001","info1:name","xx1"图1-16 添加数据 步骤 6 查看数据。scan 'test:student'图1-17 查看数据 通过上述步骤可以简单的验证已经迁移的HBase软件包,在搭建好的HBase环境中可以进行基本功能的使用。----结束
-
根据上图本课程学习通过链路1,使用客户端访问HetuEgine做链路2,链路3的hive, hbase数据源跨源融合分析1. 准备hive样例数据登录客户端 source /opt/client/bigdata_env创建hdfs路径 hdfs dfs -mkdir -p /tmp/people上传数据文件hdfs dfs -put people.txt /tmp/people/people.txt文件内容12345|jack|m|33|22345|gary|m|44|32345|eddi|m|55|42345|lina|f|66|52345|zhou|f|77|使用beeline登陆hive客户端创建表CREATE EXTERNAL TABLE `people`( `rowid` string, `name` string, `sex` string, `age` int) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim'='|', 'serialization.format'='|') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'hdfs://hacluster/tmp/people' TBLPROPERTIES ( 'STATS_GENERATED_VIA_STATS_TASK'='workaround for potential lack of HIVE-12730', 'bucketing_version'='2', 'serialization.null.format'='', 'transient_lastDdlTime'='1616490878');2. 登陆hetu客户端hetu-cliselect hbase.default.test6;select hive.default.people;select * from hive.default.people h1 inner join hbase.default.test6 h2 on h1.rowid=h2.rowid;视频
-
根据上图本课程学习链路3,如何配置hbase数据源,并通过链路1,通过客户端直接访问hbase数据源1. 在HetuEngine Console页面增加HBase数据源,并且配置参考产品文档《组件操作指南》->《HetuEngine》->《通过HetuEngine HSConsole配置数据源》-> 《配置HBase数据源》2. 登陆HBase客户端,创建HBase实体表hbase shellcreate 'test6', 'cf'使用以下命令写入hbase数据put 'test6', '12345', 'cf:province', '湖南'put 'test6', '12345', 'cf:jizhanid', '001'put 'test6', '12345', 'cf:date', '2021-3-29 17:23:55' put 'test6', '22345', 'cf:province', '湖北'put 'test6', '22345', 'cf:jizhanid', '002'put 'test6', '22345', 'cf:date', '2021-3-28 16:23:55' put 'test6', '32345', 'cf:province', '河南'put 'test6', '32345', 'cf:jizhanid', '001'put 'test6', '32345', 'cf:date', '2021-3-27 15:23:55' put 'test6', '42345', 'cf:province', '河北'put 'test6', '42345', 'cf:jizhanid', '001'put 'test6', '42345', 'cf:date', '2021-3-26 14:23:55' put 'test6', '52345', 'cf:province', '北京'put 'test6', '52345', 'cf:jizhanid', '001'put 'test6', '52345', 'cf:date', '2021-3-25 13:23:55'3.在HetuEngine客户端创建映射表hetu-clishow catalogs;show schemas from hbase;use hbase.default;使用以下SQL创建映射表CREATE TABLE default.test6 ( rowId VARCHAR, province VARCHAR, jizhanid INTEGER, date VARCHAR)WITH (column_mapping = 'province:cf:province,jizhanid:cf:jizhanid,date:cf:date',row_id = 'rowId',hbase_table_name = 'default:test6',external = true);查询HBase表select * from hbase.default.test6视频https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/fusioninsight/1629947280918076976.mp4
-
作者:林军军、彭成寒编者按:笔者在 HBase 业务场景中尝试将 JDK 从 8 升级到 11,使用 G1 GC 作为垃圾回收器,但是性能下降 20%。到底是什么导致了性能衰退?又该如何定位解决?本文介绍如果通过使用 JFR、火焰图等工具确定问题,最后通过版本逐一验证找到了引起性能问题的代码。在毕昇 JDK 中率先修复问题最后将修复推送到上游社区中。希望通过本文的介绍让读者了解到如何解决大版本升级中遇到的性能问题;同时也提醒 Java 开发者要正确地使用参数(使用前要理解参数的含义)。HBase 从 2.3.x 开始正式默认的支持 JDK 11,HBase 对于 JDK 11 的支持指的是 HBase 本身可以通过 JDK 11 的编译、同时相关的测试用例全部通过。由于 HBase 依赖 Hadoop 和 Zookeeper,而目前 Hadoop 和 Zookeeper 尚未支持 JDK 11,所以 HBase 中仍然有一个 jira 来关注 JDK 11 支持的问题:https://issues.apache.org/jira/browse/HBASE-22972。G1 GC 从 JDK 9 以后就成为默认的 GC,而且 HBase 在新的版本中也采用 G1 GC,对于 HBase 是否可以在生产环境中使用 JDK 11?笔者尝试使用 JDK 11 来运行新的 HBase,验证 JDK 11 是否比 JDK 8 有优势。 1 环境介绍验证的方式非常简单,搭建一个 3 节点的 HBase 集群,安装 HBase,采用的版本为 2.3.2,关于 HBase 环境搭建可以参考官网。另外为了验证,使用一个额外的客户端机器,通过 HBase 自带的 PerformanceEvaluation 工具(简称 PE)来验证 HBase 读、写性能。PE 支持随机的读、写、扫描,顺序读、写、扫描等。例如一个简单的随机写命令如下:hbase org.apache.hadoop.hbase.PerformanceEvaluation --rows=10000 --valueSize=8000 randomWrite 5该命令的含义是:创建 5 个客户端,并且执行持续的写入测试。每个客户端每次写入 8000 字节,共写入 10000 行。PE 使用起来非常简单,是 HBase 压测中非常流行的工具,关于 PE 更多的用法可以参考相关手册。本次测试为了验证读写性能,采用如下配置:org.apache.hadoop.hbase.PerformanceEvaluation --writeToWAL=true --nomapred --size=256 --table=Test1 --inmemoryCompaction=BASIC --presplit=50 --compress=SNAPPY sequentialWrite 120JDK 采用 JDK 8u222 和 JDK 11.0.8 分别进行测试,当切换 JDK 时,客户端和 3 台 HBase 服务器统一切换。JDK 的运行参数为:-XX:+PrintGCDetails -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:-ResizePLAB注意:这里禁止 ResizePLAB 是业务根据 HBase 优化资料设置。 2 测试结果:JDK 11性能下降通过 PE 进行测试,运行结束有 TPS 数据,表示性能。在相同的硬件环境、相同的 HBase,仅仅使用不同的 JDK 来运行。同时为了保证结果的准确性,多次运行,取平均值。测试结果如下:从表中可以快速地计算得到吞吐量下降,运行时间增加。结论:使用 G1 GC,JDK 11 相对于 JDK 8 来说性能明显下降。3 原因分析从 JDK 8 到 JDK 11, G1 GC 做了非常多的优化用于提高性能。为什么 JDK 11 对于应用者来说更不友好?简单的总结一下从 JDK 8 到 JDK 11 做的一些比较大的设计变化,如下表所示:优化点描述IHOP 启发式设置IHOP 用于控制并发标记的启动时机,在 JDK 9 中引入该优化,根据应用运行的情况,计算 IHOP 的值,确保在内存耗尽之前启动并发标记。对于性能和运行时间理论上都是正优化,特殊情况下可能会导致性能下降Full GC 的并行话在 JDK10 中将 Full GC 从串行实现优化为并行实现,该优化不会产生负面影响动态线程调整根据 GC 工作线程的负载情况,引入动态的线程数来处理任务。该优化会带来正效果,注意不是 GC 工作线程数目越多 GC 的效果越好(GC 会涉及到多线程的任务窃取和同步机制,过多的线程会导致性能下降)引用集的重构引用集处理优化,设置处理大小、将并行修改为并发等由于从 JDK 8 到 JDK 11 特性变化太多,对于这样的性能下降问题,为了能快速有效的解决,我们做了如下的尝试。3.1 统一 JDK 8 和 JDK 11 的参数,验证效果由于 JDK 11 和 JDK 8 实现变化很多,部分功能完全不同,但是这些变化的功能一般都有参数控制,一种有效的尝试:梳理 JDK 8 和 JDK 11 关于 G1 的参数,将它们设置为相同的值,比如关闭 IHOP 的自适应,关闭线程调整等。这里简单的给出 JDK 8 和 JDK 11 不同参数的比较,如下图所示:将两者参数都设置为和 JDK 8 一样的值,重新验证测试,结果不变,JDK 11 性能仍然下降。3.2 GC日志分析,确定JDK 11性能下降点对于 JDK 8 和 JDK 11 同时配置日志收集功能,重新测试,获得 GC 日志。通过 GC 日志分析,我们发现差异主要在 G1 young gc 的 object copy 阶段(耗时基本在这),JDK 11 的 Young GC 耗时大概 200ms,JDK 8 的 Young GC 耗时大概 100ms,两者设置的目标停顿时间都是 100ms。JDK 11 中 GC 日志片段:JDK 8中 GC 日志片段:我们对整个日志做了统计,有以下发现:并发标记时机不同,混合回收的时机也不同;单次 GC 中对象复制的耗时不同,JDK 11 明显更长;总体 GC 次数 JDK 11 的更多,包括了并发标记的停顿次数;总体 GC 的耗时 JDK 11 更多。针对 Young GC 的性能劣化,我们重点关注测试了和 Young GC 相关的参数,例如:调整 UseDynamicNumberOfGCThreads、G1UseAdaptiveIHOP 、GCTimeRatio 均没有效果。下面我们尝试使用不同的工具来进一步定位到底哪里出了问题。3.3 JFR分析-确认日志分析结果毕昇 JDK 11和毕昇 JDK 8 都引入了 JFR,JFR 作为 JVM 中问题定位的新贵,我们也在该案例进行了尝试,关于JFR的原理和使用,参考本系列的技术文章:Java Flight Recorder - 事件机制详解。3.3.1 JDK 11总体信息JDK 8 中通过 JFR 收集信息。3.3.2 JDK 8总体信息JFR 的结论和我们前面分析的结论一致,JDK 11 中中断比例明显高于 JDK 8。3.3.3 JDK 11中垃圾回收发生的情况3.3.4 JDK 8中垃圾回收发生的情况从图中可以看到在 JDK 11 中应用消耗内存的速度更快(曲线速率更为陡峭),根据垃圾回收的原理,内存的消耗和分配相关。 3.3.5 JDK 11中VM操作3.3.6 JDK 8中VM操作通过 JFR 整体的分析,得到的结论和我们前面的一致,确定了 Young GC 可能存在问题,但是没有更多的信息。3.4 火焰图-发现热点为了进一步的追踪 Young GC 里面到底发生了什么导致对象赋值更为耗时,我们使用Async-perf 进行了热点采集。关于火焰图的使用参考本系列的技术文章:使用 perf 解决 JDK8 小版本升级后性能下降的问题。3.4.1 JDK 11的火焰图3.4.2 JDK 11 GC部分火焰图 3.4.3 JDK 8的火焰图3.4.4 JDK 8 GC部分火焰图通过分析火焰图,并比较 JDK 8 和 JDK 11 的差异,可以得到:在 JDK 11 中,耗时主要在:G1ParEvacuateFollowersClosure::do_void()G1RemSet::scan_rem_set 在 JDK 8 中,耗时主要在:G1ParEvacuateFollowersClosure::do_void()更一步,我们对 JDK 11 里面新出现的 scan_rem_set() 进行更进一步分析,发现该函数仅仅和引用集相关,通过修改 RSet 相关参数(修改 G1ConcRefinementGreenZone ),将 RSet 的处理尽可能地从Young GC的操作中移除。火焰图中参数不再成为热点,但是 JDK 11 仍然性能下降。比较 JDK 8 和 JDK 11 中 G1ParEvacuateFollowersClosure::do_void() 中的不同,除了数组处理外其他的基本没有变化,我们将 JDK 11 此处的代码修改和 JDK 8 完全一样,但是性能仍然下降。结论:虽然 G1ParEvacuateFollowersClosure::do_void() 是性能下降的触发点,但是此处并不是问题的根因,应该是其他的原因造成了该函数调用次数增加或者耗时增加。 3.5 逐个版本验证-最终确定问题我们分析了所有可能的情况,仍然无法快速找到问题的根源,只能使用最笨的办法,逐个版本来验证从哪个版本开始性能下降。在大量的验证中,对于 JDK 9、JDK 10,以及小版本等都重新做了构建(关于 JDK 的构建可以参考官网),我们发现 JDK 9-B74 和 JDK 9-B73 有一个明显的区别。为此我们分析了 JDK 9-B73 合入的代码。发现该代码和 PLAB 的设置相关,为此梳理了所有 PLAB 相关的变动:B66 版本为了解决 PLAB size 获取不对的问题(根据 GC 线程数量动态调整,但是开启 UseDynamicNumberOfGCThreads 后该值有问题,默认是关闭)修复了 bug。具体见 jira:Determining the desired PLAB size adjusts to the the number of threads at the wrong placeB74 发现有问题(desired_plab_sz 可能会有相除截断问题和没有对齐的问题),重新修改,具体见 8079555: REDO - Determining the desired PLAB size adjusts to the the number of threads at the wrong placeB115 中发现 B74 的修改,动态调整 PLAB 大小后,会导致很多情况 PLAB 过小(大概就是不走 PLAB,走了直接分配),频繁的话会导致性能大幅下降,又做了修复 Net PLAB size is clipped to max PLAB size as a whole, not on a per thread basis 重新修改了代码,打印 PLAB 的大小。对比后发现 desired_plab_sz 大小,在性能正常的版本中该值为 1024 或者 4096(分别是 YoungPLAB 和 OLDPLAB),在性能下降的版本中该值为 258。由此确认 desired_plab_sz 不正确的计算导致了性能下降。 3.6 PALB 为什么会引起性能下降?PLAB 是 GC 工作线程在并行复制内存时使用的缓存,用于减少多个并行线程在内存分配时的锁竞争。PLAB 的大小直接影响 GC 工作线程的效率。在 GC 引入动态线程调整的功能时,将原来 PLABSize 的大小作为多个线程的总体 PLAB 的大小,将 PLAB 重新计算,如下面代码片段:其中 desired_plab_sz 主要来自 YoungPLABSize 和 OldPLABSIze 的设置。所以这样的代码修改改变了 YoungPLABSize、OldPLABSize 参数的语义。 另外,在本例中,通过参数显式地禁止了 ResizePLAB 是触发该问题的必要条件,当打开 ResizePLAB 后,PLAB 会根据 GC 工作线程晋升对象的大小和速率来逐步调整 PLAB 的大小。注意,众多资料说明:禁止 ResziePLAB 是为了防止 GC 工作线程的同步,这个说法是不正确的,PLAB 的调整耗时非常的小。PLAB 是 JVM 根据 GC 工作线程使用内存的情况,根据数学模型来调整大小,由于模型的误差,可能导致 PLAB 的大小调整不一定有人工调参效果好。如果你没有对 YoungPLABSize、OldPLABSize 进行调优,并不建议禁止 ResizePLAB。在 HBase 测试中,当打开 ResizePLAB 后 JDK 8 和 JDK 11 性能基本相同,也从侧面说明了该参数的使用情况。 3.7 解决方法&修复方法由于该问题是 JDK 9 引入,在 JDK 9, JDK 10, JDK 11, JDK 12, JDK 13, JDK 14, JDK 15, JDK 16 都会存在性能下降的问题。我们对该问题进行了修正,并提交到社区,具体见Jira: https://bugs.openjdk.java.net/browse/JDK-8257145;代码见:https://github.com/openjdk/jdk/pull/1474;该问题在JDK 17中被修复。 同时该问题在毕昇 JDK 所有版本中第一时间得到解决。 当然对于短时间内无法切换 JDK 的同学,遇到这个问题,该如何解决?难道要等到 JDK 17?一个临时的方法是显式地设置 YoungPLABSize 和 OldPLABSize 的值。YoungPLABSize 设置为 YoungPLABSize* ParallelGCThreads,其中 ParallelGCThreads 为 GC 并行线程数。例如 YoungPLABSize 原来为 1024,ParallelGCThreads 为 8,在 JDK 9~16,将 YoungPLABSize 设置为 8192 即可。其中参数 ParallelGCThreads 的计算方法为:没有设置该参数时,当 CPU 个数小于等于 8, ParallelGCThreads 等于 CPU 个数,当 CPU 个数大于 8,ParallelGCThreads 等于 CPU 个数的 5/8)。 3.8 小结本文分享了针对 JDK 升级后性能下降的解决方法。Java 开发人员如果遇到此类问题,可以按照下面的步骤尝试自行解决:对齐不同 JDK 版本的参数,确保参数相同,看是否可以快速重现;分析 GC 日志,确定是否由 GC 引起。如果是,建议将所有的参数重新验证,包括移除原来的参数。本例中一个最大的失误是,在分析过程中没有将原来业务提供的参数 ResizePLAB 移除重新测试,浪费了很多时间。如果执行该步骤后,定位问题可能可以节约很多时间;使用一些工具,比如 JFR、NMT、火焰图等。本例中尝试使用这些工具,虽然无果,但基本上确认了问题点;最后的最后,如果还是没有解决,请联系毕昇 JDK 社区。毕昇 JDK 社区每双周周二举行技术例会,同时有一个技术交流群讨论 GCC、LLVM 和 JDK 等相关编译技术,感兴趣的同学可以添加如下微信小助手入群。原文转载自 openEuler-JDK 从8升级到11,使用 G1 GC,HBase 性能下降近20%。JDK 到底干了什么?
-
hbase配置Rowkey时随机数配置后无法报存
-
我们经常面临向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)
-
【功能模块】【操作步骤&问题现象】1、hbase的region分裂原理是什么?2、hbase的热点问题,产生的原因是什么?解决方案有哪些?【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
各位专家好: 请问CloudTable的HBase和MRS的HBase有性能对比么? CloudTable的存算分离,对HBase的读取性能影响大么? 感谢各位专家
-
【操作步骤&问题现象】hbase 版本 1.3.1有关region分裂参数采用默认未调整。【问题现象】现有A业务 每天创建一个hbase表预分5region,最近查看时发现表变成10region,通过HDFS查看region大小为1.4G左右。问什么情况会出现region自动分裂情况?
-
【步骤如下】1.停止表继续插入 disable 'tableName1'2.制作快照 snapshot 'tableName1', 'tableSnapshot'3.克隆快照为新的名字 clone_snapshot 'tableSnapshot', 'newTableName1'4.删除快照 delete_snapshot 'tableSnapshot'5.查询所在HDFS 空间,原表和新表差距过大为什么?hdfs dfs -du -h /hbase/data/default2G tableName1401k newTableName1
-
【操作步骤&问题现象】1.hbase region合并采用是否为merge_region?2.merge_region合并是否需要业务停止?不停止是否有影响?3.合并对于 hbase 二级索引和phoenix是否有影响?
-
概览● 本文主要是想谈一下如何给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
上滑加载中
推荐直播
-
华为AI技术发展与挑战:集成需求分析的实战指南
2024/11/26 周二 18:20-20:20
Alex 华为云学堂技术讲师
本期直播将综合讨论华为AI技术的发展现状,技术挑战,并深入探讨华为AI应用开发过程中的需求分析过程,从理论到实践帮助开发者快速掌握华为AI应用集成需求的框架和方法。
去报名 -
华为云DataArts+DWS助力企业数据治理一站式解决方案及应用实践
2024/11/27 周三 16:30-18:00
Walter.chi 华为云数据治理DTSE技术布道师
想知道数据治理项目中,数据主题域如何合理划分?数据标准及主数据标准如何制定?数仓分层模型如何合理规划?华为云DataArts+DWS助力企业数据治理项目一站式解决方案和应用实践告诉您答案!本期将从数据趋势、数据治理方案、数据治理规划及落地,案例分享四个方面来助力企业数据治理项目合理咨询规划及顺利实施。
去报名
热门标签