自定义hbase-mapreduce(代码片段)

丶落幕 丶落幕     2022-12-09     126

关键词:

1 hdfs -> table

需求: 从hdfs读取数据,插入到hbase的表中
mapper

public class FruitMapper extends Mapper<LongWritable, Text,LongWritable, Text> 
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException 
        context.write(key, value);
    

reducer

public class FruitReducer extends TableReducer<LongWritable, Text, NullWritable> 
    @Override
    protected void reduce(LongWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException 
        for (Text value : values) 
            String[] split = value.toString().split("\\t");
            Put put=new Put(Bytes.toBytes(split[0]));
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes(split[1]));
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("color"), Bytes.toBytes(split[2]));
            context.write(NullWritable.get(), put);
        
    

driver

public class FruitDriver implements Tool 
    private Configuration conf;
    @Override
    public int run(String[] strings) throws Exception 
        Job job = Job.getInstance(conf);
        job.setJarByClass(FruitDriver.class);

        job.setMapperClass(FruitMapper.class);
        job.setMapOutputKeyClass(LongWritable.class);
        job.setMapOutputValueClass(Text.class);

        TableMapReduceUtil.initTableReducerJob(strings[1], FruitReducer.class, job);

        FileInputFormat.setInputPaths(job, new Path(strings[0]));
        boolean b = job.waitForCompletion(true);
        return b?0:1;
    

    @Override
    public void setConf(Configuration configuration) 
        this.conf=configuration;
    

    @Override
    public Configuration getConf() 
        return this.conf;
    

    public static void main(String[] args) throws Exception 
        Configuration configuration = new Configuration();
        int run = ToolRunner.run(configuration, new FruitDriver(), args);
        System.exit(run);
    

打包上传并执行

  1. mr1.jar: 打包好的jar包,改了个名字
  2. com.cssl.mr1.FruitDriver: main函数所在的全类名
  3. /input_fruit/fruit.tsv: hdfs文件所在位置
  4. fruit1: hbase上的表名
yarn jar mr1.jar com.cssl.mr1.FruitDriver /input_fruit/fruit.tsv fruit1

2 table -> table

需求: 将hbase表中的数据导入到hbase的另一张表中

mapper

public class Fruit2Mapper extends TableMapper<ImmutableBytesWritable, Put> 
    @Override
    protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException 
        Put outV = new Put(key.get());
        for (Cell cell : value.rawCells()) 
            if ("name".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))) 
                outV.add(cell);
            
        
        context.write(key, outV);
    

reducer

public class Fruit2Reducer extends TableReducer<ImmutableBytesWritable, Put, NullWritable> 
    @Override
    protected void reduce(ImmutableBytesWritable key, Iterable<Put> values, Context context) throws IOException, InterruptedException 
        for (Put put : values) 
            context.write(NullWritable.get(), put);
        

    

driver
这样写是直接可以在本地运行的,需要把hbase的配置文件拷贝到项目的资源目录(有域名映射的话,Windows也需要配)
在这里插入图片描述

public class Fruit2Driver implements Tool 
    private Configuration configuration;
    @Override
    public int run(String[] strings) throws Exception 
        Job job = Job.getInstance(configuration);
        job.setJarByClass(Fruit2Driver.class);

        TableMapReduceUtil.initTableMapperJob("fruit1",
                new Scan(),
                Fruit2Mapper.class,
                ImmutableBytesWritable.class,
                Put.class,
                job);

        TableMapReduceUtil.initTableReducerJob("fruit2",
                Fruit2Reducer.class,
                job);

        boolean b = job.waitForCompletion(true);
        return b?0:1;
    

    @Override
    public void setConf(Configuration configuration) 
        this.configuration=configuration;
    

    @Override
    public Configuration getConf() 
        return this.configuration;
    

    public static void main(String[] args) throws Exception 
        Configuration configuration = HBaseConfiguration.create();
        int run = ToolRunner.run(configuration, new Fruit2Driver(), args);
        System.exit(run);
    

3 自定义协处理器

目标:当客户端往 "student" 中插入数据, 会同时向 "chen:student" 中插入数据

1)编写协处理器

/*
* 协处理器
* 1) 创建类: 继承BaseRegionObserver
* 2) 重写方法: postPut
* 3) 实现逻辑
*   增加student的数据,同时增加chen:student数据
* 4) 将项目打包后上传到hbase中,让hbase可以识别我们的协处理器
* */
public class InsertHbaseCoprocessor extends BaseRegionObserver 
    @Override
    public void postPut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit, Durability durability) throws IOException 
        //获取表
        Table table = e.getEnvironment().getTable(TableName.valueOf("chen:student"));
        //增加数据
        table.put(put);
        //关闭表
        table.close();
    

2)打包上传到hbase的lib目录并重启hbase

3)删除原来的student表,创建新表并指定协处理器

//新增指定协处理器的表
@Test
public void addCoprocessorTable() throws IOException 
    Admin admin = connection.getAdmin();
    TableName tableName = TableName.valueOf("student");
    if (!admin.tableExists(tableName)) 
        //创建表描述对象
        HTableDescriptor hTableDescriptor=new HTableDescriptor(tableName);
        //指定协处理器
        hTableDescriptor.addCoprocessor("com.cssl.InsertHbaseCoprocessor");
        //增加列族
        hTableDescriptor.addFamily(new HColumnDescriptor("info"));
        admin.createTable(hTableDescriptor);
        System.out.println("创建成功~~~");
    

