不需要提前察模宽建表,分区也会自动同步
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实时同步
初步了解一下情况,后续根据给出案例
一、从本地文件系统到HDFS
使用hdfs自带的命令
命令:hdfs dfs -copyFromLocal inputPath outputPath
inputPath:本地文件目录的路径
outputPath:hdfs文件目录路径,即存储路径
二、从HDFS到本地文件系统
命令:hdfs dfs -copyToLocal inputPath outputPath
inputPath:hdfs文件目录
outputPath:本地文件文件目录,即本地存储路径
因为Hbas和Hive都在存储在HDFS中,所以可以通过该条命令可以把Hbase和Hive存储在HDFS中的文件复制出来。但是经过实践,通高简过这种方式复制出来的Hbase文件是乱码。Hive里的文件有时候也会乱码,这取决于Hive数据的插入方式。
三、文件在HDFS内的移动
1、从Hbase表导出数据到HDFS
命令:hbase org.apache.hadoop.hbase.mapreduce.Export tableName outputPaht
例子:hbase org.apache.hadoop.hbase.mapreduce.Export test /user/data
test为需要从Hbase中导出的表,/user/data为hdfs上的路径,即存储路径,如果最后一个参数有前缀file:// 则为本地上的文件存储系统
2、从HDFS导入到Hbase表中,需要事先建立好表结构
命令:hbase org.apache.hadoop.hbase.mapreduce.Export tableName inputPaht
例子:hbase org.apache.hadoop.hbase.mapreduce.Import test1 /态拍temp/part-m-00000
案列:
两个不同环境数据,数据导入
过程描述:
导出正式环境数据到hdfs中,然后从hdfs中导出到本地,本地传到测试环境主机,然后从本地导入到hdfs中,再从hdfs中导入到hbase中。
处理过程:
1、注意事项:1、权限问题使用hdfs:sudo -u hdfs ;
2、存放上传路径最好不要在root下
帆念羡 3、上传完成后,查看是否在使用,数据已经插入。
1、sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.Export ** /hbase/**_bak (导出到hdfs中的**_bak)
2、hdfs dfs -copyToLocal /hbase/sw_bak /test (导出hdfs中文件到本地test,注:提前建好目录)
3、scp -r test_bak root@192.168.90.**:/root/test (传送目录到测试环境主机目录下,注:传到测试环境后,把文件不要放到root的目录下,换家目录下)
4、sudo -u hdfs hdfs dfs -copyFromLocal /chenzeng/text_bak /data (把sw传到hdfs 中,注意上传时,文件路径要对,放在data路径下比较好)
5、sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.Import test /data/test_bak/part-m-0000 (注意上次文件)
6、在hbase shell 中查看test :count 'test' 确认是否上传成功
优化:
truncate ‘’
正式环境导入至hdfs中时,
可以直接在另一个环境的执行sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.Import test hdfs://server243:8020/hbase**** 可以直接加主机和对应路径进行put。
步骤如下:1:从HBase集群中复制一份Hbase部署文件,放置在开发端某一目录下(如在/扮隐app/hadoop/hbase096目录下)。
2:在eclipse里新建一个java项目HBase,然后选择项目属性,在Libraries->Add External JARs...,然后选择/app/hadoop/hbase096/lib下相关的JAR包,如果只是测试用的话,就简单一点,将所有的JAR选上。
3:在项目HBase下增加一个文件没慧夹conf,将Hbase集群的配置文件hbase-site.xml复制到该目录,然后选择项目属性在Libraries->Add Class Folder,将刚刚增加的conf目录选上。
4:在HBase项目中增加一个chapter12的package,然后增加一个HBaseTestCase的class,然后将《Hadoop实战第2版》12章的代码复制进去,做适当的修改,代码如下:
package chapter12
import java.io.IOException
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.HColumnDescriptor
import org.apache.hadoop.hbase.HTableDescriptor
import org.apache.hadoop.hbase.client.Get
import org.apache.hadoop.hbase.client.HBaseAdmin
import org.apache.hadoop.hbase.client.HTable
import org.apache.hadoop.hbase.client.Put
import org.apache.hadoop.hbase.client.Result
import org.apache.hadoop.hbase.client.ResultScanner
import org.apache.hadoop.hbase.client.Scan
import org.apache.hadoop.hbase.util.Bytes
public class HBaseTestCase {
//声明静态配置 HBaseConfiguration
static Configuration cfg=HBaseConfiguration.create()
//创建一张表,通过HBaseAdmin HTableDescriptor来创建
public static void creat(String tablename,String columnFamily) throws Exception {
HBaseAdmin admin = new HBaseAdmin(cfg)
if (admin.tableExists(tablename)) {
System.out.println("table Exists!")
System.exit(0)
}
else{
HTableDescriptor tableDesc = new HTableDescriptor(tablename)
tableDesc.addFamily(new HColumnDescriptor(columnFamily))
admin.createTable(tableDesc)
System.out.println("create table success!")
}
}
//添加一条数据,通过HTable Put为已枯缺答经存在的表来添加数据
public static void put(String tablename,String row, String columnFamily,String column,String data) throws Exception {
HTable table = new HTable(cfg, tablename)
Put p1=new Put(Bytes.toBytes(row))
p1.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(data))
table.put(p1)
System.out.println("put '"+row+"','"+columnFamily+":"+column+"','"+data+"'")
}
public static void get(String tablename,String row) throws IOException{
HTable table=new HTable(cfg,tablename)
Get g=new Get(Bytes.toBytes(row))
Result result=table.get(g)
System.out.println("Get: "+result)
}
//显示所有数据,通过HTable Scan来获取已有表的信息
public static void scan(String tablename) throws Exception{
HTable table = new HTable(cfg, tablename)
Scan s = new Scan()
ResultScanner rs = table.getScanner(s)
for(Result r:rs){
System.out.println("Scan: "+r)
}
}
public static boolean delete(String tablename) throws IOException{
HBaseAdmin admin=new HBaseAdmin(cfg)
if(admin.tableExists(tablename)){
try
{
admin.disableTable(tablename)
admin.deleteTable(tablename)
}catch(Exception ex){
ex.printStackTrace()
return false
}
}
return true
}
public static void main (String [] agrs) {
String tablename="hbase_tb"
String columnFamily="cf"
try {
HBaseTestCase.creat(tablename, columnFamily)
HBaseTestCase.put(tablename, "row1", columnFamily, "cl1", "data")
HBaseTestCase.get(tablename, "row1")
HBaseTestCase.scan(tablename)
/* if(true==HBaseTestCase.delete(tablename))
System.out.println("Delete table:"+tablename+"success!")
*/
}
catch (Exception e) {
e.printStackTrace()
}
}
}
5:设置运行配置,然后运行。运行前将Hbase集群先启动。
6:检验,使用hbase shell查看hbase,发现已经建立表hbase_tb。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)