HBase跨版本数据迁移总结

2023-11-19

本文首发腾云阁 HBase跨版本数据迁移总结

某客户大数据测试场景为:Solr类似画像的数据查出用户标签——通过这些标签在HBase查询详细信息。以上测试功能以及性能。

其中HBase的数据量为500G,Solr约5T。数据均需要从对方的集群人工迁移到我们自己搭建的集群。由于Solr没有在我们集群中集成,优先开始做HBase的数据迁移,以下总结了HBase使用以及数据迁移遇到的各种问题以及解决方法。

一.迁移过程遇到问题以及解决

客户HBase版本:Version 0.94.15
腾讯大数据套件HBase版本:Version 1.2.1
客户私有云系统版本(测试):tlinux1.2
遇到的问题以及解决过程如下:

1.HBase运行异常现象一(date和hwclock)

HBase运行偶发不正常,出现组件停止运行的情况,看日志有说时间的差异等信息,但date查看完全一致,想到可能是硬件时间的差异问题,通过hwclock看,确实差异很大,通过hwclock -w调整后基本恢复。后确认初始化脚本中只对腾讯云环境的机器做了硬件时间同步,目前已优化。

2.HBase运行异常现象二(hostname 和/etc/resolv.conf)

HBase再次运行不正常,出现组件停止运行的情况。通过日志看如下错误
ERROR [regionserver//10.0.0.106:16020] regionserver.HRegionServer: Master passed us a different hostname to use; was=10.0.0.106, but now=host-10-0-0-106.openstacklocal
通过hostname看所有机器hostname均为内网IP,猜想可能是网络交互的时候查询什么表导致出现的不一致,查看dns解析信息如下

[root@10 ~]# hostname
10.0.0.106
; generated by /sbin/dhclient-script
#search openstacklocal 0.0.106
#nameserver 10.0.0.2
#nameserver 10.0.0.3

search openstacklocal的情况,猜测是虚拟机的异常行为,注释掉resolv.conf里相关search信息,停掉nscd服务后,重启HBase,再未出现这个错误,HBase运行完全正常。

3.需要支持snappy的发现与修复过程:
  • 迁移表的过程中计划使用官方的import/export工具进行,第一步需要在目标集群建表,通过desc信息在目标集群建表完成后,list可看到表,通过scan查询后,无法查询内容,查日志有如下错误:
    org.apache.hadoop.HBase.DoNotRetryIOException: Compression algorithm 'snappy' previously failed test.
    通过google查询需要HBase支持snappy压缩算法,通过hadoop checknative发现集群默认确实不支持snappy算法(虽然安装snappyrpm
Native library checking:
hadoop:  true /data/tbds-base/usr/hdp/2.2.0.0-2041/hadoop/lib/native/libhadoop.so
zlib:    true /lib64/libz.so.1
snappy:  false
lz4:     true revision:99
bzip2:   false
openssl: false build does not support openssl.
  • 通过手动建表的方法用以下desc信息建表后可以list查看到表信息。scan无法查看表内容,日志发现如下错误
    desc信息:
COLUMN FAMILIES DESCRIPTION                                                                 
{NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR
EVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}                       
{NAME => 'D', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '2147483647', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TT
L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', ENCODE_ON_DISK => 'true'}

错误信息:

org.apache.hadoop.HBase.DoNotRetryIOException: java.lang.RuntimeException: native snappy library not available: this version of libhadoop was built without snappy support
  • 在HBase-site.xml增加属性HBase.regionserver.codecs value为snappy即可,在测试集群通过该方法,HBase启动失败

  • 后确认tlinux1.2的hadoop集群上支持snappy的方法:即需要在特定系统编译hadoop相关本地库(native库)替换hadoop当前的native库,然后HBase的启动环境脚本增加hadoop主目录即可

  • 目前tlinux1.2下的hadoop的nativesnappy库有现网使用,同时需要保证这个hadoop的库可以引用到libjvm.so(jre的一个so文件)直接替换hadoop/lib下的native目录,保证已经安装snappy的rpm包,在HBase-env.sh里添加HADOOP_HOME={Hadoop安装主目录}。再hadoop checknative后发现已支持snappy。逐步全量重启HBase。

Native library checking:
hadoop:  true /data/tbds-base/usr/hdp/2.2.0.0-2041/hadoop/lib/native/libhadoop.so
zlib:    true /lib64/libz.so.1
snappy:  true /usr/lib64/libsnappy.so.1
lz4:     true revision:99
bzip2:   false
openssl: false build does not support openssl.
4.HBase0.9.4集群数据表到HBase1.2.1集群数据表的迁移方法

暴力迁移参考http://my.oschina.net/CainGao/blog/616502

1)找到源集群源表在hdfs上的目录位置,直接将该目录移动到目标集群HBase的表在目标集群hdfs上的表根目录下

2)暴力迁移时tableinfo信息是一个文件即.tableinfo.00000001。0.9.4的版本这个文件位于HBase表在hdfs上表目录的根目录下,而1.2.1的这个文件位于HBase表在hdfs上表目录的根目录下的./tabledesc目录下,需要手动创建这个目录并调整这个文件的位置

3) 修改复制过来的表目录文件的属主信息