4)测试插入并查看结果


自定义hbase-mapreduce1(代码片段)

自定义HBase-MapReduce1目标:将fruit表中的一部分数据(列为name的数据),通过MR迁入到fruit_mr表中。分步实现:1.构建FruitMapper类,用于读取fruit表中的数据packagecom.atlxl.mr1;importorg.apache.hadoop.hbase.Cell;importorg.apache.hadoop.hbase.CellUtil;imp 查看详情

hbase(代码片段)

...程3.5StoreFileCompaction3.6RegionSplit4.2HBaseAPI4.3MapReduce4.3.1官方HBase-MapReduce4.3.2使用MapReduce将本地数据导入到HBase4.3.3自定义HBase-MapReduce4.4与Hive的集成4.4.1HBase与Hive的对比4.4.2HBase与Hive集成使用5HBase优化5.1高可用5.2预分区5.3RowKey设计5.4内存... 查看详情

springsecurity自定义指南(代码片段)

序本文主要研究一下几种自定义springsecurity的方式主要方式自定义UserDetailsService自定义passwordEncoder自定义filter自定义AuthenticationProvider自定义AccessDecisionManager自定义securityMetadataSource自定义access访问控制自定义authenticationEntryPoint自... 查看详情

phpwordpress自定义自定义菜单类(代码片段)

查看详情

自定义ui自定义布局(代码片段)

系列文章目录自定义UI基础知识自定义UI绘制饼图自定义UI圆形头像自定义UI自制表盘自定义UI简易图文混排自定义UI使用Camera做三维变换自定义UI属性动画自定义UI自定义布局文章目录系列文章目录前言布局流程简介具体流程实现... 查看详情

自定义ui自定义布局(代码片段)

系列文章目录自定义UI基础知识自定义UI绘制饼图自定义UI圆形头像自定义UI自制表盘自定义UI简易图文混排自定义UI使用Camera做三维变换自定义UI属性动画自定义UI自定义布局文章目录系列文章目录前言布局流程简介具体流程实现... 查看详情

vscode自定义代码片段6——css选择器(代码片段)

CSS选择器自定义代码片段//CSS'selector//6如何自定义用户代码片段:VSCode=》左下角设置=》用户代码片段=》新建全局代码片段文件...=》自定义片段名称=》编辑用户片段=》ctrl+S保存//CSS选择器 "Printtocon... 查看详情

vscode自定义代码片段8——声明函数(代码片段)

声明函数 //f' //8如何自定义用户代码片段:VSCode=》左下角设置=》用户代码片段=》新建全局代码片段文件...=》自定义片段名称=》编辑用户片段=》ctrl+S保存 //声明函数 "Printtoconsole": "prefix"... 查看详情

vscode自定义代码片段1——vue主模板(代码片段)

VSCode自定义代码片段(vue主模板) //vue //1,自定义用户代码片段:VSCode=》左下角设置=》用户代码片段=》自定义片段名称=》编辑用户片段=》ctrl+S保存 //vue主模板 "Printtoconsole": "prefix":"vue"... 查看详情

自定义ui属性动画(代码片段)

系列文章目录自定义UI基础知识自定义UI绘制饼图自定义UI圆形头像自定义UI自制表盘自定义UI简易图文混排自定义UI使用Camera做三维变换自定义UI属性动画自定义UI自定义布局文章目录系列文章目录前言属性动画和视图动画的区别an... 查看详情

vscode自定义代码片段3——url大全(代码片段)

url大全 //url' //3如何自定义用户代码片段:VSCode=》左下角设置=》用户代码片段=》新建全局代码片段文件...=》自定义片段名称=》编辑用户片段=》ctrl+S保存 //url大全 "Printtoconsole": "prefix":... 查看详情

vscode自定义代码片段7——css动画(代码片段)

CSS动画//CSS'animation//7如何自定义用户代码片段:VSCode=》左下角设置=》用户代码片段=》新建全局代码片段文件...=》自定义片段名称=》编辑用户片段=》ctrl+S保存//CSS的动画"Printtoconsole":"prefix... 查看详情

xmllotus的自动更新自定义字段(自定义图像大小)(代码片段)

查看详情

php自定义元字段的自定义帖子类型(代码片段)

查看详情

xmllotus的自动更新自定义字段(自定义图像大小)(代码片段)

查看详情

自定义异常(代码片段)

为什么需要自定义异常类我们说了Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是SUN没有定义好的,此时我们根据自己业务的异常情况来定义异常类。什么是自定义异常类:在开发中根据自... 查看详情

自定义ui圆形头像(代码片段)

系列文章目录自定义UI基础知识自定义UI绘制饼图自定义UI圆形头像自定义UI自制表盘自定义UI简易图文混排自定义UI使用Camera做三维变换自定义UI属性动画自定义UI自定义布局文章目录系列文章目录前言创建绘制对象加载头像自定... 查看详情

vscode自定义代码片段5——html元素结构(代码片段)

HTML元素结构 //HTML'element //5如何自定义用户代码片段:VSCode=》左下角设置=》用户代码片段=》新建全局代码片段文件...=》自定义片段名称=》编辑用户片段=》ctrl+S保存 //HTML元素结构 "Printtoconsole":... 查看详情