一、批量导出
批量导出两种方式:
利用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 (
建议优先选择使用第一种,更加灵活,根据需求导出希望的数据格式。