赞
踩
批量导出两种方式:
利用TableMapReduceUtil将数据导出 (需要开发MapReduce代码)
利用HBase内部提供的Export工具类
将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提供的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 (
建议优先选择使用第一种,更加灵活,根据需求导出希望的数据格式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。