4) 重启HBase的所有组件

5) 此时登录HBaseshell已经可以通过list查看到迁移过来的表,但scan等操作会失败

6) 通过HBase hbck -fixMeta修复meta信息;HBase hbck -fixAssignments 修复分区。这两个步骤的操作过程中注意观察日志是否有异常,实践中首次尝试此方法有大量错误,发现错误内容为snappy相关,支持snappy后,查看表信息,表内容正常,随机选取表内容对比也正常,可认为此种方法迁移成功。

7) 通过import/export的方法迁移时需要在目标集群手动创建目标表,查看源集群的表结构如下:
import/export参考地址

COLUMN FAMILIES DESCRIPTION                                                                  {NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR
EVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}                       
{NAME => 'D', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '2147483647', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TT
L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', ENCODE_ON_DISK => 'true'}

通过该desc信息创建新表时出现如下错误:
Unknown argument ignored for column family A: ENCODE_ON_DISK
手动测试只要加这个参数ENCODE_ON_DISK去建表一定会出现这个错误,建表会成功,但表信息里没有这个字段了。经过look查代码发现这个字段在新版本已经废弃,但客户的老集群是版本需要这个字段,通过import的方法无法正常写入、通过步骤6)的暴力迁移成功后(暴力迁移成功兼容了这个字段),查看表的desc信息如下:

COLUMN FAMILIES DESCRIPTION                                                                  {NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR
EVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}                       
{NAME => 'D', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '2147483647', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TT
L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}

老集群表结构

