大数据开发-Hadoop之MapReduce

文章目录

    • MapReduce原理剖析
      • MapReduce之Map阶段
      • MapReduce之Reduce阶段
      • WordCount分析
      • 多文件WordCount分析
    • 实战wordCount案例开发

MapReduce原理剖析

  • MapReduce是一种分布式计算模型,主要用于搜索领域,解决海量数据的计算问题
  • MapReduce由两个阶段组成:Map和Reduce

v2-4ab30eab0c56c4cda575bc6780983c75_720w

MapReduce之Map阶段

  • 框架会把输入的文件夹划分为多个inputSplit,默认每个HDFS的block对应一个inputSplit。通过RecordReader类,把每个inputSplit解析程一个个<k,v>。默认每一行数据,会被解析程一个<k,v>
#比如有个文件
hello world
hello map
input split

# 第一步拆分
<0, hello world>
<12, hello map> #这里的12代表上一行的长度,也就是偏移量
<21, input split>

  • 框架调用Mapper类中的map(…)函数,map函数的输入是<k1,v1>,输出是<k2,v2>,一个inputSplit对应一个Map Task
# 第二步数据会变成如下
<hello, 1>
<world, 1>

<hello, 1>
<map, 1>

<input, 1>
<split, 1>
  • 框架对map输出的<k2,v2>进行分区,不同分区中的<k2,v2>由不同的Reduce Task处理,默认只有1个分区

  • 框架对每个分区中的数据按照k2进行排序分组。分组值的是相同的k2的v2分成一个组

# 排序
<hello, 1>
<hello, 1>
<world, 1>
<map, 1>
<input, 1>
<split, 1>

# 分组
<hello, {1,1}>
<world, {1}>
<map, {1}>
<input, {1}>
<split, {1}>
  • 在Map阶段,框架可以执行Combiner操作-可选

  • 框架会把Map Task输出的<k2,v2>写入Linux的磁盘文件

至此,Map阶段执行结束

MapReduce之Reduce阶段

  • 框架对多个Map Task的输出,按照不同的分区,通过网络Copy到不同的Reduce节点,这个过程称为Shuffle
  • 框架对Reduce节点接收到的相同分区的<k2,v2>进行合并,排序,分组
  • 框架调用Reduce类中的reduce方法,输入<k2,{v2…}>,输出<k3,v3>.一个<k2,{v2…}>调用一次reduce函数
<hello, 2>
<world, 1>
<map, 1>
<input, 1>
<split, 1>
  • 框架将计算结果保存到HDFS中
hello 2
world 1
...

WordCount分析

1532797068747d8a77620a6

多文件WordCount分析

dadc900df3f728105ab114fc74c5b6ab

实战wordCount案例开发

  • 开发Map阶段代码
  • 开发Reduce阶段代码
  • 组装job
/**
 * 读取hdfs的hello.txt中每个单词出现的次数
 *
 * 原始文件的内容
 * hello world
 * hello map
 * input split
 *
 * 最终输出
 *
 * hello 2
 * world 1
 * split 1
 * map 1
 * input 1
 */
public class WordCountJob {


    /**
     * map阶段
     */
    public static class MyMapProcess extends Mapper<LongWritable, Text, Text, LongWritable> {
        /**
         * 实现map函数
         * @param k1
         * @param v1
         * @param context
         * @throws IOException
         * @throws InterruptedException
         */
        @Override
        protected void map(LongWritable k1, Text v1, Context context) throws IOException, InterruptedException {
            // k1代表每行数据的行首偏移量 v1代表每行的内容
            // 对获取的数据每一行切割
            String[] words = v1.toString().split(" ");
            for (String word: words
                 ) {
                // 封装为<k2,v2>的形式
                Text k2 = new Text(word);
                LongWritable v2 = new LongWritable(1L);
                context.write(k2, v2);
            }
        }
    }

    /**
     * reduce阶段
     * 针对<k2,{v2...}>这样的数据进行累加求和,转换为<k3,v3></>
     */
    public static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable> {

        @Override
        protected void reduce(Text k2, Iterable<LongWritable> v2s, Context context) throws IOException, InterruptedException {
            long sum = 0L;
            for (LongWritable v2: v2s
                 ) {
                sum += v2.get();
            }
            context.write(k2, new LongWritable(sum));
        }
    }

