离线备份hbase数据

1. Export/Import(导入导出)

hdfs常用命令:

http://www.cnblogs.com/gaopeng527/p/4314215.html

1) 导出

    通过Export导出数据到目标集群的hdfs,再在目标集群执行import导入数据,Export支持指定开始时间和结束时间,因此可以做增量备份,Export工具参数如下:

可见,在导出时可以指定version,starttime,endtime等参数,并且可以通过-D指定是否压缩,指定caching等属性。

// hbase org.apache.hadoop.hbase.mapreduce.Export test4 hdfs://t2-namenode:9000/test4_90 1

1415693812520 1415694912520

// hbase org.apache.hadoop.hbase.mapreduce.Export 表名  数据文件位置 版本 开始时间 结束时间

Export导出工具与CopyTable一样是依赖hbase的scan读取数据,并且采用的InportFormat与CopyTable一样是TableInputFormat类,从该类的getSplits()方法可以看出MR的map数与hbase表的region数相同。

如hbase的test_table表内容如下:

导出:

hbase org.apache.hadoop.hbase.mapreduce.Export test_table /opt/hbase-data-back/test_table_back

//hbase org.apache.hadoop.hbase.mapreduce.Driver export test_table /opt/hbase-data-back/test_table_back

 

查看文件:

注:上面的路径并不是我最初认为的系统目录,而是hdfs内部的目录。因此在系统中是找不到此文件的。可以通过hdfs的命令查看文件:

hadoop fs -ls /opt/hbase-data-back/test_table_back

注:增量备份:

在最后加上版本号和时间就可以了,时间需要使用数字格式,可使用此页面工具将日期时间转为数字:

http://tool.chinaz.com/Tools/unixtime.aspx

如:

2017-05-19 00:00:00 1495123200000

2017-05-29 00:00:00 1495987200000

/hbase org.apache.hadoop.hbase.mapreduce.Export harve_plate /hdfs/data_back/harve_plate 1 1483200000000 1495123200000

2) 获取hdfs文件到系统

将hdfs中的/opt/hbase-data-back/test_table_back,复制到系统的/opt/hbase-data-back/test_table_back中:

hadoop fs -get /opt/hbase-data-back/test_table_back /opt/hbase-data-back/test_table_back

然后系统中自动创建了一个test_table_back目录

目录中的文件也复制过来了:

3) 将备份文件添加到hdfs中

将上面的目录复制到新的机器中,通过put将文件上传到hdfs中去。

hadoop dfs -put localFile hdfsFile

如:把系统的/opt/hbase-data-back/test_table_back上传到hdfs的/opt/hbase-data-back/test_table_back2下。

查看/opt/hbase-data-back/test_table_back2下的内容:


4) 导入:

先创建一张一样的表:

hbase org.apache.hadoop.hbase.mapreduce.Import test_table_back /opt/hbase-data-back/test_table_back

网上有人说要这么写(指定从hdfs获取数据):hdfs://l-master.data/opt/hbase-data-back/test_table_back

但不这么写默认就是从hdfs中获取数据。

 

在import时可以指定使用bulk的方式,bulk是生成hfile格式的文件,直接导入到Region,无需经历hbase的写数据过程,从而无需消耗memstore,无需Flush等,更加高效,如果不指定bulk文件路径(hdfs的路径)则会采用hbase 的put和delete API进行写入。

$ bin/hbase -Dhbase.import.version=0.94 org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>

使用Import工具前必须先创建表,关于hbase.import.version属性是0.96的功能。

导入结束后查看数据:

导入成功。

5) 大数据量导出

导出user表,接近18万条记录:

/hbs/hbase-1.0.3/bin/hbase org.apache.hadoop.hbase.mapreduce.Export harve_user /hdfs/data_back/harve_user_back

 导出失败了,查看hdfs中的内容也是空的:

失败原因:

2017-06-19 15:41:21,996 INFO  [main] mapreduce.Job: Task Id : attempt_1492400325003_0004_m_000002_2, Status : FAILED

Container [pid=126946,containerID=container_1492400325003_0004_01_000020] is running beyond virtual memory limits. Current usage: 162.1 MB of 1 GB physical memory used; 2.1 GB of 2.1 GB virtual memory used. Killing container.

机上运行的Container试图使用过多的内存,而被NodeManager kill掉了。

该错误是YARN的虚拟内存计算方式导致,上例中用户程序申请的内存为1Gb,YARN根据此值乘以一个比例(默认为2.1)得出申请的虚拟内存的值,当YARN计算的用户程序所需虚拟内存值大于计算出来的值时,就会报出以上错误。调节比例值可以解决该问题。

解决方法:mapred-site.xml中设置map和reduce任务的内存配置如下:(value中实际配置的内存需要根据自己机器内存大小及应用情况进行修改)

<property>
<name>mapreduce.map.memory.mb</name>
<value>1536</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1024M</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>3072</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx2560M</value>
</property>

 MapReduce作业配置参数

可在客户端的mapred-site.xml中配置,作为MapReduce作业的缺省配置参数。也可以在作业提交时,个性化指定这些参数。

修改配置文件重启后再次执行,成功:

最终导出后共300多M

猜你喜欢

转载自blog.csdn.net/xiaolong_4_2/article/details/84848869