Hbase表主备离线比对

一、HBase定义

HBase 是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。 HBase 利用Hadoop HDFS 作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。

和传统数据库不同的是,HBase的表不用定义有哪些列(字段,Column),因为列是可以动态增加和删除的。但HBase表需要定义列族(Column Family)。每张表有一个或者多列族,每个列必须且仅属于一个列族。列族主要用来在存储上对相关的列分组,从而使得减少对无关列的访问来提高性能。一般来说,一个列族就足够使用了。

特点:

  1. 大:一个表可以有上亿行,上百万列。
  2. 面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。
  3. 稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏。

HBase 支持很多种访问,访问HBase的常见接口如下:

  1. Native Java API,最常规和高效的访问方式,适合Hadoop MapReduce Job并行批处理HBase表数据。
  2. HBase Shell,HBase的命令行工具,最简单的接口,适合HBase管理使用。
  3. Thrift Gateway,利用Thrift序列化技术,支持C++,PHP,Python等多种语言,适合其他异构系统在线访问HBase表数据。
  4. REST Gateway,支持REST 风格的Http API访问HBase, 解除了语言限制。
  5. Pig,可以使用Pig Latin流式编程语言来操作HBase中的数据,和Hive类似,本质最终也是编译成MapReduce Job来处理HBase表数据,适合做数据统计。
  6. Hive,当前Hive的Release版本尚没有加入对HBase的支持,但在下一个版本Hive 0.7.0中将会支持HBase,可以使用类似SQL语言来访问HBase。

参考:HBase 简介(强烈推荐看)


二、HBase 逻辑模型

HBase 中的每一张表就是所谓的 BigTable。BigTable 会存储一系列的行记录,行记录有三个基本类型的定义:Row Key、Time Stamp、Column。

Row Key

是行在 BigTable 中的唯一标识。在存储时,数据按照 Row Key 的字典序(byte order)排序存储。设计 Key 时,要充分排序存储这个特性,将经常一起读取的行存储到一起(位置相关性)。

Time Stamp

是每次数据操作对应关联的时间戳,可以看做 SVN 的版本。为了避免数据存在过多版本造成的管理(包括存储和索引)负担,HBase 提供了两种数据版本回收方式。 一是保存数据的最后 n 个版本,二是保存最近一段时间内的版本(比如最近七天)。

Column

定义为< family>:< label>,通过这两部分可以指定唯一的数据的存储列,family 的定义和修改需要 对 HBase 进行类似于 DB 的 DDL 操作,而 label ,不需要定义直接可以使用,这也为动态定制列提供了一种手段 。family 另一个作用体现在物理存储优化读写操作上,同 family 的数据物理上保存的会比较临近,因此在业务设计的过程中可以利用这个特性。


三、HBase Shell命令

写错 HBase Shell 命令时用键盘上的“Ctrl+Backspace”或“Delete”进行删除,“Backspace”不起作用。如果使用了Kerberos认证,需要先激活拥有相关权限的用户,执行kinit -k -t keytab路径 用户名

# 列出所有表
> list
 
# 获得表描述
> describe 'INVESTOR_HX:acct_info'

#  查看20190718数据是否存在
> get 'INVESTOR_HX:acct_info', 'TRADE_DATE|20190718'

# 抽查20190718数据是否存在
> scan 'INVESTOR_HX:acct_info', {FILTER=>"(RowFilter(=,'regexstring:.*\\|20190718'))",LIMIT=>10}
> get 'INVESTOR_HX:acct_info', '000008383A|20190718'

# 统计行数
> count 'INVESTOR_HX:acct_info'

# 删除表
> disable 'INVESTOR_HX:acct_info'
> drop 'INVESTOR_HX:acct_info'

# 清空表,实际上是通过先对表执行 disable,然后再执行 drop 操作后重建表来实现
> truncate 'INVESTOR_HX:acct_info'

统计行数方法:

  1. count命令
    最直接的方式是在hbase shell中执行count的命令可以统计行数。INTERVAL为统计的行数间隔,默认为1000,CACHE为统计的数据缓存。这种方式效率很低,如果表行数很大的话不建议采用这种方式。
> count 'INVESTOR_HX:acct_info', INTERVAL => 10, CACHE => 1000  
  1. 调用MapReduce
    这种方式效率比上一种要搞很多,调用的hbase jar中自带的统计行数的类,1000w耗时两分钟。
hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'INVESTOR_HX:acct_info' 
  1. 查看HDFS文件大小
    比较粗略的方法,用Hadoop Shell命令查看HDFS文件大小。
