hadoop学习笔记4-mapreduce

news2025/1/11 21:48:02

5.MapReduce

5.1Linux中安装IDEA

IDEA官网:https://www.jetbrains.com.cn/idea/

点击右上角的下载

选择Linux进行下载压缩包

下载完成后找到压缩包并解压压缩包到当前目录下

tar -zxvf ideaIC-2024.1.4.tar.gz

运行idea

./idea.sh

5.2配置开发环境

1.mapreduce简介

mapreduce 的主要组成部分:Mapper 和 Reducer。

Mapper: 负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。

Reducer: 负责对map阶段的结果进行汇总。

2.开发环境准备

1)打开idea通过NewProject创建maven工程

点击create等待创建完成

新建Module

点击create创建

 导入相关依赖包

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.1.4</version>
    </dependency>

刷新可以看到有相关依赖

 

删除mapreduce中默认的包然后重新创建

导入集群的配置文件

在main目录下创建一个resources目录,并设置为资源目录,将集群的core-site.xml和hdfs-site.xml放到resources目录下,目的是为了能识别hadoop集群

点击resources

 copy配置文件到resources下

#将集群两个文件,下载到远程桌面服务器所在的桌面上

scp /usr/local/hadoop/etc/hadoop/hdfs-site.xml root@11.106.67.7:/headless/Desktop

scp /usr/local/hadoop/etc/hadoop/core-site.xml root@11.106.67.7:/headless/Desktop

 copy到idea的resources下

5.3编写单词统计案例

1)自定义的mapreduce类

2)继承Mapper类,实现map函数

3)继承Reducer类,实现reduce函数

4)main()中设置Job相关信息 和 提交Job运行

在wordcount包下新建class类

需要分别编写下面三个class 

1.Mapper代码

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;

public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        System.out.println("map task start ...");
        String line = value.toString();
        String[] words = line.split(" ");
        for (String word : words) {
            context.write(new Text(word),new IntWritable(1));
        }
    }
}

2.Reducer代码

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class WordCountReducer extends Reducer<Text, IntWritable,Text,IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        System.out.println("reducer task start ...");
        int sum = 0;
        for (IntWritable value : values) {
            int count = value.get();
            sum+=count;
        }
        context.write(key, new IntWritable(sum));
    }
}

3.Driver类代码

import org.apache.hadoop.conf.Configuration;
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.output.FileOutputFormat;

import java.io.IOException;

public class WordCountDriver {
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "wordcount");
        
        job.setJarByClass(WordCountDriver.class);
        
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);
        
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        FileInputFormat.addInputPath(job,new Path("hdfs://ns1/word/words.txt"));
        FileOutputFormat.setOutputPath(job,new Path("hdfs://ns1/wcresult"));

        boolean b = job.waitForCompletion(true);
        System.exit(b?0:1);
    }
}

然后执行Driver类的main方法

返回0表示执行成功

每读取1行数据执行一次map方法,一共是8行,所以执行8次map方法

执行完map方法后框架会自动进行聚合操作,也就是会进行如hello [1 1 1 1 1 1]、hadoop[1 1 1 1 1]...这样的聚合操作,聚合后再进行reduce处理,由于一共有7个不同的单词,所以reduce方法调用7次

最后查看hdfs中存放的结果

5.4单词统计案例代码完善

1.设置运行参数 

设置程序执行参数,输入输出路径不用在代码中写死。

run ---> Edit Configurations. 进入设置参数界面

 2.增加自动删除目录方法

由于在mapredue任务执行前需要删除输出目录。否则再次执行MR任务,造成输出目录重复则会报错

添加如下方法

 

        FileSystem fs = FileSystem.get(conf);
        if(fs.exists(new Path(args[1]))){
            fs.delete(new Path(args[1]),true);
        }

3.增加输出日志详细信息

添加log4j所需的jar包到pom.xml中

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
</dependency>

 

resources资源文件夹中新建log4j.properties文件添加如下内容

#设定控制台和指定目录日志都按照info级别来打印输出
log4j.rootLogger=info,console,HFILE
#日志输出到指定目录
log4j.appender.HFILE=org.apache.log4j.RollingFileAppender
#输出路径自己设置
log4j.appender.HFILE.File=/opt/hadoop_logs/log.log
log4j.appender.HFILE.MaxFileSize=30mb
log4j.appender.HFILE.MaxBackupIndex=20
log4j.appender.HFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.HFILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %l %t %r  %c: %m%n
#日志输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c %M(): %m%n

5.5Mapreduce 原理

1.切块和切片

切块是存储在hdfs中的数据块,是真实存在的;而切片是逻辑层面的,是为了计算maptask个数的,有多少个切片就有多少个maptask任务,之所以要有切片的概念,主要是为了确定maptask任务个数,节约资源

