`
刘小小尘
  • 浏览: 66067 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hadoop集群间的hbase数据迁移

阅读更多

在日常的使用过程中,可能经常需要将一个集群中hbase的数据迁移到或者拷贝到另外一个集群中,这时候,可能会出很多问题

以下是我在处理的过程中的一些做法和处理方式。

前提,两个hbase的版本一直,否则可能出现不可预知的问题,造成数据迁移失败

当两个集群不能通讯的时候,可以先将数据所在集群中hbase的数据文件拷贝到本地

具体做法如下:

 

在hadoop目录下执行如下命令,拷贝到本地文件。
bin/hadoop fs -copyToLocal /hbase/tab_keywordflow /home/test/xiaochenbak

然后你懂得,将文件拷贝到你需要的你需要迁移到的那个集群中,目录是你的表的目录,

如果这个集群中也有对应的表文件,那么删除掉,然后拷贝。

 

/bin/hadoop fs -rmr /hbase/tab_keywordflow

/bin/hadoop fs -copyFromLocal /home/other/xiaochenbak /hbase/tab_keywordflow
此时的/home/other/xiaochenbak为你要迁移到数据的集群。

重置该表在.META.表中的分区信息

bin/hbase org.jruby.Main /home/other/hbase/bin/add_table.rb /hbase/tab_keywordflow

 

 

/home/other/hbase/bin/add_table.rb为ruby脚本,可以执行,脚本内容如下:另存为add_table.rb即可

 

 

#
# Copyright 2009 The Apache Software Foundation
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Script adds a table back to a running hbase.
# Currently only works on if table data is in place.
#
# To see usage for this script, run:
#
#  ${HBASE_HOME}/bin/hbase org.jruby.Main addtable.rb
#
include Java
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.HConstants
import org.apache.hadoop.hbase.regionserver.HRegion
import org.apache.hadoop.hbase.HRegionInfo
import org.apache.hadoop.hbase.client.HTable
import org.apache.hadoop.hbase.client.Delete
import org.apache.hadoop.hbase.client.Put
import org.apache.hadoop.hbase.client.Scan
import org.apache.hadoop.hbase.HTableDescriptor
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.util.FSUtils
import org.apache.hadoop.hbase.util.Writables
import org.apache.hadoop.fs.Path
import org.apache.hadoop.fs.FileSystem
import org.apache.commons.logging.LogFactory

# Name of this script
NAME = "add_table"

# Print usage for this script
def usage
  puts 'Usage: %s.rb TABLE_DIR [alternate_tablename]' % NAME
  exit!
end

# Get configuration to use.
c = HBaseConfiguration.new()

# Set hadoop filesystem configuration using the hbase.rootdir.
# Otherwise, we'll always use localhost though the hbase.rootdir
# might be pointing at hdfs location.
c.set("fs.default.name", c.get(HConstants::HBASE_DIR))
fs = FileSystem.get(c)

# Get a logger and a metautils instance.
LOG = LogFactory.getLog(NAME)

# Check arguments
if ARGV.size < 1 || ARGV.size > 2
  usage
end

# Get cmdline args.
srcdir = fs.makeQualified(Path.new(java.lang.String.new(ARGV[0])))

if not fs.exists(srcdir)
  raise IOError.new("src dir " + srcdir.toString() + " doesn't exist!")
end

# Get table name
tableName = nil
if ARGV.size > 1
  tableName = ARGV[1]
  raise IOError.new("Not supported yet")
elsif
  # If none provided use dirname
  tableName = srcdir.getName()
end
HTableDescriptor.isLegalTableName(tableName.to_java_bytes)

# Figure locations under hbase.rootdir
# Move directories into place; be careful not to overwrite.
rootdir = FSUtils.getRootDir(c)
tableDir = fs.makeQualified(Path.new(rootdir, tableName))

# If a directory currently in place, move it aside.
if srcdir.equals(tableDir)
  LOG.info("Source directory is in place under hbase.rootdir: " + srcdir.toString());
elsif fs.exists(tableDir)
  movedTableName = tableName + "." + java.lang.System.currentTimeMillis().to_s
  movedTableDir = Path.new(rootdir, java.lang.String.new(movedTableName))
  LOG.warn("Moving " + tableDir.toString() + " aside as " + movedTableDir.toString());
  raise IOError.new("Failed move of " + tableDir.toString()) unless fs.rename(tableDir, movedTableDir)
  LOG.info("Moving " + srcdir.toString() + " to " + tableDir.toString());
  raise IOError.new("Failed move of " + srcdir.toString()) unless fs.rename(srcdir, tableDir)
end

# Clean mentions of table from .META.
# Scan the .META. and remove all lines that begin with tablename
LOG.info("Deleting mention of " + tableName + " from .META.")
metaTable = HTable.new(c, HConstants::META_TABLE_NAME)
tableNameMetaPrefix = tableName + HConstants::META_ROW_DELIMITER.chr
scan = Scan.new((tableNameMetaPrefix + HConstants::META_ROW_DELIMITER.chr).to_java_bytes)
scanner = metaTable.getScanner(scan)
# Use java.lang.String doing compares.  Ruby String is a bit odd.
tableNameStr = java.lang.String.new(tableName)
while (result = scanner.next())
  rowid = Bytes.toString(result.getRow())
  rowidStr = java.lang.String.new(rowid)
  if not rowidStr.startsWith(tableNameMetaPrefix)
    # Gone too far, break
    break
  end
  LOG.info("Deleting row from catalog: " + rowid);
  d = Delete.new(result.getRow())
  metaTable.delete(d)
end
scanner.close()

# Now, walk the table and per region, add an entry
LOG.info("Walking " + srcdir.toString() + " adding regions to catalog table")
statuses = fs.listStatus(srcdir)
for status in statuses
  next unless status.isDir()
  next if status.getPath().getName() == "compaction.dir"
  regioninfofile =  Path.new(status.getPath(), HRegion::REGIONINFO_FILE)
  unless fs.exists(regioninfofile)
    LOG.warn("Missing .regioninfo: " + regioninfofile.toString())
    next
  end
  is = fs.open(regioninfofile)
  hri = HRegionInfo.new()
  hri.readFields(is)
  is.close()
  # TODO: Need to redo table descriptor with passed table name and then recalculate the region encoded names.
  p = Put.new(hri.getRegionName())
  p.add(HConstants::CATALOG_FAMILY, HConstants::REGIONINFO_QUALIFIER, Writables.getBytes(hri))
  metaTable.put(p)
  LOG.info("Added to catalog: " + hri.toString())
end


好了,以上就是我的做法,如何集群键可以通信,那就更好办了,相信你懂得,scp

 

 

分享到:
评论

相关推荐

    Hadoop数据迁移--从Hadoop向HBase载入数据

    HBase集群通常会与Hadoop集群设置在同一个集群中,这意味着HBase使用的分布式文件系统(HDFS)就是生成HFile文件的MapReduce任务所在的同一集群。这样设置的好处是减少了数据迁移过程中的网络传输,并且可以利用...

    大数据-数据迁移-hive、hbase、kudu迁移

    本文档详细记录了一次从自建Hadoop集群到华为云MRS(Managed Service for Big Data)的大规模数据迁移项目,涉及到了Hive、Kudu和HBase这三种不同类型的数据存储系统。以下是针对这些系统的迁移策略、流程和解决方案...

    Hadoop与HBase部署文档

    而HBase是一款基于Hadoop的分布式、高性能、列式存储的NoSQL数据库,适用于实时查询和分析大规模数据。 1. **简介** 在部署Hadoop和HBase时,我们需要构建一个可靠的分布式环境,确保数据的高可用性和容错性。...

    基于集群的HBase安装和配置

    它能够有效地管理Hadoop集群中的各种资源和服务,例如Hadoop NameNode管理和HBase的Master选举及服务器间的通信。 - **Zookeeper的作用**: - **集群管理**:确保集群中服务的高可用性,例如通过选举机制确定当前...

    hbase基于快照的数据迁移

    ### HBase基于快照的数据迁移 #### 前言 HBase是一款开源的、分布式的、面向列的数据库系统,其设计目标是为了处理大规模数据集(TB甚至PB级别)。随着业务的发展,数据量逐渐增大,可能需要将数据从一个集群迁移...

    Hadoop+Hbase搭建云存储总结

    - **数据迁移与同步:** 将现有数据迁移到HDFS中,并在Hbase中建立相应的表结构。 - **系统优化:** 根据业务需求调整HDFS和Hbase的参数配置,确保性能最优。 **3. 应用场景** - **大数据分析:** 结合Hadoop的...

    hbase-0.94.1手动数据迁移.docx

    在HBase这样的分布式数据库系统中,数据迁移是一个常见的任务,特别是在集群扩展、故障恢复或版本升级等场景下。本文档详细介绍了如何在HBase 0.94.1版本上手动进行数据迁移,主要涉及以下几个关键步骤: 1. **数据...

    大数据云计算技术系列 Hadoop之Hbase从入门到精通(共243页).pdf

    Sqoop则提供了与关系型数据库(RDBMS)的桥梁,方便传统数据库数据迁移到HBase。 总的来说,HBase是大数据和云计算环境中解决大规模结构化数据存储和处理问题的重要工具。通过深入理解其技术原理和使用方法,开发者...

    安装笔记:hadoop+hbase+sqoop2+phoenix+kerberos

    Hadoop是大数据处理的核心组件,它由两个主要集群构成:HDFS(Hadoop Distributed File System)集群和YARN(Yet Another Resource Negotiator)集群。HDFS负责大规模数据的存储,其中包含NameNode、DataNode和...

    大数据与云计算培训学习资料 Hadoop集群 细细品味Hadoop_第11期_HBase简介及安装_V1.0 共21页.pdf

    【大数据与云计算培训学习资料 Hadoop集群 细细品味Hadoop_第11期_HBase简介及安装_V1.0 共21页.pdf】这篇文档主要介绍了HBase这一大数据处理的重要组件,以及其在Hadoop生态系统中的角色。HBase是一个基于列族的...

    HBASE跨集群迁移总结---扎啤1

    首先,当需要进行HBase集群迁移时,通常是因为硬件升级、灾难恢复或数据中心迁移等原因。在这种情况下,一种常见的方法是使用Hadoop的DistCp(Distributed Copy)工具。然而,值得注意的是,这种迁移方式需要停止源...

    分布式数据库课程设计+基于Hbase的滴滴出行数据分析+Hive+Hadoop+Mysql+Sqoop+可视化

    首先,爬取滴滴出行的相关数据,然后通过 HDFS 将数据上传至 Hadoop 集群,接着使用 Hbase 存储这些原始数据,确保数据的分布式存储和高效检索。 3.2 数据分析与转换 在 Hbase 中的数据导入到 Hive 表后,利用 ...

    ZooKeeper 原理及其在 Hadoop 和 HBase 中的应用

    它主要用于解决Hadoop集群中的以下问题: 1. **NameNode高可用**:Hadoop的HDFS组件依赖于ZooKeeper来实现NameNode的高可用性。通过在ZooKeeper上维护一个活跃的NameNode列表,可以实现在主NameNode宕机时自动切换...

    zookeeper3.4.12+hbase1.4.4+sqoop1.4.7+kafka2.10

    在构建大数据处理环境时,Hadoop集群是核心基础,而`zookeeper3.4.12+hbase1.4.4+sqoop1.4.7+kafka2.10`这一组合则提供了集群中不可或缺的组件。让我们逐一探讨这些组件的功能、作用以及它们之间的协同工作。 **...

    hadoop安装文件.rar,内涵hadoop安装的步骤word,hadoop、hive、hbase、sqoop、mysql等

    Sqoop是一个用于在Hadoop和传统关系型数据库之间进行数据迁移的工具。通过Sqoop,我们可以将结构化的数据导入到Hadoop的HDFS中,或者将Hadoop中的数据导出到关系数据库。安装Sqoop需要确保已安装Hadoop和JDBC驱动,...

    大数据集群迁移方案

    1. **同版本集群迁移**:如果新旧集群版本相同,则可以直接使用`hadoop distcp`命令进行数据复制。例如,从旧集群`namenodeip:9000`复制数据到新集群的命令如下: ```bash hadoop distcp hdfs://namenodeip:9000/...

    Hadoop2.2.0Hbase0.98.1Hive0.13完全安装手册

    此外,还需要进一步配置其他必要的文件,如 `hdfs-site.xml`, `mapred-site.xml` 和 `yarn-site.xml` 等,以便启动Hadoop集群。 #### 二、HBase安装 安装完Hadoop之后,下一步是安装HBase。 1. **下载并解压HBase*...

    hadoop环境部署全套组件,下载后直接可用(虚拟机全套)

    它可以导入导出数据,实现批处理操作,将结构化数据高效地迁移到Hadoop集群或者从Hadoop迁出。 5. **Flume**:日志收集、聚合和传输的系统,设计用于高可用性和可靠性,可以将数据从各种源(如Web服务器日志)收集...

    Hadoop之Hbase从入门到精通.doc

    - **Sqoop**:为HBase提供了便捷的数据导入功能,方便将关系型数据库中的数据迁移到HBase中。 #### HBase 的访问接口 为了便于用户访问和操作HBase中的数据,HBase提供了多种访问接口: 1. **Native Java API**:...

    hbase导出csv,文本,html文件

    而Hive则是一个数据仓库工具,它允许用户使用SQL-like语言(HQL)对Hadoop集群上的大量数据进行分析和查询。 标题“hbase导出csv,文本,html文件”指的是从HBase中导出数据并转换为常见的文本格式,如CSV、文本和...

Global site tag (gtag.js) - Google Analytics