# 查看文件信息
hadoop fs -ls /hbase/data/INVESTOR_HX
# 显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。
hadoop fs -du -h /hbase/data/INVESTOR_HX

参考:


四、HBase的Java API

  • HBaseConfiguration 是每一个 HBase Client 都会使用到的对象,它代表 HBase 配置信息。有两种构造方式。默认构造方式会尝试从 hbase-default.xml 和 hbase-site.xml 文件中读取配置。如果CLASSPATH 没有这两个文件,就需要自己配置。
  • Scan 对象提供了默认构造函数,一般使用默认构造函数。setMaxVersions:指定最大的版本个数。如果不带任何参数调用 setMaxVersions,表示取所有的版本。如果不调用 setMaxVersions,只会取到最新的版本。

参考:

以windows为客户端访问

准备相关配置文件:

  • user.keytab:从管理中心下载用户的Kerberos文件
  • krb5.conf:从管理中心下载用户的Kerberos文件
  • core-site.xml:从HBase客户端下载
  • hdfs-site.xml:从HBase客户端下载
  • hbase-site.xml:从HBase客户端下载

配置hosts,指定各节点的ip


五、MapReduce操作HBase

以下均针对Hbase 1.3.1版本:

检查Hbase客户端路径是否在/sse/opt/hd/bigdata/client/HBase/hbase下。

每个shell客户端执行yarn jar命令前,必须指定Hbase相关类路径:

export HBASE_HOME=/sse/opt/hd/bigdata/client/HBase/hbase
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:`$HBASE_HOME/bin/hbase mapredcp:$HBASE_HOME/conf` 

试验官方MR程序是否能正常执行:

yarn jar /sse/opt/hd/bigdata/client/HBase/hbase/lib/hbase-server-1.3.1.jar rowcounter INVESTOR_HX:acct_into

可能遇上的问题:

  • 未正确安装hdfs和hbase客户端
  • 激活用户的权限
  • 客户端和集群之间时间不同步
  • zookeeper服务器未设置或者/etc/hosts设置有误

性能参数:

  • 每次从服务器端读取的行数
    设置HBase scanner一次从服务端抓取的数据条数,默认情况下一次一条。通过将其设置成一个合理的值,可以减少scan过程中next()的时间开销,代价是scanner需要通过客户端的内存来维持这些被cache的行记录。
    有三个地方可以进行配置:1)在HBase的conf配置文件中进行配置,命令行-Dhbase.client.scanner.caching配置 2)通过调用HTable.setScannerCaching(int scannerCaching)进行配置;3)通过调用Scan.setCaching(int caching)进行配置。三者的优先级越来越高。参考:HBase篇–HBase常用优化
  • 是否缓存块
    默认缓存,我们分内存,缓存和磁盘,三种方式,一般数据的读取为内存->缓存->磁盘,当MR的时候为非热点数据,因此不需要缓存scan.setCacheBlocks(false)。 参考:MR中Hbase的Scan使用技巧

官方源码大部分在org.apache.hadoop.hbase.mapreduce下。

RowCounter源码解析

RowCounter统计表的行数,执行完后由ROWS体现,只有map阶段,无输出文件。
在这里插入图片描述

TableMapper<KEYOUT,VALUEOUT>继承自Mapper<ImmutableBytesWritable,Result,KEYOUT,VALUEOUT>,默认KEYIN和VALUEIN是ImmutableBytesWritable和Result,Result是一行的结果。

方法createSubmittableJob设置Mapper等,指定读取的表名、列范围、mapper类、KEYOUT类和KEY类等。

public static Job createSubmittableJob(Configuration conf, String[] args) throws IOException {
  	//读取配置参数,设置scan的筛选条件...
	
	//只取第一列
	scan.setFilter(new FirstKeyOnlyFilter()); 
    //时间戳范围
    scan.setTimeRange(startTime, endTime == 0 ? HConstants.LATEST_TIMESTAMP : endTime);
    //不输出
    job.setOutputFormatClass(NullOutputFormat.class);
    //设置Mapper
    TableMapReduceUtil.initTableMapperJob(tableName, scan,RowCounterMapper.class, ImmutableBytesWritable.class, Result.class, job);
    //无Reducer
    job.setNumReduceTasks(0);
	return job;
}

static class RowCounterMapper extends TableMapper<ImmutableBytesWritable, Result> {
    public static enum Counters {ROWS}
    @Override
    public void map(ImmutableBytesWritable row, Result values, Context context) throws IOException { 
		//累加行数
		context.getCounter(Counters.ROWS).increment(1);
    }
}

Export源码解析

