MapReduce编程

news2024/11/20 10:46:28

Hadoop的MapReduce计算框架

概述

  • MapReduce计算框架是一种计算框架,用于计算处理大规模的数据集,他将数据分成小块,然后在集群中的多个节点上并行处理这些块
  • MapReduce框架是由两个组件组成:Map和Reduce
    • Map任务将输入数据分解成键值对,然后将这些键值对传递给Reduce任务进行处理
    • Reduce任务将相同的所有值组合在一起,并将它们转换为输出键值对
  • 这种分布式计算框架可以在大规模数据集上高效地运行,因为它可以利用集群中的多个节点并行处理数据。

MapReduce是一种分布式计算模型,用于处理大规模数据集。它将数据分成多个小块,然后在多个计算节点上并行处理这些小块。MapReduce的工作原理如下:

  • Map阶段:将输入数据分成多个小块,然后在多个计算节点上并行处理这些小块。每个计算节点都会执行Map函数,将输入数据转换成键值对。

  • Shuffle阶段:将Map函数的输出结果按照键进行分组,然后将同一组的键值对发送到同一个Reduce节点上。

  • Reduce阶段:将同一组的键值对发送到同一个Reduce节点上,然后在该节点上执行Reduce函数,将同一组的键值对合并成一个结果。

  • 输出结果:将所有Reduce节点的输出结果合并成一个最终结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AuLTOMwz-1686616882602)(E:\Java笔记\大数据\Hadoop\Hadoop的MapReduce计算框架\Hadoop的MapReduce计算框架.assets\image-20230525094357692.png)]

特点

  • 可扩展性
    • MapReduce框架可以在大规模数据集上高效地运行,因为它可以利用集群中的多个节点并行处理数据。
  • 容错性
    • MapReduce框架具有容错机制,可以处理节点和数据丢失等问题
  • 简单性
    • MapReduce框架的编程模型相对简单,可以轻松地编写Map和Reduce任务
  • 适用性
    • MapReduce框架适用于各种类型地数据处理任务,包含文本处理,图像处理,机器学习等。

优缺点

优点:

  • 可以处理大规模的数据集,具有良好的可扩展的容错性,
  • 可以在分布式的环境下运行,可以利用集群中的多台计算机进行计算,提高计算效率
  • 可以通过MapReduce编程模型进行编程,简化了分布式计算的开发难度
  • 可以与HDFS文件系统和YARN资源管理系统配合使用,构建完整的分布式计算平台

缺点:

  • MapReduce编程模型对于一些复杂的计算任务来说,可能不太适合
  • MapReduce编程模型需要将计算任务分成Map阶段和Reduce阶段,可能会导致计算效率的降低
  • MapReduce编程模型需要将数据写入磁盘,可能会导致I/O开销较大

进程

MapReduce进程包括两个主要的进程:JobTracker进程和TaskTracker进程,

  • JobTracker进程负责接收客户端提交的MapReduce任务,并将任务分配给TaskTracker进程执行;
  • TaskTracker进程负责执行MapReduce任务,并将执行结果返回给JobTracker进程。
  • JobTracker进程和TaskTracker进程都运行在Hadoop集群中的计算节点上,它们之间通过心跳机制进行通信,以保证任务的正确执行。

JobTracker进程:

  • JobTracker进程是MapReduce进程中的主进程,负责接收客户端提交的MapReduce任务,并将任务分配给TaskTracker进程执行。
  • JobTracker进程运行在Hadoop集群中的一台计算节点上,它通过心跳机制与TaskTracker进程进行通信,以监控任务的执行情况。
  • JobTracker进程还负责维护任务的元数据信息,包括任务的状态、进度、日志等。

TaskTracker进程

  • TaskTracker进程是MapReduce进程中的工作进程,负责执行MapReduce任务,并将执行结果返回给JobTracker进程。
  • TaskTracker进程运行在Hadoop集群中的计算节点上,它通过心跳机制与JobTracker进程进行通信,以接收任务的分配和监控任务的执行情况。
  • TaskTracker进程还负责维护任务的本地数据,包括输入数据、输出数据、中间结果等。