COLUMN FAMILIES DESCRIPTION                                                                 {NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR
EVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}                       
{NAME => 'D', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '2147483647', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TT
L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', ENCODE_ON_DISK => 'true'}

可以看到关于ENCODE_ON_DISK字段在新老版本的定义方法有差异,故我们测试在新集群使用上面的desc信息建表后,再通过import方法导入到HBase。结果依然没有数据写入,可以断定这个参数ENCODE_ON_DISKHBase1.2.1中完全废弃,新版本采用了一个整字段来包裹这个信息。当老集群有参数时,官方import/export方法在HBase0.9.8到HBase1.2.1直接迁移暂时不可用。

二.后续

HBase0.9.8集群上建表设置ENCODE_ON_DISK=false(默认为true),在HBase1.2.1上不带ENCODE_ON_DISK建表,使用export/import方法迁移测试研究其他HBase数据跨集群(版本差异,网络不通)迁移方法。


相关推荐

Hbase WAL线程模型源码分析

Hbase的WAL在RegionServer基本调用过程


随时随地阅读云计算技术干货
微博 @腾讯云
知乎 腾讯云技术社区
扫码关注微信公众号

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HBase跨版本数据迁移总结 的相关文章

  • Apache Phoenix - 如何在 Kerberos 集群上启动查询服务器和瘦客户端

    我最近花了几天时间尝试通过zookeeper运行phoenix Thin queryserver py和sqlline thin py 和thick以保护集群 但是 我无法在安全集群上启动或连接phoenix服务 在phoenix瘦客户端和
  • 如何将复杂对象存储到hadoop Hbase中?

    我有一些复杂的对象 其中包含需要存储到 Hadoop 的集合字段 我不想遍历整个对象树并显式存储每个字段 所以我只是考虑将复杂字段序列化并将其存储为一大块 并且在读取对象时将其反序列化 那么最好的方法是什么 我考虑过为此使用某种序列化 但我
  • 如何通过部分行键过滤HBase的Scan?

    我有带有行键的 HBase 表 其中包含文本 ID 和时间戳 如下所示 string id1 1470913344067 string id1 1470913345067 string id2 1470913344067 string id
  • 增加 Hadoop 2 中 Hive 映射器的数量

    我从 Hive 创建了一个 HBase 表 并尝试对其进行简单的聚合 这是我的 Hive 查询 from my hbase table select col1 count 1 group by col1 地图缩减作业仅产生 2 个映射器 我
  • 如何实现hbase安全批量加载

    我已经在 kerberos 集群中的 hbase 中创建了一个批量加载 其驱动程序类与此类似 工作 public static void main String args try int response ToolRunner run HB
  • 将 Spark 数据帧插入 hbase

    我有一个数据框 我想将其插入到 hbase 中 我遵循这个文档 https hbase apache org book html sparksql dataframes 这就是我的数据框的样子 id name address 23 marr
  • 如何在 Hbase 中连接两个表

    Problem 我是 Hbase 新手 遇到了需要连接两个表的情况 假设我有 Employee 表和 Department 表都是在 Hbase 中创建的 通过阅读 Hbase 的实际操作 我了解到我们无法连接 Hbase 中的表 解决方案
  • 高效查询Hbase

    我使用 Java 作为查询 Hbase 的客户端 我的 Hbase 表设置如下 ROWKEY HOST EVENT 21 1465435 host hst com clicked 22 1463456 hlo wrld com dragge
  • 使用 Hadoop,我可以在未运行数据节点的计算机上创建任务跟踪器吗?

    所以这是我的情况 我有一个使用 HBase 的 MapReduce 作业 我的映射器接受一行文本输入并更新 HBase 我没有减速器 并且我没有将任何输出写入光盘 我希望能够在预期利用率激增时向集群添加更多处理能力 然后在利用率下降时缩减处
  • 在 HBase 中获取一组行的最网络有效的方法是什么?

    假设我有一组行键 作为一个集合 为这组行获取特定列族的最网络有效方法是什么 Using HTable get List 获取 http hbase apache org apidocs org apache hadoop hbase cli
  • Hortonworks HDP Sandbox 上的 HBase:无法从 ZooKeeper 获取主地址

    我从 hortonworks for virtualbox 下载了 HDP 2 1 在简单命令中使用 Hbase shell 时出现以下错误 create t1 NAME gt f1 VERSIONS gt 5 Hortonworks 错误
  • 如何在spark中配置hbase?

    Spark连接hbase的步骤是什么 我有两者的主地址 我是否只需将 hbase 地址添加到 Spark 类路径中 这篇关于 Spark 与 HBase 连接的文章应该会有所帮助 http www vidyasource com blog
  • Titan-1.0.0+Hbase-0.98.20使用java远程模式连接错误

    我正在学习Titan数据库 我已经在本地模式下成功运行了它 现在 我尝试在 Titan 文档中介绍的 远程服务器模式 下使用 Titan 数据库 我的 Titan 版本是 Titan 1 0 0 hadoop1 我的 LAN 中有集群 包括
  • 如何将多个 QualifierFilter 应用于 HBase 中的一行

    我们想使用两个 QualifierFilters 过滤 HBase 表上的扫描 意味着我们只想获取表中确实具有特定列 col A 的行AND 某个其他列 col B 我们当前的方法如下所示 FilterList filterList new
  • Hbase连接zookeeper错误

    环境 Ubuntu 14 04 hadoop 2 2 0 hbase 0 98 7 当我启动hadoop和hbase 单节点模式 时 都成功 我还检查了hadoop的网站8088 hbase的网站60010 jps 4507 Seconda
  • 如何确定 HBase 表的大小?有什么命令可以这样做吗?

    我的 Hbase shell 上有多个表 我想将它们复制到我的文件系统上 有些表超过 100GB 但是 我的本地文件系统中只剩下 55GB 可用空间 因此 我想知道 hbase 表的大小 以便我可以仅导出小尺寸的表 任何建议表示赞赏 谢谢
  • HBase Java 客户端 - 未知主机:localhost.localdomain

    版本 Hadoop 2 0 0 cdh4 3 1 HBase 0 94 6 cdh4 3 1 我正在运行cloudera快速启动vm 一切都在172 16 144 150上运行 这是我的小HBase Java客户端 HbaseClient
  • HBase 作为 Web 应用程序后端

    任何人都可以建议将 HBase 作为基于 Web 的应用程序的主要数据源是否是一个好主意 我主要关心的是 HBase 对查询的响应时间 是否有可能实现亚秒级响应 编辑 有关应用程序本身的更多详细信息 数据量 约500GB文本数据 预计很快将
  • HBase:创建多个表或包含多个列的单个表?

    什么时候创建多个表而不是创建具有大量列的单个表才有意义 据我了解 表通常只有几个列族 1 2 每个列族可以支持 1000 多个列 当 HBase 似乎在单个表中可能存在大量列时表现良好时 什么时候创建单独的表才有意义 在回答问题本身之前 让
  • 如何定义Titan Graph DB Vertex的数据类型?

    我正在使用 Titan 和 Blueprint API 创建图形数据表 我使用 HBase 作为后端 我知道如何定义关键索引的数据类型 Example TitanKey name graph makeType name name dataT

随机推荐

  • 【数据库】如何创建一个非常便宜的无服务器数据库

    云对象存储可以用作功能强大且非常便宜的数据库 您是否相信您可以使用完全托管 可大规模扩展 高度可用且价格低廉的无服务器数据库 每月只需 5 美元 您就可以存储数亿条记录并读写数十亿条记录 如果您的数据库需求可以通过非常简单的键值存储来满足
  • 近期deep learning做图像质量评价(image quality assessment)的论文4

    1 2017会议论文ICME An accurate deepconvolutional neural networks model for no reference image quality assessment 复旦大学 1 1用了部
  • Python开发环境Wing IDE如何查看调试数据

    Wing IDE具有一个十分有用的特性 就是处理复杂bug的时候可以以各种各样的方式查看调试数据值 这个功能具体是由Watch工具实现的 查看数据值 在PrintAsHTML中发生异常时 右键单击Stack Data工具中的本地数值 这将显
  • 【STM32学习笔记】(13)——外部中断详解

    EXTI 简介 EXTI External interrupt event controller 外部中断 事件控制器 管理了控制器的 20 个中断 事件线 每个输入线可以独立地配置输入类型 脉冲 或挂起 和对应的触发事件 上升沿或下降沿或
  • unity本地分数排行榜简单解决方案(Json)

    具体效果 大体方法 创建一个分数类Score和一个分数类的容器List
  • TLSv1.2抓包解密分析过程之ECDHE_RSA_WITH_AES_128_CBC_SHA256

    ECDHE RSA WITH AES 128 CBC SHA256模式下 RSA只用于身份验证 不用于加密 加密密钥是通过有限域的椭圆曲线算法交换的 需要拿到ECDH的私钥才能解密 本文的demo样本使用了特殊方法来获取这些参数 椭圆曲线加
  • Nginx 通过upstream反向代理报 400 Bad Request

    首先看一下400错误的定义 400 Bad Request 是一种 HTTP 错误状态码 HTTP 1 1 对 400 Bad Request的定义主要是 语义有误 当前请求无法被服务器理解 请求参数有误 丢包导致异常 背景一 开发了一个s
  • 从一道题目学习Nunjucks模板

    Nunjucks简介 Nunjucks 是一个功能丰富 强大的 JavaScript 专用模板引擎 Nunjucks 提供丰富的语言特性和块继承 自动转移 宏和异步控制等等 重点要关注的是 Nunjucks 模板引擎的代码在沙箱环境中运行
  • xilinx xdma PCIe中断bug

    xilinx xdma PCIe中断存在bug bug1 此中断虽然是msi或者msx中断 但是不中断cpu bug2 此中断不是边沿中断 而是电平中断 在驱动层需要不断地轮训查询中断事件 bug3 此中断持续时间必须长 而且在收到中断应答
  • 关于the selection cannot be run on any server错误的问题,如何快速的解决。

    最近在导入外来项目时 遇到了一个难题 就是出现了图中的错误 the selection cannot be run on any server 无法在任何服务器上运行所选内容 这个错误的原因在于Dynamic Web Module 的版本与
  • 基于CNN-GRU的多维数据预测算法——附带Matlab代码

    基于CNN GRU的多维数据预测算法 附带Matlab代码 近年来 卷积神经网络 CNN 和门控循环单元 GRU 在时序数据处理中的应用十分广泛 本文提出了一种基于CNN GRU结构的多维数据预测算法 并提供了相应的Matlab代码 首先
  • FPGA Xilinx 7系列高速收发器GTX通信

    Xilinx 7系列高速收发器GTX 说明 FPGA TX端 zynq 7z035 RX端 zynq 7z100 两个FPGA通过SFP 光纤 接口相连进行GTX的通信 环境 Vivado2018 2 IP核 7 Series FPGAs
  • radius认证服务器无响应,squid radius认证“RADIUS服务器没有响应”

    我已经用mysql成功配置freeradius 我可以radtest使用命令 squid radius认证 RADIUS服务器没有响应 sudo radtest alice password 192 168 2 3 1812 testing
  • java面向对象 final && static 关键字

    目录 关键字 static 类属性 类方法的设计思想 类变量 class Variable 静态变量的内存解析 类方法 class method 单例 Singleton 设计模式 理解main方法的语法 代码块 关键字 final 总结
  • LTE MIB&SIB1

    LTE MIB SIB1 LTE MIB SIB 消息可以参考 http blog csdn net wowricky article details 51348613 UE 接受完MIB SIB1后就可以判断这个CELL是否可以驻留 这里
  • Unix and perl primer for Biologists - Part2 :Advanced Unix- Reading Notes(U37-U45)

    U37 Counting with grep Running grep c simply counts how many lines match the specified pattern root kali Downloads Unix
  • Linux内核调度算法 -- CPU时间片如何分配

    内核在微观上 把CPU的运行时间分成许多分 然后安排给各个进程轮流运行 造成宏观上所有的进程仿佛同时在执行 双核CPU 实际上最多只能有两个进程在同时运行 大家在top vmstat命令里看到的正在运行的进程 并不是真的在占有着CPU哈 所
  • FPGA_时钟显示(时钟可调)

    1 实验说明 在数码管显示数据的基础上 让六位数码管显示数字时钟 并且通过按键可以对时间进行修改 实验目标 六位数码管分别显示时间的时分秒 且通过按键可实现加减调整时间及清零功能 key1 切换键 选择待调整的时间单位 时 分 秒 key2
  • 2021-09-18

    Idea控制台中文乱码解决 Dfile encoding gb2312
  • HBase跨版本数据迁移总结

    本文首发腾云阁 HBase跨版本数据迁移总结 某客户大数据测试场景为 Solr类似画像的数据查出用户标签 通过这些标签在HBase查询详细信息 以上测试功能以及性能 其中HBase的数据量为500G Solr约5T 数据均需要从对方的集群人