Hbase11:【案例】批量导出:TableMapReduceUtil或者HBase内部提供的Export工具类

一、批量导出

批量导出两种方式:

利用TableMapReduceUtil将数据导出 (需要开发MapReduce代码)
利用HBase内部提供的Export工具类

二、批量导出之TableMapReduceUtil

将HBase中的表batch1中的数据导出到hdfs上面
表batch1中的数据如下:

hbase(main):001:0> scan 'batch1'
ROW                COLUMN+CELL                                        
 a                 column=c1:age, timestamp=1778305406350, value=18   
 a                 column=c1:name, timestamp=1778305406350, value=zs  
 b                 column=c1:age, timestamp=1778305406350, value=29   
 b                 column=c1:name, timestamp=1778305406350, value=ls  
 c                 column=c1:age, timestamp=1778305406350, value=31   
 c                 column=c1:name, timestamp=1778305406350, value=ww  
3 row(s)
Took 0.7332 seconds 

代码如下:

package com.imooc.hbase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

/**
 * 批量导出
 * 1.利用TableMapReduceUtil将数据导出
 * 
 */
public class BatchExportTableMapReduceUtil {
    public static class BatchExportMapper extends TableMapper<Text,Text>{
        @Override
        protected void map(ImmutableBytesWritable key, Result result, Context context)
                throws IOException, InterruptedException {
            //key在这里就是hbase的Rowkey
            //result是scan返回的每行结果
            byte[] name = null;
            byte[] age = null;
            try{
                name = result.getValue("c1".getBytes(), "name".getBytes());
            }catch (Exception e){}
            try{
                age = result.getValue("c1".getBytes(), "age".getBytes());
            }catch (Exception e){}

            String v2 = ((name==null || name.length==0)?"NULL":new String(name))+"\t"+((age==null || age.length==0)?"NULL":new String(age));

            context.write(new Text(key.get()),new Text(v2));
        }
    }

    public static void main(String[] args) throws Exception{
        if(args.length!=2){
            //如果传递的参数不够,程序直接退出
            System.exit(100);
        }

        String inTableName = args[0];
        String outPath = args[1];

        //设置属性对应参数
        Configuration conf = new Configuration();
        conf.set("hbase.zookeeper.quorum","bigdata01:2181,bigdata02:2181,bigdata03:2181");

        //组装Job
        Job job = Job.getInstance(conf);
        job.setJarByClass(BatchExportTableMapReduceUtil.class);

        //设置map相关的配置
        job.setMapperClass(BatchExportMapper.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(Text.class);

        //禁用Reduce
        job.setNumReduceTasks(0);

        //设置输入信息
        TableMapReduceUtil.initTableMapperJob(inTableName,new Scan(),BatchExportMapper.class,Text.class,Text.class,job);

        //设置输出路径
        FileOutputFormat.setOutputPath(job,new Path(outPath));

        job.waitForCompletion(true);

    }
}

打jar包

mvn clean package -DskipTests

将jar包是上传到bigdata04上面,然后向集群提交任务

hadoop jar db_hbase-1.0-SNAPSHOT-jar-with-dependencies.jar com.imooc.hbase.BatchExportTableMapReduceUtil batch1 hdfs://bigdata01:9000/batch1

查看导出结果数据:

[root@bigdata04 hadoop-3.2.0]# hdfs dfs -cat /batch1/*
a       zs      18
b       ls      29
c       ww      31

注意:想要导出什么格式的数据,具体的逻辑代码在map函数内部根据需求实现即可。

三、批量导出之HBase内部方法

使用HBase提供的Export工具类直接导出数据

hbase org.apache.hadoop.hbase.mapreduce.Export batch1 hdfs://bigdata01:9000/batch2

注意:此种方式导出的数据格式是固定的
数据中的k1和v1是<ImmutableBytesWritable key, Result result>形式的

查看结果是这样的:

注意:直接使用cat命令查看会显示乱码,因为不是普通的文本文件

[root@bigdata04 ~]# hdfs dfs -cat /batch2/*
SEQ1org.apache.hadoop.hbase.io.ImmutableBytesWritable%org.apache.hadoop.hbase.client.Result#{MdAa;
_x0019_
a_x0012_c1age 218

a_x0012_c1name 2zs (Ab;
_x0019_
b_x0012_c1age 229

b_x0012_c1name 2ls (Ac;
_x0019_
c_x0012_c1age 231

c_x0012_c1name 2ww (

建议优先选择使用第一种,更加灵活,根据需求导出希望的数据格式。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做一个有趣的人Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值