HBASE迁移数据几种方式

本文介绍了HBase数据导入的多种方式,包括使用HBase API的Put方法、内置的importTSV工具以及bulk load方式。重点讨论了bulk load方法,它是大数据写入时提高效率、降低Hbase节点压力的有效手段。通过分析importTSV的源码和操作步骤,展示了如何高效地将数据批量加载到HBase中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.数据导入HBase中常见方式
数据的来源:
(1)日志
(2)RDBMS
导入的方式:
.使用hbase的api put api(kettle,sqoop)
.使用HBase的API中的Put是最直接的方法,用法也很容易学习。但针对大部分情况,它并非都是最高效的方式。当需要将海量数据在规定时间内载入HBase中时,效率问题体现得尤为明显。待处理的数据量一般都是巨大的,这也许是为何我们选择了HBase而不是其他数据库的原因。在项目开始之前,你就该思考如何将所有能够很好的将数据转移进HBase,否则之后可能面临严重的性能问题。
.使用hbase内置的importtsv或者自定义mr
importtsv是tsv文件直接加载内容到hbase一个内置工具.它运行一个mapReduce job将数据文件直接写到HBase表中,或者写入一个Hbase自带格式数据文件.importtsv将数据直接加载到HBase数据表中.
. bulk load方式快速加载数据量大的数据(非常常用)
Hbase支持bulk load的入库方式,它是利用hbase数据信息按照特定的格式存储在hdfs上,在hdfs上生成持久化的HFile数据格式文件,然后上传到合适的位置.配合mapreduce完成高效便捷,而且不占有region的资源,在大数据写入时能够极大的提高写入的效率,降低了对Hbase节点的写入压力。
1.介绍Hbase自带importtsv工具默认直接加载到Hbase数据库,我们也可先生成Hfile的文件,importtsv源码参考habse-server-0.98.6-hadoop2.jar的org.apache.hadoop.hbase.mapreduce:ImportTsv类
2.通过hbase-importtsv导入数据
准备数据

      select *from company
      into outfile '/usr/local/datas/company.tsv'
      fields terminated by '\t' optionally enclosed by '"'
      escaped by '"'
      lines terminated by '\r\n'
      load data infile '/usr/local/datas/company.tsv'  
into table company 
fields terminated by '\t'  optionally enclosed by '"' escaped by '"'  
lines terminated by '\r\n';

创建hbases表

create namespace 'com'
create 'com.company',{NAME=>'info',VERSIONS=>'1'}

运行hbase自带的importtsv-mr任务向hbase导入数据

#设置环境变量hadoop_classpath
export HBASE_HOME=/opt/modules/hbase-0.98-6-hadoop2
export 
HADOOP_HOME=/opt/modules/hadoop-2.5.0
export 
HADOOP_CLASSPATH=${HBSE_HOME}/bin/hbase mapredcp
##将数据上传至hdfs上
hadoop-2.5.0/bin/hdfs -put /usr/local/datas/company.tsv /user/beifeng/input/company.tsv
##运行hbase自带的importtsv-mr任务向hbase导入数据
hadoop-2.5.0/bin/yarn jar hbase-0.98.6-hadoop2/lib/hbase-server-0.98.6-hadoop2.jar  importtsv \
-Dimporttsv-clumns=HBASE_ROW_KEY,\
info:id,info:deptno,info:name,info:company_id,info:status,info:address
com:company \
/user/beifeng/input/company.tsv
#在hbase shell客户端验证是否成功
count 'com:company'

bulk load 方式快速加载大量数据

# step 0 在hdfs /user/beifeng/input/建立目录准备导入数据
hadoop-2.5.O/bin/hdfs dfs -mkdir -p /user/beifeng/input/tsv
#step 1.将数据上传至hdfs目录上
hadoop-2.5.0/bin/hdfs dfs -put /usr/local/datas/company.tsv /user/beifeng/input/tsv
#step 3 设置hbase_classpath的环境变量
export HBASE_HOME=/opt/modules/hbase-0.98-6-hadoop2
export HADOOP_HOME=/opt/modules/hadoop-2.5.0
export 
HADOOP_CLASSPATH=${HBASE_HOME}/bin/hbase mapredcp

# 2. 使用importtsv工具生成HFile文件(注意:字段个数需要对应,不然不能生成hfile文件)
$ hadoop-2.5.0/bin/yarn jar hbase-0.98.6-hadoop2/lib/hbase-server-0.98.6-hadoop2.jar importtsv \
-Dimporttsv.columns=HBASE_ROW_KEY,\
info:id,info:city,info:email,info:name,info:num,info:priority,info:state,info:total_num,info:webAddress \
-Dimporttsv.bulk.output=/user/ubuntu/hbase/hfileoutput \
test:company3 \
/user/ubuntu/datas/company3


