关键词:
自定义 HBase-MapReduce
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);
打包上传并执行
- mr1.jar: 打包好的jar包,改了个名字
- com.cssl.mr1.FruitDriver: main函数所在的全类名
- /input_fruit/fruit.tsv: hdfs文件所在位置
- 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":... 查看详情