    /**
     * 组装job=map+reduce
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        if (args.length < 2) {
            System.out.println("请输入两个目录地址");
             return;
        }
        Configuration entries = new Configuration();
        Job job = Job.getInstance(entries);
        // 必须设置
        job.setJarByClass(WordCountJob.class);
        // 指定输入路径,可以是文件也可以是目录
        FileInputFormat.setInputPaths(job, new Path("args[0]"));

        // 只能指定一个不存在的目录
        FileOutputFormat.setOutputPath(job, new Path("args[1]"));

        // 指定map
        job.setMapperClass(MyMapProcess.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);

        // reduce指定
        job.setReducerClass(MyReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        // 提交job
        job.waitForCompletion(true);
    }
}

  • 打包代码并上传至服务器
mvn clean package -D skipTests

image-20240306163206900

  • 创建测试文件
[root@hadoop01 hadoop-3.2.0]# hdfs dfs -mkdir /test
[root@hadoop01 hadoop-3.2.0]# hdfs dfs -put hello.txt /test
You have new mail in /var/spool/mail/root
[root@hadoop01 hadoop-3.2.0]# hdfs dfs -ls /test
Found 1 items
-rw-r--r--   2 root supergroup         34 2024-03-06 16:29 /test/hello.txt

  • 上传jar包到集群并运行
# 运行相关代码
[root@hadoop01 hadoop-3.2.0]# bin/hadoop jar demo-0.0.1-SNAPSHOT-jar-with-dependencies.jar com.example.hadoop.demo.mapreduce.WordCountJob /test/hello.txt /out
2024-03-06 16:40:27,922 INFO client.RMProxy: Connecting to ResourceManager at hadoop01/192.168.52.100:8032
2024-03-06 16:40:28,962 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
2024-03-06 16:40:29,005 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1709626488940_0001
2024-03-06 16:40:29,749 INFO input.FileInputFormat: Total input files to process : 1
2024-03-06 16:40:29,943 INFO mapreduce.JobSubmitter: number of splits:1
2024-03-06 16:40:30,036 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.enabled is deprecated. Instead, use yarn.system-metrics-publisher.enabled
2024-03-06 16:40:30,328 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1709626488940_0001
2024-03-06 16:40:30,329 INFO mapreduce.JobSubmitter: Executing with tokens: []
2024-03-06 16:40:30,588 INFO conf.Configuration: resource-types.xml not found
2024-03-06 16:40:30,588 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2024-03-06 16:40:31,089 INFO impl.YarnClientImpl: Submitted application application_1709626488940_0001
2024-03-06 16:40:31,147 INFO mapreduce.Job: The url to track the job: http://hadoop01:8088/proxy/application_1709626488940_0001/
2024-03-06 16:40:31,147 INFO mapreduce.Job: Running job: job_1709626488940_0001
2024-03-06 16:40:43,417 INFO mapreduce.Job: Job job_1709626488940_0001 running in uber mode : false
2024-03-06 16:40:43,419 INFO mapreduce.Job:  map 0% reduce 0%
2024-03-06 16:40:50,638 INFO mapreduce.Job:  map 100% reduce 0%
2024-03-06 16:40:57,779 INFO mapreduce.Job:  map 100% reduce 100%
2024-03-06 16:40:57,824 INFO mapreduce.Job: Job job_1709626488940_0001 completed successfully
2024-03-06 16:40:57,948 INFO mapreduce.Job: Counters: 54
	File System Counters
		FILE: Number of bytes read=100
		FILE: Number of bytes written=442629
		FILE: Number of read operations=0
		FILE: Number of large read operations=0
		FILE: Number of write operations=0
		HDFS: Number of bytes read=134
		HDFS: Number of bytes written=38
		HDFS: Number of read operations=8
		HDFS: Number of large read operations=0
		HDFS: Number of write operations=2
		HDFS: Number of bytes read erasure-coded=0
	Job Counters 
		Launched map tasks=1
		Launched reduce tasks=1
		Data-local map tasks=1
		Total time spent by all maps in occupied slots (ms)=5635
		Total time spent by all reduces in occupied slots (ms)=4035
		Total time spent by all map tasks (ms)=5635
		Total time spent by all reduce tasks (ms)=4035
		Total vcore-milliseconds taken by all map tasks=5635
		Total vcore-milliseconds taken by all reduce tasks=4035
		Total megabyte-milliseconds taken by all map tasks=5770240
		Total megabyte-milliseconds taken by all reduce tasks=4131840
	Map-Reduce Framework
		Map input records=3
		Map output records=6
		Map output bytes=82
		Map output materialized bytes=100
		Input split bytes=100
		Combine input records=0
		Combine output records=0
		Reduce input groups=5
		Reduce shuffle bytes=100
		Reduce input records=6
		Reduce output records=5
		Spilled Records=12
		Shuffled Maps =1
		Failed Shuffles=0
		Merged Map outputs=1
		GC time elapsed (ms)=159
		CPU time spent (ms)=1880
		Physical memory (bytes) snapshot=306229248
		Virtual memory (bytes) snapshot=5044473856
		Total committed heap usage (bytes)=141049856
		Peak Map Physical memory (bytes)=201551872
		Peak Map Virtual memory (bytes)=2517729280
		Peak Reduce Physical memory (bytes)=104677376
		Peak Reduce Virtual memory (bytes)=2526744576
	Shuffle Errors
		BAD_ID=0
		CONNECTION=0
		IO_ERROR=0
		WRONG_LENGTH=0
		WRONG_MAP=0
		WRONG_REDUCE=0
	File Input Format Counters 
		Bytes Read=34
	File Output Format Counters 
		Bytes Written=38
You have new mail in /var/spool/mail/root

# 查看是否有输出
[root@hadoop01 hadoop-3.2.0]# hdfs dfs -ls /out
Found 2 items
-rw-r--r--   2 root supergroup          0 2024-03-06 16:40 /out/_SUCCESS
-rw-r--r--   2 root supergroup         38 2024-03-06 16:40 /out/part-r-00000
You have new mail in /var/spool/mail/root

# 查看文件内容
[root@hadoop01 hadoop-3.2.0]# hdfs dfs -cat /out/part-r-00000
hello	2
input	1
map	1
split	1
world	1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文笔记:Compact Multi-Party Confidential Transactions

https://link.springer.com/chapter/10.1007/978-3-030-65411-5_21 A compact, private, Multi-Party Confidential Transactions (MCT) 紧凑型多方机密交易&#xff08;Compact MCT&#xff09;&#xff1a;MCT的长度与常规的单一所有者交易一样短&#xff1b;换句话说&…

ABAQUS软件报价费用 abaqus正版购买价格多少钱?

ABAQUS软件可以完成哪些模拟&#xff1f; ABAQUS软件是一套功能强大的工程模拟的有限元软件&#xff0c;其解决问题的范围从相对简单的线性分析到许多复杂的非线性问题。ABAQUS软件中包含了一套丰富的单元库&#xff0c;可模拟任意几何形状&#xff1b;还包含了各种类型的材料…

第十四届校模拟赛第一期(一)

“须知少时凌云志&#xff0c;自许人间第一流” 鄙人11月八号有幸参加学校校选拔赛&#xff0c;题型为5道填空题&#xff0c;5道编程题&#xff0c;总时间为4小时。奈何能力有限&#xff0c;只完成了5道填空和3道编程大题&#xff0c;现进行自省自纠&#xff0c;分享学习&#…

【系统安全加固】Centos 设置禁用密码并打开密钥登录

文章目录 一&#xff0c;概述二&#xff0c;操作步骤1. 服务器端生成密钥2. 在服务器上安装公钥3.下载私钥到本地&#xff08;重要&#xff0c;否则后面无法登录&#xff09;4. 修改配置文件&#xff0c;禁用密码并打开密钥登录5. 重启sshd服务6. 配置xshell使用密钥登录 一&am…

Anaconda prompt运行打开jupyter notebook 指令出错

一、打不开jupyter notebook网页 报错如下&#xff1a; Traceback (most recent call last): File “D:\anaconda3\lib\site-packages\notebook\traittypes.py”, line 235, in _resolve_classes klass self._resolve_string(klass) File “C:\Users\DELL\AppData\Roaming\Py…

MATLAB知识点:循环语句的经典练习题:二分搜索

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自​第4章&#xff1a;MATLAB程序流程控制 这个例题我们…

小白跟做江科大51单片机之LCD1602滚动显示效果

1.查看原理图 图1 LCD1602接口 图2 LCD1602与STC的接口 2.编写代码 图3 时序结构 根据时序结构编写命令和写入数据代码 #include <REGX52.H> #include "Delay.h" sbit LCD1602_ENP2^7; sbit LCD1602_RSP2^6; sbit LCD1602_WRP2^5; #define LCD1602_lCD0 …

css补充(上)

有关字体 1.所有有关字体的样式都会被继承 div {font-size: 30px;}<span>777</span> <div>123<p>456</p> </div>span中777是默认大小16px div设置了30px p作为div的后代继承了字体样式也是30px 2.字体颜色 div{color: red;border: 1px …

[java] 23种设计模式之责任链模式

1.1例子 公司请假系统&#xff0c;业务逻辑如下&#xff1a; 不超过3天的&#xff0c;组长审批 超过3天且小于7天的&#xff0c;总监审批 超过7天且小于15天的&#xff0c;部长审批 超过15天&#xff0c;前端直接拒绝&#xff0c;不会进入审批流程&#xff08;违反了公司的请假…

Stable diffusion零基础课程

该课程专为零基础学习者设计&#xff0c;旨在介绍和解释稳定扩散的基本概念。学员将通过简单易懂的方式了解扩散现象、数学模型及其应用&#xff0c;为日后更深入的科学研究和工程应用打下坚实基础。 课程大小&#xff1a;3.8G 课程下载&#xff1a;https://download.csdn.ne…

如何理解和利用好点对点传输?

在当今数字化时代&#xff0c;数据传输已成为企业和个人日常工作的核心部分。点对点传输&#xff08;P2P&#xff09;作为一种高效的数据交换方式&#xff0c;正逐渐成为网络通信的主流。本文将探讨如何理解和利用点对点传输&#xff0c;分析其优缺点&#xff0c;并介绍镭速如何…

绝地求生:收纳控福音!老登教你怎么塞满三级包最划算!

大家好&#xff0c;我是闲游盒~ 作为一个5000小时的PUBG老登&#xff0c;我认为这个绝地求生这个游戏&#xff0c;抛开外挂不谈&#xff0c;是一个非常有意思的FPS游戏&#xff0c;不论是要强度还是要趣味&#xff0c;大多数玩家都能在这里找到想要的节奏。 一直以来是想做一些…

HarmonyOS NEXT应用开发案例——全屏登录页面

全屏登录页面 介绍 本例介绍各种应用登录页面。 全屏登录页面&#xff1a;在主页面点击跳转到全屏登录页后&#xff0c;显示全屏模态页面&#xff0c;全屏模态页面从下方滑出并覆盖整个屏幕&#xff0c;模态页面内容自定义&#xff0c;此处分为默认一键登录方式和其他登录方…

leancloud云存储如何接入App Inventor 2?

提问&#xff1a;leancloud如何应用到App Inventor 2&#xff1f; LeanCloud 能够高效存取海量级 JSON 对象、二进制文件、地理位置等数据。其内置的行级 ACL 权限控制&#xff0c;以及通用的用户及角色管理体系&#xff0c;可以快速实现安全而灵活的数据访问。 根据官方文档&a…

Java零基础 - try-catch-finally和throw语句

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

语义化与自动化——第三代指标平台两大核心能力详解(内含QA)

【作者简介】杜雪芳&#xff0c;Aloudata 合伙人兼首席业务架构师。12 年数据业务从业经验&#xff0c;3 年管理咨询经验。历任阿里集团淘宝商业分析负责人、阿里音乐商业智能中心负责人、蚂蚁集团用户增长分析与洞察产品负责人。在数据体系搭建、数据分析、用户标签建设、用户…

百度给程序员发放京东购物卡,注册即送30元购物卡

活动真实有效&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;https://comate.baidu.com/?inviteCodeexf818mt 活动参与流程说明&#xff1a;点击下面的邀请链接进行登陆&#xff0c;注意一定要邀请链接&#xff0c;因为通过链接注册可以获…

windows使用sarama往kafka发送数据

首先先在本地安装好java&#xff0c;打开cmd&#xff0c;输入java -version&#xff0c;出现以下信息代表java安装成功。 之后依次安装zookeeper和kafka并启动&#xff0c;详细安装与启动步骤可参考&#xff1a; 【Kafka】Windows下安装Kafka&#xff08;图文记录详细步骤&…

STM32采集电池电量方法实现

一、项目简介 若设备接了锂电池&#xff0c;可以通过STM32的ADC采集电池的电量。锂电池为3节3.7V的单节串联&#xff0c;整体电压大约为12V。 二、实现过程 1、由于STM32采集的电压范围为0-3.3V&#xff0c;所以无法直接采集锂电池的电压&#xff0c;这里可以用外接分压电阻的…

新建Flutter工程修改配置

由于国内 网络环境原因&#xff0c; 新建 flutter工程的 配置文件 需要修改几个地方&#xff0c; 1. gradle-wrapper.properties 问题&#xff1a;Exception in thread "main" java.net.ConnectException: Connection timed out: connect&#xff1a; 解决方法&#…