# 3. 如果使用importtsv工具生成HFile数据文件,还需要使用hbase自带的MR工具completebulkload来将生成的hfile文件移动到hbase regions对应的hdfs路径,以完成hbase数据的加载。
$ hadoop-2.5.0/bin/yarn jar hbase-0.98.6-hadoop2/lib/hbase-server-0.98.6-hadoop2.jar completebulkload \
/user/ubuntu/hbase/hfileoutput \
test:company3

# 4. 在hbase shell客户端验证导入是否成功
count 'test:company'
55480 row(s) in 2.1610 seconds
### HBase 离线数据迁移方法及步骤 HBase 是一种分布式、可扩展的 NoSQL 数据库,适用于大规模数据存储和查询。在某些场景下,例如集群升级、架构调整或平台迁移,需要对 HBase 集群进行离线数据迁移。以下介绍几种常见的离线迁移方法及其具体步骤。 #### 1. 使用 HBase 自带的 Export/Import 工具 HBase 提供了内置的 Export 和 Import 工具,适用于两个集群之间网络不通的场景。该方法通过 MapReduce 作业将源集群的数据导出为 HDFS 文件,再将文件复制到目标集群并导入。 **步骤如下**: - **导出数据**:在源集群上运行 `Export` 命令,将指定表的数据导出到源集群的 HDFS 中。 ```shell hbase org.apache.hadoop.hbase.mapreduce.Export <表名> <HDFS路径> ``` - **复制数据**:使用 `hadoop fs -get` 将导出的 HDFS 文件下载到本地,再通过 `scp` 或其他方式传输到目标集群的节点。 - **上传数据**:在目标集群上使用 `hadoop fs -put` 将文件上传到目标集群的 HDFS 中。 - **导入数据**:运行 `Import` 命令将数据导入目标 HBase 集群。 ```shell hbase org.apache.hadoop.hbase.mapreduce.Import <表名> <HDFS路径> ``` 该方法依赖 MapReduce 框架,因此需确保 YARN 已启动[^2]。 #### 2. 使用 HDFS DistCp 工具直接迁移 HBase 数据目录 对于全量数据迁移,可以直接使用 Hadoop 的 `distcp` 工具迁移 HBase 的底层 HDFS 文件。这种方式效率高,适用于两个 HDFS 集群之间网络互通的场景。 **步骤如下**: - **停止 HBase 服务**:在迁移前需确保源集群的 HBase 服务已停止,以避免数据不一致。 - **执行 DistCp 命令**:使用 `distcp` 将源 HDFS 上的 HBase 表目录复制到目标 HDFS。 ```shell hadoop distcp -Dmapreduce.job.hdfs-servers.token-renewal.exclude="xx.xx.xx.xx" -i -strategy dynamic -log /hdfs_migration/logs -bandwidth 100 -m 100 hdfs://source-nn:8020/hbase/table_name hdfs://target-nn:8020/hbase/table_name ``` - **重建元数据**:在目标集群上执行 `hbase hbck -fixMeta` 和 `hbase hbck -assignRegions` 等命令修复元数据。 - **启用表**:在目标 HBase 集群中启用迁移后的表。 该方法直接操作 HDFS 层,迁移速度快,但对元数据一致性要求较高[^3]。 #### 3. 使用 HBase 的 Snapshot 功能 HBase 支持快照功能,可以在不中断服务的情况下创建表的快照,并将快照导出到其他集群。 **步骤如下**: - **创建快照**: ```shell hbase shell snapshot '表名', '快照名' ``` - **导出快照**:使用 `ExportSnapshot` 命令将快照导出到目标 HDFS。 ```shell hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot 快照名 -copy-to hdfs://target-nn:8020/hbase -mappers 16 ``` - **导入快照**:在目标集群上加载快照并恢复表。 ```shell hbase snapshot clone_snapshot 快照名 目标表名 ``` 该方法不会影响线上业务,适合大规模数据迁移[^2]。 #### 4. 使用第三方工具(如 Apache NiFi、Sqoop 等) 对于需要灵活控制数据流的场景,可以使用 Apache NiFi 或 Sqoop 等工具进行数据抽取和导入。这些工具支持图形化配置和复杂的数据换逻辑。 #### 5. 参数调优建议 在进行离线迁移时,建议根据集群规模和网络带宽调整参数,例如: - 增加 MapReduce 任务的并行度(`-m`)以提高吞吐量; - 设置合理的带宽限制(`-bandwidth`)避免网络拥塞; - 启用动态策略(`-strategy dynamic`)提升文件复制效率。 以上方法可根据实际环境选择,结合运维经验进行优化,以确保迁移过程高效、稳定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值