hadoop基础之MapReduce的学习

hadoop基础之MapReduce的学习

MapReduce的执行步骤:

1.Map

package com.shujia.mr.worcount;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*TODO MapTask阶段自定义类继承Mapper,该Mapper类为一个具体的类,并其中定义了一些泛型<KEYIN, VALUEIN, KEYOUT, VALUEOUT>MapTask阶段需要编写map函数,定义数据处理的逻辑KEYIN: 表示输入的Key的类型 表示map函数处理的Key类型 变量保存的数据是偏移量读取数据的位置 字节数的位置非常大,需要使用Long类型 => LongWritableVALUEIN: 表示输入的Value类型  表示map函数处理的Value类型  表示的是一行字符串数据 String => TextKEYOUT: 表示输出的Key的类型 根据要处理的数据逻辑来进行定义 => 输出的Key为单词 => Java中的String类型 => Hadoop中的TextVALUEOUT:表示输出的Value的类型 根据要处理的数据逻辑来进行定义 => 输出的Value为1 => Java中的int类型 => Hadoop中的IntWritable注意:当数据在Hadoop中进行传递时,需要进行序列化,而Java中的序列化内容多,比较重,导致网络IO开销大为了计算速度快,Hadoop提供一套新的序列化类型*/// Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> 中传入参数的类型由所要解决的问题来决定
// Mapper<LongWritable, Text, Text, IntWritable>
public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> {/***  map函数中定义了Task任务在Map阶段所做的数据处理任务*      当前函数中需要对获取到的一行字符串进行按照 空格切分,再将单词遍历 之后再形成 Key为单词  1为Value的数据形式*  TODO 注意:map方法在执行的过程中是一行数据对应调用一次该函数* @param key 变量保存的数据是偏移量* @param value 表示的是一行字符串数据 是从文本文件中按行读取出来的* @param context 表示的是 Mapper.Context的上下文对象,作用是连接 Map阶段和Reduce阶段的桥梁*/@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {// value遍历中的数据 => hello hadoop// TODO 获取到的一行字符串进行按照 空格切分String[] words = value.toString().split(" ");// TODO 再将单词遍历for (String word : words) {// TODO 形成Key为单词  1为Value的数据形式// context 对象可以将Map阶段生成的数据发送给reduce阶段context.write(new Text(word),new IntWritable(1));}}
}

2.Reduce

package com.shujia.mr.worcount;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*TODO ReduceTask阶段自定义类继承Reducer,该Reducer类为一个具体的类,并其中定义了一些泛型<KEYIN, VALUEIN, KEYOUT, VALUEOUT>Reduce阶段的数据是由Map阶段发送过来的,所以Map阶段输出的类型就是Reduce阶段接收的类型根据处理逻辑:KEYIN: TextVALUEIN: IntWritable根据数据最终的要求:KEYOUT, VALUEOUT 表示最终每个单词出现的次数KEYOUT : TextVALUEOUT: IntWritable*/
public class WordCountReducer extends Reducer<Text, IntWritable,Text, IntWritable> {/***  reduce函数中定义了 Reduce阶段中要执行的代码逻辑*      将相同单词的KeyValue数据汇集到一起,再将所有的Value值 1 进行相加 得到最终的结果*  TODO 注意:① 对于reduce函数需要等Mapper阶段执行完成后才能再执行*            ② 对于每个Key会调用一次reduce函数*            ③ 对于Key的处理是存在有先后顺序的 按照字典序进行排序* @param key  表示map端输出的Key数据 单词* @param values 类型为Iterable 表示相同Key的Value数据形成的迭代器* @param context 上下文对象  可以将数据写出到HDFS* @throws IOException* @throws InterruptedException*/@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {// 定义num 用于记录单词出现的次数int num = 0;// TODO 再将所有的Value值 1 进行相加 得到最终的结果for (IntWritable value : values) {// value为IntWritable类型,需要使用get()取出其中的数值,再进行相加num += value.get();}context.write(key,new IntWritable(num));}
}

3.MapReduce程序入口中的固定写法

package com.shujia.mr.worcount;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;import java.io.FileNotFoundException;
import java.io.IOException;public class WordCount {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {// TODO MapReduce程序入口中的固定写法// TODO 1.获取Job对象 并设置相关Job任务的名称及入口类// 方式1:
//        Job job = new Job();
//        job.setJobName("word count");// 方式2:(常用)Configuration conf = new Configuration();Job job = Job.getInstance(conf, "word count");// 设置当前main方法所在的入口类job.setJarByClass(WordCount.class);// TODO 2.设置自定义的Mapper和Reducer类job.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);// TODO 3.设置Mapper的KeyValue输出类 和 Reducer的输出类 (最终输出)job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);//TODO 4.设置数据的输入和输出路径//  输入、输出都在HDFS上???(执行方式1)//  org.apache.hadoop.mapreduce.lib.input.TextInputFormat;//  org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;// 数据的输入:读取HDFS中的数据
//        TextInputFormat.addInputPath(job,new Path("/data/words.txt"));
//        TextOutputFormat.setOutputPath(job,new Path("/api/wordCount"));// 本地路径(执行方式2:在本地执行)// 从job中获取Configuration对象,获取一个fileSystem对象FileSystem fileSystem = FileSystem.get(job.getConfiguration());// 定义路径(并且下面会对路径的存在与否进行判断)Path outPath = new Path("hadoop/out/wordCount");
//        Path inpath = new Path("hadoop/data/words.txt");Path inpath = new Path("hadoop/data/words");// 判断输入路径是否存在if (!fileSystem.exists(inpath)) {throw new FileNotFoundException(inpath+"不存在");
//            System.out.println(inpath+"不存在");
//            System.exit(1);}// TODO TextInputFormat、FileInputFormat类均可实现该方法//  添加输入路径
//        TextInputFormat.addInputPath(job,inpath);FileInputFormat.addInputPath(job,inpath);// 判断输出路径是否存在,若存在则进行删除if (fileSystem.exists(outPath)) {System.out.println("路径存在,开始删除");fileSystem.delete(outPath,true);}// TODO TextInputFormat、FileInputFormat类均可实现该方法//  添加输出路径
//        TextOutputFormat.setOutputPath(job,outPath);FileOutputFormat.setOutputPath(job,outPath);// TODO 5.提交任务开始执行job.waitForCompletion(true);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/16945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

24校招总结

个人背景 本科&#xff1a;三本通信专业 硕士&#xff1a;B区双非计算机硕 今年2月签了东南沿海二线城市某公司C游戏服务端开发 我同学大部分都是去电网&#xff0c;大专老师&#xff0c;气象局事业编……就我这个是纯牛马了。 离收到Offer3个月了&#xff0c;前段时间参加…

高项案例分析知识点总结

文章目录 纠错题计算题进度估算成本管理立项管理版本管理组合管理知识产权信息技术计算题运筹学 纠错题 人&#xff1a;人员经验、能力、数量、缺少培训&#xff1b;自己一个人完成需求和计划不正确流程&#xff1a;先做什么&#xff0c;后做什么&#xff0c;流程是否正确。是…

前端基础入门三大核心之JS篇:掌握数字魔法 ——「累加器与累乘器」的奥秘籍【含样例代码】

前端基础入门三大核心之JS篇&#xff1a;掌握数字魔法 ——「累加器与累乘器」的奥秘籍 &#x1f9d9;‍♂️ 基础概念&#xff1a;数字的魔杖与炼金术累加器&#xff08;Accumulator&#xff09;累乘器&#xff08;Multiplier&#xff09; &#x1f4da; 实战演练&#xff1a;…

c++ (命名空间 字符串)

思维导图&#xff1a; 定义自己得命名空间myspace,在myspace中定义string类型变量s1,再定义一个函数完成字符串逆置 #include <iostream> #include <cstring> //定义自己得命名空间myspace,在myspace中定义string类型变量s1,再定义一个函数完成字符串逆置 using n…

抽屉网关停,Digg类网站退出互联网舞台

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 别人我不清楚&#xff0c;至少在松松我心中&#xff1a;抽屉网是世界著名的网站&#xff0c;而近期抽屉新热榜突然宣布关站了&#xff0c;我内心充满遗憾。因为抽屉网站收集的内容&#xff0c;让我看到了更大的世界…

【算法】合并k个已排序的链表

✨题目链接&#xff1a; NC51 合并k个已排序的链表 ✨题目描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 数据范围&#xff1a;节点总数 0≤&#x1d45b;≤50000≤n≤5000&#xff0c;每个节点的val满足 ∣&#x1d463;&#x1d44e;&#x1d459;∣&…

【学习记录】服务器转发使用tensorboard

场景 代码在服务器上运行&#xff0c;想使用tensorboard查看训练的过程。 但是服务器上不能直接访问地址&#xff0c;所以要转发端口到本地&#xff0c;从而在本地网页中能够打开tensorboard。 参考&#xff1a;https://zhuanlan.zhihu.com/p/680596384 这时我们需要建立本地…

C++ 函数模板与模板函数

一 代码重用技术 函数 类与对象 继承与派生 多态&#xff08;函数重载、运算符重载、虚函数、纯虚函数与抽象类&#xff09; 泛型程序设计 通用的代码需要补受数据类型的影响&#xff0c;并且可以自动适应数据类型的变化&#xff0c;这种程序设计类型称为泛型程序设计。 二 模…

Logstash笔记

目录​​​​​​​ 一、简介 二、单个输入和输出插件 三、多个输入和输出插件 四、pipeline结构 五、队列和数据弹性 六、内存队列 七、持久化队列 八、死信队列 (DLQ) 九、输入插件 1)、beats 2)、dead_letter_queue 3)、elasticsearch 4)、file 5)、redis 十、…

