hbase数据导出?求方法步骤

hbase数据导出?求方法步骤,第1张

主要有三种方法:

1、Put API

Put API可能是将数据快速导入HBase表的最直接的方法。但是在导入【大量数据】时不建议使用!但是可以作为简单数据迁移的选择,直接写个代码批量处理,开发简单、方便、可控强。

2、MapReduce Job

推荐使用sqoop,它的底层实现是mapreduce,数据并行导入的,这样无须自己开发代码,过滤条件通过query参数可以实现。

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将MySQL中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到Mysql中。

参考Index of /docs。

采用如下命令:sqoop import

--connect jdbc:mysql://localhost/db

--username root -P

--table mysql_order

--columns "id,name"

--hbase-table hbase_order

--column-family f

--hbase-row-key id

--query "select id,name from mysql_order where..."

-m 1

3、采用Bulk load装载数据

bulk-load的作用是用mapreduce的方式将hdfs上的文件装载到hbase中,对于海量数据装载入hbase非常有用。

需要将MySQL的表数据导出为TSV格式(因为后面使用Import TSV工具),还需要确保有一个字段可以表示HBase表行的row key。

将数据导入HBase中有如下几种方式:

使用HBase的API中的Put方法

使用HBase 的bulk load 工具

使用定制的MapReduce Job方式

使用HBase的API中的Put是最直接的方法,用法也很容易学习。但针对大部分情况,它并非都是最高效的方式。当需要将海量数据在规定时间内载入HBase中时,效率问题体现得尤为明显。待处理的数据量一般都是巨大的,这也许是为何我们选择了HBase而不是其他数据库的原因。在项目开始之前,你就该思考如何将所有能够很好的将数据转移进HBase,否则之后可能面临严重的性能问题。

HBase有一个名为 bulk load的功能支持将海量数据高效地装载入HBase中。Bulk load是通过一个MapReduce Job来实现的,通过Job直接生成一个HBase的内部HFile格式文件来形成一个特殊的HBase数据表,然后直接将数据文件加载到运行的集群中。使用bulk load功能最简单的方式就是使用importtsv 工具。importtsv 是从TSV文件直接加载内容至HBase的一个内置工具。它通过运行一个MapReduce Job,将数据从TSV文件中直接写入HBase的表或者写入一个HBase的自有格式数据文件。

尽管importtsv 工具在需要将文本数据导入HBase的时候十分有用,但是有一些情况,比如导入其他格式的数据,你会希望使用编程来生成数据,而MapReduce是处理海量数据最有效的方式。这可能也是HBase中加载海量数据唯一最可行的方法了。当然我们可以使用MapReduce向HBase导入数据,但海量的数据集会使得MapReduce Job也变得很繁重。若处理不当,则可能使得MapReduce的job运行时的吞吐量很小。

在HBase中数据合并是一项频繁执行写 *** 作任务,除非我们能够生成HBase的内部数据文件,并且直接加载。这样尽管HBase的写入速度一直很快,但是若合并过程没有合适的配置,也有可能造成写 *** 作时常被阻塞。写 *** 作很重的任务可能引起的另一个问题就是将数据写入了相同的族群服务器(region server),这种情况常出现在将海量数据导入到一个新建的HBase中。一旦数据集中在相同的服务器,整个集群就变得不平衡,并且写速度会显著的降低。我们将会在本文中致力于解决这些问题。我们将从一个简单的任务开始,使用API中的Put方法将MySQL中的数据导入HBase。接着我们会描述如何使用 importtsv 和 bulk load将TSV数据文件导入HBase。我们也会有一个MapReduce样例展示如何使用其他数据文件格式来导入数据。上述方式都包括将数据直接写入HBase中,以及在HDFS中直接写入HFile类型文件。本文中最后一节解释在向HBase导入数据之前如何构建好集群。本文代码均是以Java编写,我们假设您具有基本Java知识,所以我们将略过如何编译与打包文中的Java示例代码,但我们会在示例源码中进行注释。

hbase snapshot数据迁移问题

不需要提前建表,分区也会自动同步

HBase自身也提供了ExportSnapshot的方法可以从HDFS文件层基于某个快照快速的导出HBase的数据,并不会对RegionServer造成影响,但该源生的方法不支持增量

1、在源集群执行

snapshot 'src_table', 'snapshot_src_table'

