TableMapReduceUtil使用
时间:2019-10-24
本文章向大家介绍TableMapReduceUtil使用,主要包括TableMapReduceUtil使用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
标签:
今天在从文件中读取数据在写入到hbase的时候,使用到了TableMapReduceUtil工具类,使用过程只需要简单的设置之后工具类会帮我们生成写入到HBase的任务,工作类封装了许多MapReduce写入到HBase的操作,无需我们自己再去设置,下面大致看看内部的实现机制,对TableMapReduceUtil有个比较深入的了解
使用过程:在map端生成了<ImmutableBytesWritable , put>的输出类型,key和value分别为key和put对象,然后使用如下设置
1 TableMapReduceUtil.initTableReducerJob("Test_MR_HBase", // output table 2 null, // reducer class 3 job); // TableMapReduceUtil是HBase提供的工具类,会自动设置mapreuce提交到hbase任务的各种配置,封装了操作 4 job.setNumReduceTasks(0);// 设置reduce过程,这里由map端的数据直接提交,不要使用reduce类,因而设置成null,并设置reduce的个数为0 5 FileInputFormat.addInputPath(job, new Path(args[0]));// 设置输入文件路径
追踪方法的具体细节,查看具体的实现过程,发现最核心的任务设置的方法
1 public static void initTableReducerJob(String table, 2 Class<? extends TableReducer> reducer, Job job, 3 Class partitioner, String quorumAddress, String serverClass, 4 String serverImpl, boolean addDependencyJars) throws IOException { 5 6 Configuration conf = job.getConfiguration(); 7 HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf)); 8 job.setOutputFormatClass(TableOutputFormat.class);//可见输出使用的TableOutputFormat类,结果会通过网络请求到HBase集群 9 if (reducer != null) job.setReducerClass(reducer);//设置reudce 10 conf.set(TableOutputFormat.OUTPUT_TABLE, table);//设置输出hbase的表 11 conf.setStrings("io.serializations", conf.get("io.serializations"), 12 MutationSerialization.class.getName(), ResultSerialization.class.getName()); 13 // If passed a quorum/ensemble address, pass it on to TableOutputFormat. 14 if (quorumAddress != null) { 15 // Calling this will validate the format 16 ZKUtil.transformClusterKey(quorumAddress); 17 conf.set(TableOutputFormat.QUORUM_ADDRESS,quorumAddress); 18 } 19 if (serverClass != null && serverImpl != null) { 20 conf.set(TableOutputFormat.REGION_SERVER_CLASS, serverClass); 21 conf.set(TableOutputFormat.REGION_SERVER_IMPL, serverImpl); 22 } 23 job.setOutputKeyClass(ImmutableBytesWritable.class);//设置输出key的类型 24 job.setOutputValueClass(Writable.class);//输出的value类型 25 if (partitioner == HRegionPartitioner.class) { 26 job.setPartitionerClass(HRegionPartitioner.class);//设置partitioner算法,partition算法会决定map输出的结果输出到哪一个reduce上 27 int regions = MetaReader.getRegionCount(conf, table);//获得region的数量,并根据region的数量设置reduce的个数 28 if (job.getNumReduceTasks() > regions) {//将reudce的数目设置成region的个数 29 job.setNumReduceTasks(regions); 30 } 31 } else if (partitioner != null) { 32 job.setPartitionerClass(partitioner); 33 } 34 35 if (addDependencyJars) { 36 addDependencyJars(job); 37 } 38 39 initCredentials(job); 40 }
值得注意的一点是工具类最终的实现是通过HBase的put方法通过网络请求提交数据,在大批量写入时需要考虑对hbase带来的负载
driver程序如下:
1 private int excuteHFile(String[] args) throws Exception { 2 Configuration conf = HBaseConfiguration.create();// 任务的配置设置,configuration是一个任务的配置对象,封装了任务的配置信息 3 4 Job job = Job.getInstance(conf, "HFile bulk load test");// 生成一个新的任务对象并设置dirver类 5 6 job.setJarByClass(HfileToHBaseDriver.class); 7 job.setMapperClass(HfileToHBaseMapper.class); // 设置任务的map类和 ,map类输出结果是ImmutableBytesWritable和put类型 8 9 TableMapReduceUtil.initTableReducerJob("Test_MR_HBase", // output table 10 11 null, // reducer class 12 13 job);// TableMapReduceUtil是HBase提供的工具类,会自动设置mapreuce提交到hbase任务的各种配置,封装了操作,只需要简单的设置即可 14 15 job.setNumReduceTasks(0);// 设置reduce过程,这里由map端的数据直接提交,不要使用reduce类,因而设置成null,并设置reduce的个数为0 16 17 FileInputFormat.addInputPath(job, new Path(args[0]));// 设置输入文件路径 18 19 return (job.waitForCompletion(true) ? 0 : -1); 20 }
原文地址:https://www.cnblogs.com/ninglinglong/p/11732706.html
- scrapy回调函数传递参数
- python更新数据库脚本两种方法
- 使聊天机器人具有个性
- 遇到502错误,invalid request block size 解决方法
- python中json.loads,dumps,jsonify使用
- sqlalchemy和flask-sqlalchemy几种分页操作
- 一个 tflearn 情感分析小例子
- 前端js,后台python实现RSA非对称加密
- 运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist
- ODL应用开发之MD-SAL中级教程
- Sql参数是一个list的最佳实践
- MyBatis 配置输出日志,不输出SQL问题解决
- lombok让你提高代码整洁度的神器附教程及原理分析
- mvn编译的时候一个破错误,google只有3个结果maven : Failed to install metadata project Could not parse metadata maven-
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MyBatis 增删改查
- python分析wav文件
- CICD实战——服务自动构建与部署
- python+opencv实时视频目标检测
- python数据化运营分析实例---销售预测
- Leetcode 1444. 切披萨的方案数(DP,类似石材切割,二维前缀和)
- Python生成内涵图片
- Linux 下makefile实战 ——编写真实的C项目
- MySQL8功能详解——Common table expression (CTE)
- 游戏数据分析
- MySQL8功能详解——隐藏索引
- python 操作excel(附案例)
- 如何在 Spring Boot 中 读写数据
- MyBatis 多表操作
- 从0打造wordpress插件wp2oc fileshare (1) – 将wp存储后端做进owncloud