字符串和字符串函数(1)

前言&#xff1a; 字符串在C语言中比较特别&#xff0c;没有单另的字符串类型&#xff0c;想要初始化字符串必须用字符变量的数组初始化&#xff0c;但是在C语言标准库函数中提供了大量能对字符串进行修改的函数&#xff0c;比如说可以实现字符串的的拷贝&#xff0c;字符串的追…

经常碰到的20个等待事件

经常碰到的20个等待事件 oracle等待事件简介 DBA团队维护的部分应用运行在oracle数据库平台&#xff0c;为及时了解数据库的运行情况&#xff0c;需要建立涵盖各个维度的监控体系&#xff0c;包括实例状态、空间使用率、ORA错误等数十项监控指标。这其中有一个有效判断数据库…

PY32F002A单片机 us 延时,非常惊讶

先说结论&#xff0c;这个型号&#xff0c;运算速度 慢&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 测试1 volatile uint32_t delay 1000;/* 初始化所有外设&#xff0c;Flash接口&#xff0c;SysTick *…

Nodejs+Websocket+uniapp完成聊天

前言 最近想做一个聊天&#xff0c;但是网上的很多都是不能实现的&#xff0c;要么就是缺少代码片段很难实现websocket的链接&#xff0c;更别说聊天了。自己研究了一番之后实现了这个功能。值得注意的是&#xff0c;我想在小程序中使用socket.io&#xff0c;不好使&#xff0…