常见的配置

  1. 输入格式:MapReduce框架支持多种输入格式,包括文本、序列化、Hadoop Archives等。可以根据数据类型选择合适的输入格式。
  2. 输出格式:MapReduce框架支持多种输出格式,包括文本、序列化、Hadoop Archives等。可以根据需要选择合适的输出格式。
  3. Map任务数:MapReduce框架默认将输入数据分成64MB的块,并为每个块分配一个Map任务。可以根据数据大小和集群规模调整Map任务数。
  4. Reduce任务数:Reduce任务数的数量通常与集群中的节点数相同。可以根据集群规模和数据大小调整Reduce任务数。
  5. Combiner函数:Combiner函数是一种在Map任务输出之前对Map任务输出进行合并的函数。可以使用Combiner函数来减少Map任务输出的数据量,从而提高MapReduce框架的效率。
  6. Partitioner函数:Partitioner函数是一种将Map任务输出分配到Reduce任务的函数。可以根据键的哈希值将Map任务输出分配到不同的Reduce任务中。
  7. 缓存文件:MapReduce框架支持将文件缓存在内存中,以便在Map和Reduce任务中使用。可以使用DistributedCache类将文件缓存到集群中的节点上。
  8. 压缩:MapReduce框架支持对输入和输出数据进行压缩,以减少数据传输的大小。可以使用Gzip、Bzip2等压缩算法对数据进行压缩。
  9. 计数器:MapReduce框架支持计数器,用于记录任务的进度和状态。可以使用计数器来监视任务的执行情况。

WordCount编程

本地测试

需求:在给定的文件中统计输出的每个单词出现的总次数

package com.sin.mapRedice;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.StringTokenizer;

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.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
 * @CreateName SIN
 * @CreateDate 2023/05/26 11:33
 * @description
 */
public class WordCount {

    /**
     * Mapper:将输入键/值映射到一组中间键/值对中
     */
    public static class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
        //创建IntWritable对象
        private final static IntWritable one = new IntWritable(1);
        //创建Text对象
        private Text word = new Text();

        /**
         * 对输入分割中的每一个键/值调用一次
         * @param key 键
         * @param value 值
         * @param context 上下文
         * @throws IOException
         * @throws InterruptedException
         */
        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            //将输入的文本数据转换为StringToKenizer对象
            StringTokenizer itr = new StringTokenizer(value.toString());
            //遍历StringTokenizer对象中的每一个单词
            while (itr.hasMoreTokens()) {
                //将当前单词设置为Text类型的值
                word.set(itr.nextToken());
                //将当前单词和IntWritable对象写入上下文中
                context.write(word, one);
            }
        }
    }

    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

        private IntWritable result = new IntWritable();

        /**
         * 接收键值对列表,将相同键的值相加并输出
         * @param key 键
         * @param values 值的迭代器
         * @param context 上下文
         * @throws IOException
         * @throws InterruptedException
         */
        public void reduce(Text key, Iterable<IntWritable> values, Context context)
                throws IOException, InterruptedException {
            //定义一个变量sum,用来存储values中的所有元素的和
            int sum = 0;
            //遍历values中的所有元素
            for (IntWritable val : values) {
                //将元素的值添加到sum中
                sum += val.get();
            }
            //将相加后的结果设置为IntWritable对象的值
            result.set(sum);
            // 将 key 和 sum 作为输出写入 context
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        // 创建Configuration对象
        // 配置由资源指定,资源包含一组名称/值对作为xml数据,
        // 每个资源都是由字符串或者路径命名
        // 如果使用String命名,则检查类路径以查找具有改名称的文件
        // 如果以Path命名,则直接检查本地文件系统,而不引用类路径
        Configuration conf = new Configuration();
        /**
         * 创建job对象
         *    任务提交者对任务的视图
         *    它允许用户配置任务,提交任务,控制其执行和查询状态,
         */
        //获取实例
        Job job = Job.getInstance(conf, "word count");
        //设置jar包
        job.setJarByClass(WordCount.class);

        //关联mapper和reducer
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);

        //设置最终输出的kv类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        //设置输入路径
        FileInputFormat.addInputPath(job, new Path("F:\\input"));
        //设置输出路径
        FileOutputFormat.setOutputPath(job, new Path("F:\\output\\outputword"));

        //提交任务并等待完成
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

测试异常

解决java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WShxd3gf-1686616882603)(E:\Java笔记\大数据\Hadoop\Hadoop的MapReduce计算框架\Hadoop的MapReduce计算框架.assets\image-20230526154946261.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OmkOSU0z-1686616882603)(E:\Java笔记\大数据\Hadoop\Hadoop的MapReduce计算框架\Hadoop的MapReduce计算框架.assets\image-20230526154959408.png)]