切块≠切片,比如现在有一个数据块的大小是260M,hdfs默认每128M切割,也就是会切割产生128M,128M,4M三个切块,但是切片实际只有两个,分别是128M,132M,切片的产生是通过框架自动计算出来的,由于第三个数据块只有4M,太小了,所以会和其中一个128M合并一起由一个maptask进行处理,这样做的目得是为了节约资源,如果4M单独开一个maptask进行处理的话,会额外消耗很多cpu和内存,很不划算,所以会把这4M的数据远程copy一份给maptask所在的服务器和另外的128M交给同一个maptask一起处理,这样虽然产生了一部分额外的远程I/O,但是比起来多起一个maptask要划算很多,hadoop集群为了节省开销,会这样来处理。集群的默认配置是1.1,所以如果按照128M来切割的话,如果最后一份数据的大小<12.8M的话,会把这部分数据跟其中的一份128M进行合并由一个maptask进行处理;如果数据的大小>12.8M的话,这部分数据会单独进行处理,也就是会单独开一个maptask来处理这部分数据

2.MapReduce灵魂shuffle流程

一个Reducer的情况

 多个Reducer的情况(2个为例)

有多少个reducer将来就有多少个输出文件,一般reducer的数量和分区的数量是一致的。 

笔记参考:http://hainiubl.com/topics/75967

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

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

相关文章

公司运营数据分析大屏,非专业者也能轻松上手

在这个数据洪流的时代&#xff0c;企业的每一步发展都深深刻画在数字的轨迹之中。如何精准捕捉这些瞬息万变的信息&#xff0c;将其转化为推动企业前行的智慧力量&#xff1f;答案&#xff0c;或许就藏在一面高效、直观的公司运营数据分析大屏之中。 想象一下&#xff0c;当晨光…

软件工程-期末考试

目录 1.数据流图例题 2.工程网络 3.详细设计阶段图形工具 程序流程图&#xff0c;盒图 PAD图&#xff08;冒泡排序&#xff09; 判定树、判定表 4.合理地设计测试方案 5.能用jackson图表达问题的数据结构 6.能建立问题的对象模型--->&#xff08;类图&#xff09; …

shell脚本自动化部署

1、自动化部署DNS [rootweb ~]# vim dns.sh [roottomcat ~]# yum -y install bind-utils [roottomcat ~]# echo "nameserver 192.168.8.132" > /etc/resolv.conf [roottomcat ~]# nslookup www.a.com 2、自动化部署rsync [rootweb ~]# vim rsync.sh [rootweb ~]# …

Git安装流程以及如何将本地代码推送到新建的git仓库(IDEA操作简单易学)

Windows版本下载地址 Git - Downloading Package (git-scm.com) 根据自己电脑系统选择响应的版本 安装流程 1. 我安装的是 2.46.0 的版本&#xff0c; 点击next 2. 选择安装的文件夹&#xff0c;点击browse..进行选择&#xff0c;选择完点击next 3. 自定义组件&#xff0c;一…

系统架构师考点--软件架构的演化和维护

大家好。今天来总结一下软件架构的 演化和维护。这部分内容属于新增内容&#xff0c;之前未曾考过&#xff0c;可能会在论文中出现&#xff0c;在上午场客观题出现几率不大&#xff0c;可能会占分。 一、软件架构演化和定义 软件架构的演化和维护就是对架构进行修改和完善的过…

jmeter-beanshell学习15-输入日期,计算前后几天的日期

又遇到新问题了&#xff0c;想要根据获取的日期&#xff0c;计算出前面两天的日期。网上找了半天&#xff0c;全都是写获取当天日期&#xff0c;然后计算昨天的日期&#xff0c;照葫芦画瓢也没改出来想要的&#xff0c;最后求助了开发同学。 先放上网上获取当天&#xff0c;计…

使用Canal监听Binlog将数据发送到RocketMQ

文章目录 一、部署RocketMQ二、部署MySQL1、开启mysql的binlog写入功能2、创建一个有相关权限的mysql slave账号 三、部署 Canal1、修改conf/canal.properties配置文件2、修改conf/example/instance.properties配置文件 四、实际操作 一、部署RocketMQ win11 部署RocketMQ 和可…

u盘sd卡格式化怎么恢复数据:从绝望到希望的全面指南

在数字时代&#xff0c;U盘和SD卡已成为我们日常生活中不可或缺的数据存储设备。然而&#xff0c;一不留神的格式化操作&#xff0c;往往会导致重要数据的瞬间消失&#xff0c;让人倍感焦虑与无助。那么&#xff0c;面对这一突如其来的数据灾难&#xff0c;我们是否只能束手就擒…