Export导出sequence文件到HDFS路径,反过来要用Import导入。类IdentityTableMapper继承了TableMapper<ImmutableBytesWritable,Result>,默认KEYOUT和VALUEOUT是ImmutableBytesWritable和Result,表示把记录直接传到reduce阶段。

public static Job createSubmittableJob(Configuration conf, String[] args) throws IOException {
    String tableName = args[0];
    Path outputDir = new Path(args[1]);
    Job job = new Job(conf, NAME + "_" + tableName);
    job.setJobName(NAME + "_" + tableName);
    job.setJarByClass(Export.class);
    //读取配置参数,设置scan的筛选条件...
    Scan s = getConfiguredScanForJob(conf, args);
    IdentityTableMapper.initJob(tableName, s, IdentityTableMapper.class, job);
    //无Reducer,直接输出文件
    job.setNumReduceTasks(0);
    job.setOutputFormatClass(SequenceFileOutputFormat.class);
    job.setOutputKeyClass(ImmutableBytesWritable.class);
    job.setOutputValueClass(Result.class);
    FileOutputFormat.setOutputPath(job, outputDir); // job conf doesn't contain the conf so doesn't have a default fs.
    return job;
}

参考:hbase_数据备份(导入/导出)

VerifyReplication源码解析

VerifyReplication 跟连通的备集群进行主备比对,可以指定起止时间、列family。只有map阶段,对每一行value遍历查找备集群的同key行,再比较size和每个cell值。

WordCount源码解析

来自 基于Hbase的MapReduce框架案例(一)–词频分析Wordcount,一个Hbase表word,列col:line的每行存放文本的一段,统计多段文本中单词出现的个数,保存到另一个Hbase表stat,rowkey为单词,ret:count为词频。mapper阶段KEYOUT和VALUEOUT为Text和IntWritable,reduce阶段使用了,KEYIN和VALUEIN为TEXT和IntWritable,KEYOUT为ImmutableBytesWritable。类TableReducer<KEYIN,VALUEIN,KEYOUT>,该类继承了Reducer<KEYIN,VALUEIN,KEYOUT,Mutation>Mutation包括Append, Delete, Increment, Put。

在这里插入图片描述


六、Hbase主备比对

因大数据平台主备集群相互之间网络阻隔,HBase表主备比对,不能直接使用官方同步和比对命令。因此,我们需要另外设计一个有效、高效的Hbase主备集群的数据比对方案,实现以下目标:

  1. 支持对多行多列的数据求checksum值,支持灵活筛选过滤
  2. 在海量数据下执行较快速、高效
  3. 方便后续Hbase同步工作

比对方案设计原则:

  1. 使用MapReduce框架,采用分布式并行计算技术
  2. 支持对rowkey和列族、列的筛选过滤
  3. 针对大数据ETL任务按日跑批导入Hbase日期表(rowkey包含日期)的特性,支持以天为力度比对。如果Hbase表的某日数据比对不一致,可根据实际情况,选用重跑ETL任务、重新导入接口文件、导入导出主备Hbase数据等实现同步

比对方案的步骤:

  1. 对源集群表A和目标集群的表A’分别执行HbaseChecksum程序,统计每天的总行数,每天的值checksum
  2. 查看或者下载,对两份统计结果比较

HbaseChecksum主要用于主备集群的表数据一致性比对。示意图(即图中MR_ck)如下所示,源集群的统计A表中20190801的数据行数为11,checksum值为yaa,而目标集群A’表中20190801的数据行数为11,checksum值为aaa,行数和checksum均不一致,代表20190801数据不一致;A表中20190802的数据行数为12,checksum值为bxb,而目标集群A’表中20190802的数据行数也为12,但checksum值为bbb,checksum不一致,代表20190802数据不一致;A表和A’中20190803的数据行数都为17,checksum值都为cccc,代表20190803数据一致。
在这里插入图片描述
HbaseChecksum程序,使用MapReduce框架统计表每日的行数和checksum,步骤如下:
① 筛选过滤:rowkey正则范围,时间戳范围,列族和列;
② 如果不存在,新建结果表,否则清空结果表;
③ Mapper:KEYOUT和VALUEOUT为<日期,行值checksum>;
④ Reducer:KEYIN和VALUEIN为<日期,行值checksum>,KEYOUT和VALUEOUT为<日期,PUT>,PUT包含每天的总行数,每天的checksum值,并保存到结果表。

备注:发现获取命令行配置有坑,改用Apache Commons CLI


七、HBase数据迁移

在这里插入图片描述
参考:HBase 数据迁移方案介绍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值