解决Exception in thread “main” java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

return后面删了。然后改为true,但是这里是只读文件不能修改,所以创建一个类就行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZtujHwZ-1686616882604)(E:\Java笔记\大数据\Hadoop\Hadoop的MapReduce计算框架\Hadoop的MapReduce计算框架.assets\image-20230526155219123.png)]

复制包路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-76NaZBzW-1686616882604)(E:\Java笔记\大数据\Hadoop\Hadoop的MapReduce计算框架\Hadoop的MapReduce计算框架.assets\image-20230526155248825.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-alEPMyd8-1686616882604)(E:\Java笔记\大数据\Hadoop\Hadoop的MapReduce计算框架\Hadoop的MapReduce计算框架.assets\image-20230526155316654.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePAZuIiz-1686616882605)(E:\Java笔记\大数据\Hadoop\Hadoop的MapReduce计算框架\Hadoop的MapReduce计算框架.assets\image-20230526155330903.png)]

创建NativeIO类并修改access方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f3qgdSZJ-1686616882605)(E:\Java笔记\大数据\Hadoop\Hadoop的MapReduce计算框架\Hadoop的MapReduce计算框架.assets\image-20230526155421525.png)]

输出结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xjCe8MNS-1686616882606)(E:\Java笔记\大数据\Hadoop\Hadoop的MapReduce计算框架\Hadoop的MapReduce计算框架.assets\image-20230526155510311.png)]

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

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

相关文章

团队管理之性能实施团队日志12

这几天算是多事之秋。本来就有几个严重的问题天天在折腾。 还是出现了各种差错。 其实对于做项目来说&#xff0c;就是这样&#xff0c;总会有紧要的事情突然冒出来。 我倒是习惯了这种状态。 只是时间不等人。 这两天在写各系统的最终报告。结果写到某个系统的时候发现&#…

零基础学Python,最受推荐的10本Python书籍

目录 适合初学者的最佳Python书籍1、《Python编程&#xff1a;从入门到实践》2、《Head-First Python (2nd edition)》3、《“笨方法”学Python》4、《Python程序设计&#xff08;第3版&#xff09;》 最适合初学者的免费Python书籍5、《像计算机科学家一样思考Python (第2版)》…

学习【菜鸟教程】【C++ 继承】(未完)

链接 1. 教程原文 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#xff0c;也达到了重用代码功能和提高执行效率的效果。 当创建一个类时&#xff0c;您不需要重新编写新的…

0基础学习VR全景平台篇第41篇:编辑器底部菜单-素材管理

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;底部菜单—素材管理功能操作。 功能位置示意 一、本功能将用在哪里&#xff1f; 素材管理&#xff0c;主要是对场景列表相关的基础操作做一个详细的讲解&#xf…

自研API 网关 - 媲美美团这套Shepherd网关架构!

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 我说&#xff1a;“很多互联网大厂&#xff0c;很少基于 SpringMVC 模块对外提供 WEB 服务的 HTTP 接口&#xff01;” 一下炸窝…

【瑞萨RA MCU创意氛围赛】基于FSP库开发 --- Qt遥控小车

文章目录 引言一、产品功能介绍二、硬件清单三、软件设计1. RASC2. Keil2. Qt 四、视频展示 引言 很高兴能够加入“野火”这个大家庭中&#xff0c;且能有机会参加第一期的【瑞萨RA MCU创意氛围赛】&#xff0c;在此之前&#xff0c;我竟都没能了解瑞萨这个产品&#xff0c;是…

如何计算一个实例占用多少内存?

我们都知道CPU和内存是程序最为重要的两类指标&#xff0c;那么有多少人真正想过这个问题&#xff1a;一个类型&#xff08;值类型或者引用类型&#xff09;的实例在内存中究竟占多少字节&#xff1f;我们很多人都回答不上来。其实C#提供了一些用于计算大小的操作符和API&#…

【026】C++的内联函数、函数重载、函数的默认参数与占位参数

C的内联函数、函数重载、函数的默认参数与占位参数 引言一、内联函数1.1、声明内联函数1.2、宏函数和内联函数的区别1.3、内联函数的注意事项 二、函数重载2.1、函数重载的概述2.2、函数重载的条件2.3、函数重载的底层实现原理 三、函数的默认参数四、占位参数五、extern "…

STM32单片机TFT显示AD9833 DDS信号发生器语音播报正弦波方波三角波