大模型套壳祛魅:质疑套壳,理解套壳

过去的 2023 年是大模型元年&#xff0c;在国产大模型数量狂飙突进的同时——已经超过 200 个&#xff0c;「套壳」一直是萦绕在大模型头上的舆论阴云。 从年初到年末&#xff0c;从百度文心一言到零一万物&#xff0c;从字节跳动到谷歌 Gemini&#xff0c;各种「涉嫌套壳」的…

案例精选 | 南大港产业园区卫生计生管理服务中心日志系统建设方案

南大港产业园区&#xff0c;坐落于中国河北省沧州市东南部&#xff0c;是一个集工业生产、科技研发、商贸物流、生态居住等多功能于一体的国内知名综合性产业园区。作为区域经济发展的重要引擎&#xff0c;不仅承载着产业升级的重任&#xff0c;还肩负着提升公共服务水平、保障…

刷题了:513.找树左下角的值|112. 路径总和| 113. 路径总和ii|106.从中序与后序遍历序列构造二叉树|105.从前序与中序遍历序列构造二叉树

513.找树左下角的值 文章讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 视频讲解:https://www.bilibili.com/video/BV1424y1Z7pn/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_s…

install第三方jar中包含私服依赖,导致项目无法构建

起因&#xff1a;新公司项目引入了一个发短信的jar包&#xff0c;我使用下列命令安装到本地库。 mvn install:install-file -DfileD:\workspace\\resources\WEB-INF\lib\xxxx.sdk.sms-0.0.1-SNAPSHOT.jar -DgroupIdxxxx.sdk.sms -DartifactIdxxxx.sdk.sms-0.0.1-SNAPSHOT -Dv…

Netty 必知必会(三)—— ByteBuf

Netty ByteBuf工作原理&#xff0c;和NIO里ByteBuffer区别&#xff1f; Java NIO 提供了ByteBuffer 作为它 的字节容器&#xff0c;但是这个类使⽤起来过于复杂&#xff0c;⽽且也有些繁琐。 ByteBuf是Netty框架中的一个关键类&#xff0c;专门设计来处理字节数据&#xff0c;…

大模型笔记4 长文本滑动窗口

Extractive QA参考: https://juejin.cn/post/7180925054559977533 https://huggingface.co/learn/nlp-course/en/chapter7/7 目录 滑动窗口例子(提取开始结束点任务) 滑动窗口代码实现 tokenize() 默认添加问题 每个滑窗添加标题和摘要 训练label跨滑窗情况token匹配 …

MyBatis开发: XML配置⽂件

前言 在IDEA的yml文件注释发现乱码 1.配置文件注释中文显示乱码 退出重进&#xff0c;发现不是乱码就成功 一.MyBatis XML配置⽂件 学习了注解的⽅式, 接下来我们学习XML的⽅式. 使⽤Mybatis的注解⽅式&#xff0c;主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL…

使用Langchain构建简单的数据库Agent

这篇文章我们介绍一个使用LangChain实现SQLagent的方法&#xff0c;LangChain直接内置了自己的SQLagent实现-—SQLDatabaseChain。这个方法使用 SQL Alchemy 与数据库交互。感兴趣的可以考虑一下这两个方案是否可以融合&#xff0c;这样保证SQL的准确性从而提升最终结果的准确率…

修改依赖库

修改依赖库 在开发时&#xff0c;当我们发现使用的依赖库有 bug&#xff0c;需要修改&#xff0c;一般都有这几种处理方式&#xff1a; fork 源码&#xff0c;修复 bug 然后提交 pr&#xff0c;等待作者合并&#xff0c;发布新版本提 issue 等待作者修复&#xff08;跟方式1类…

从物理学到电气工程:如何自学PLC进入工厂担任助理工程师?

本科物理专业自学 PLC 方向&#xff0c;有机会进厂担任助理电气工程师&#xff0c;但可能会面临一些挑战。在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「PLC的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“…

reactive函数

承上启下 在上一节 ref() 函数中&#xff0c;我们大致理解了 ref() 函数的作用是用来将数据转化为响应式的。但是对于基本类型和引用类型&#xff0c;Vue3底层做的转换不一致&#xff1a;对于基本类型&#xff0c;Vue3 通过 ref() 函数将变量转化为了 RefImpl引用对象从而实现响…

NVIDIA把Llama-3的上下文长度扩展16倍,长上下文理解能力超越GPT-4

在 Llama-3.1 模型发布之前&#xff0c;开源模型与闭源模型的性能之间一直存在较大的差距&#xff0c;尤其是在长上下文理解能力上。 大模型的上下文处理能力是指模型能够处理的输入和输出 Tokens 的总数。这个长度有一个限制&#xff0c;超过这个限制的内容会被模型忽略。一般…