从0.1nm到1mm:显微测量仪在抛光至粗糙表面测量中的技术突破

显微测量仪是纳米级精度的表面粗糙度测量技术。它利用光学、电子或机械原理对微小尺寸或表面特征进行测量&#xff0c;能够提供纳米级甚至更高级别的测量精度&#xff0c;这对于许多科学和工业应用至关重要。 在抛光至粗糙表面测量中&#xff0c;显微测量仪器具有从0.1nm到1mm…

java:程序包javax. servLet不存在

一.原因 1.项目Tomcat 服务器依赖未导入 2.项目的 SDK 版本选择错误 二.解决方法 方案一&#xff1a; 1.选择项目结构选项 2.导入Tomcat依赖 把tomcat里面的【jsp-api.jar】和【servlet-api.jar】这两个包导入 方案二&#xff1a; 1.选择项目结构选项 2.选择自己的jdk版本…

Kubernates-dashbord-安装

生成证书 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout kube-dashboard.key -out kube-dashboard.crt -subj "/CNdashboard.kube.com/Okubernetes.dashboard.domain.com" kubectl create secret tls dashboard-tls --key kube-dashboard.key --cert…

Golang | Leetcode Golang题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; func sortedArrayToBST(nums []int) *TreeNode {rand.Seed(time.Now().UnixNano())return helper(nums, 0, len(nums) - 1) }func helper(nums []int, left, right int) *TreeNode {if left > right {return nil}// 选择任意一个中间位置…

「动态规划」删除并获得点数

力扣原题链接&#xff0c;点击跳转。 给你一个整数数组nums。每次操作&#xff0c;可以删除任意一个值n&#xff0c;接着获得点数n&#xff0c;并同时删除所有的n-1和n1。你最多能获取多少点数&#xff1f; 这个问题的解法相当巧妙。我们可以把问题先转化一下。用类似计数排序…

浅谈,Java当中普通类与抽象类的区别

前言 这篇博客没有什么特别有技术含量的地方,只是对于JavaSE 基础语法的一个小总结,基本功还是很重要的,因此笔者想写下来而已 普通类 什么是普通类? 普通类是可以直接实例化的类&#xff0c;包含具体的实现和属性。它是Java中最常见的类类型&#xff0c;用于创建对象和实现…

【Python性能优化】取最值的差异

取最值的差异 测试Windows 测试结果Linux 测试结果 测试 测试内容&#xff1a;从一组 x, y, z 坐标值中获得每个维度&#xff08;x、y、z&#xff09;的值域范围。此处不考虑将数据临时存放到内存&#xff0c;再整组获取值域的操作&#xff08;因为对单文件这么做问题不大&…