实践制作DIY- GC0146---TFT显示AD9833 DDS信号发生器 基于STM32单片机设计---TFT显示AD9833 DDS信号发生器 二、功能介绍&#xff1a; 硬件组成&#xff1a;STM32F103C系列最小系统板 1.8寸TFT彩屏AD9833信号模块4*4矩阵键盘DY-SV17F语音播报模块 1.通过4*4键盘来设定频率值和…

ExpertLLaMA:超越Vicuna,通过角色扮演增强指令,显著提升回答质量

本文向大家介绍我们刚刚开源的对话模型及相应的训练数据。 首先是 git Repo 和 paper 链接&#xff0c;欢迎大家给我们⭐star⭐ 论文标题&#xff1a; ExpertPrompting: Instructing Large Language Models to be Distinguished Experts 论文链接&#xff1a; https://arxiv.or…

.Net7矢量化的性能优化

前言 矢量化是性能优化的重要技术&#xff0c;也是寄托硬件层面的优化技术。本篇来看下。文章来源&#xff1a;微软官方博客 概括 一&#xff1a;矢量化支持的问题&#xff1a; 矢量化的System.Runtime.Intrinsics.X86.Sse2.MoveMask 函数和矢量化的Vector128.Create().Extract…

get 、post请求 后台@RequestParam、@RequestBody 接收的方法集合

post、get请求 参数&#xff1a;数组、JSON对象、JSON字符串、地址栏 RequestParam、RequestBody 后端接收 //定义json对象&#xff0c;同时包含数组 var _queryData { jflb:"婚姻家庭纠纷",zlay:"xxxxx",ysCode:["0123","4567"]}…

机柜PDU与普通插座的区别,以及如何选择品牌专业PDU产品详解

PDU&#xff08;Power Distribution Unit&#xff09;&#xff0c;是将来自UPS的输出电流分配到各个IT设备的末端配电设备&#xff0c;是连接供电等基础设施与IT系统、关联机房内所有设备正常运转的关键设备。作为机房用电安全的重要保障&#xff0c;PDU设备的稳定与安全直接关…

FPGA驱动FT601实现USB3.0相机HDMI视频采集 提供工程源码和QT上位机源码

目录 1、前言2、FT601芯片解读和时序分析FT601功能和硬件电路FT601读时序解读FT601写时序解读 3、我这儿的 FT601 USB3.0通信方案4、详细设计方案5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 目前USB3.0的实现方案很多&#xff0c;但就简单好…

我们来谈谈udp

"却还有那些洗礼&#xff0c;那几句问候&#xff0c;那份温柔~" 一、 常用的Linux命令 (1) netstat查看网络状态 netstat是一个用来查看网络状态的重要工具,可以携带很多选项。 n 拒绝显示别名&#xff0c;能显示数字的全部转化成数字. l 仅列出有在 Listen…

【unity之IMGUI】所以你还想在百度上搜IMGUI的底层原理是什么吗?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

安装python详细步骤(超详细,保姆级,一步一图)

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 作为一个实用学习的主义的学习者&#xff0c;最关心的问题一…

光亚展 | 移远通信Matter解决方案,照亮智能家居产业未来

6月9-12日&#xff0c;第二十八届广州国际照明展览会&#xff08;光亚展&#xff09;在中国进出口商品交易会展馆举行。本次展会以“光未来”为主题&#xff0c;整个照明、灯饰产业链的上下游企业、品牌在此汇聚&#xff0c;共同探讨照明行业未来的发展方向。 作为照明行业智能…

智见|黄铁军:未来的大模型生态中将会只有少数赢家

2023智源大会可谓群星璀璨。中外200余位人工智能顶级专家参会&#xff0c;人工智能领域最关键的人物、机构悉数亮相。 全面、专业、前沿&#xff0c;会场上大咖们观点激荡、多元碰撞&#xff0c;会场下观众们兴奋异常、座无虚席。 会上&#xff0c;北京智源人工智能研究院院长黄…

英语知识点-填空-考试酷

第一章 英语知识填空题 一、语法 1.词法&#xff1a;介词将关系建立在人/物A与人/物B&#xff0c;可能会形成修饰限制关系&#xff0c;有定语成分&#xff1b;介词将关系建立在事A与物B&#xff0c;可能有事A动作发生时环境因素&#xff0c;有状语成分&#xff1b;写作中经常用…