snapshot的流程主要有三个步骤

加锁: 加锁对象是regionserver的memstore,目的是禁止在创建snapshot过程中对数据进行insert,update,delete *** 作

刷盘:刷盘是针对当前还在memstore中的数据刷到HDFS上,保证快照数据相对完整,此步也不是强制的,如果不刷会,快照中数据有不一致风险

创建指针: snapshot过程不拷贝数据,但会创建对HDFS文件的指针,snapshot中存储的就是这些指针元数据

2、在源集群执行,属于推送方式,在目标集群执行数据拉取方式

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot test_snap -copy-from hdfs://HDFS80386/hbase -copy-to hdfs://shyt-hadoop-4031.xx.com.cn:8020/apps/hbase/data -mappers 20 -bandwidth 5

3、在目标集群执行使用hbase用户

disable 'dalishen:bbs_member'

restore_snapshot 'bbs_member_snap'

使用restore命令在目标集群自动新建表,以及与archive里的HFile建立link

执行该步骤的时候,可能会遇到权限问题,需要赋权限

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=hbase, access=WRITE, inode="/apps/hbase/data/archive/data/dalishen/bbs_member/f9406f2ff1fe4d542a5cc36b850c2689/f/.links-91a554a73b1e41a7a0b33208331d62df":hadoop:hdfs:drwxr-xr-x

源集群

groups hadoop hdfs 可以发现导入的是源集群的权限

所以需要赋权限

hdfs dfs -chmod -R 777 /apps/hbase/data/archive/data/dalishen/bbs_member/

enable 'dalishen:bbs_member'

不需要提前建表,分区也会自动同步,支持增量备份,需要指定要备份的时间范围

copyTable也是属于HBase数据迁移的工具之一,以表级别进行数据迁移。copyTable的本质也是利用MapReduce进行同步的,与DistCp不同的时,它是利用MR去scan 原表的数据,然后把scan出来的数据写入到目标集群的表。这种方式也有很多局限,如一个表数据量达到T级,同时又在读写的情况下,全量scan表无疑会对集群性能造成影响。

1.3->1.1 高到低版本 不需要提前建表,分区也会自动同步

检查是否开启同步

echo "list_replicated_tables" | hbase shell -n |grep dalishen:app_deviceid

没有的话执行

enable_table_replication 'tname'

1.源集群hadoop查询数据量,如太大先别迁移超过5000w

hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'dalishen:app_deviceid'

2.源集群上执行 替换表名

hbase org.apache.hadoop.hbase.mapreduce.CopyTable -Dhbase.client.scanner.caching=1000 -Dmapred.map.tasks.speculative.execution=false -D mapreduce.task.timeout=6000000 --families=f:f --peer.adr=10.52.24.42:2181:/hbase-unsecure --new.name=dalishen:app_deviceid dalishen:app_deviceid

3.目标集群上执行数据量对比下

hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'dalishen:app_deviceid'

4.指定时间戳进行增量同步

hbase org.apache.hadoop.hbase.mapreduce.CopyTable -Dhbase.client.scanner.caching=1000 -Dmapred.map.tasks.speculative.execution=false -D mapreduce.task.timeout=6000000 --starttime=1600792683760 --endtime=1600792684760 --families=f:f --peer.adr=172.18.12.7:2181:/hbase --new.name=testwang testwang

在源集群进入hbase shell

1、 add_peer '1', 'shyt-hadoop-4032.xxx.com.cn,shyt-hadoop-4031.xxx.com.cn,shyt-hadoop-4030.xxx.com.cn:2181:/hbase-unsecure'

2、修改REPLICATION_SCOPE属性=1,全局模式,此数据会被复制给所有peer

alter 'testwang',{NAME =>'f' ,REPLICATION_SCOPE =>'1'}

3、hbase(main):006:0> enable_table_replication 'testwang'

0 row(s) in 0.0860 seconds

The replication swith of table 'testwang' successfully enabled

验证在源集群 put 'testwang','1005','f:name','1005'

在目标集群 get 'testwang','1005'

校验数据量:通count

hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'testwang'

查看同步状态: status 'replication'

建议大表先进行snapshot方式同步,然后再利用copy进行增量数据同步,小表直接copy table数据迁移,最后配置hbase replication peer实时同步


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10066585.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存