编写第一个hadoop3.3.6的mapreduce程序

hadoop还是用的上个伪分布环境。
hadoop安装在龙蜥anolis8.9上,开发是在windows下。
1、windows下首先要下载hadoop的包,hadoop-3.3.6.tar.gz,比如我的解压到d:\java\hadoop-3.3.6中。
配置环境:HADOOP_HOME,内容为:D:\java\hadoop-3.3.6
2、到项目https://github.com/cdarlint/winutils/tree/master/hadoop-3.3.6/bin中,下载:
hadoop.dll、winutils.exe
放到d:\java\hadoop-3.3.6\bin中。
同时将路径D:\java\hadoop-3.3.6\bin放到PATH中。
1、创建maven工程。
pom.xml文件内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.rainpet</groupId><artifactId>MapReduceDemo</artifactId><version>0.0.1-SNAPSHOT</version><name>hadoop-test</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><hadoop.version>3.3.6</hadoop.version><!-- Logger --><lg4j2.version>2.12.1</lg4j2.version></properties><dependencies><dependency><!-- 客户端版本,最好和集群版本一致 --><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.3.6</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs-client</artifactId><version>3.3.6</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-yarn-client</artifactId><version>3.3.6</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.3.6</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.36</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.rainpet.MapReduceDemo.WordCountDriver</mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins></build>
</project>

2、创建包及文件:com.rainpet.MapReduceDemo.WordCountDriver.java
内容为:

package com.rainpet.MapReduceDemo;import java.io.IOException;
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;/** WordCount案例Driver代码* 1、获取job* 2、设置jar包路径* 3、关联Mapper和Reducer* 4、设置Map输出kv类型* 5、设置最终输出kv类型* 6、设置输入路径* 7、设置输出路径* 8、提交任务*/
public class WordCountDriver {public static void main(String[] args) throws ClassNotFoundException, IOException, InterruptedException {// 1、获取jobConfiguration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://master:8020");//conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");Job job = Job.getInstance(conf);// 2、设置jar包路径job.setJarByClass(WordCountDriver.class);// 3、关联Mapper和Reducerjob.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);// 4、设置Map输出kv类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);// 5、设置最终输出kv类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);// 6、设置输入地址FileInputFormat.setInputPaths(job, new Path(args[0]));// 7、设置输出路径FileOutputFormat.setOutputPath(job, new Path(args[1]));// 8、提交任务boolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);}
}

3、创建文件:
com.rainpet.MapReduceDemo.WordCountMapper.java
内容为:

package com.rainpet.MapReduceDemo;import java.io.IOException;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;/** WordCount案例Map阶段代码* KEYIN, Map阶段输入K的类型:LongWritable* VALUEIN, Map阶段输入V的类型:Text* KEYOUT, Map阶段输出K的类型:Text* VALUEOUT,Map阶段输出K的类型:IntWritable*/
// Map阶段继承Mapper类
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {// 定义输出kv对的数据类型Text outK = new Text();IntWritable outV = new IntWritable(1);@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)throws IOException, InterruptedException {// TODO Auto-generated method stub// 将输入的数据转换成String类型String line = value.toString();// 将数据按空格切分String[] words = line.split(" ");for (String word : words) {outK.set(word);context.write(outK, outV);}}}

4、创建包及文件:
com.rainpet.MapReduceDemo.WordCountReducer.java
内容为:

package com.rainpet.MapReduceDemo;import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;/** WordCount案例Reduce阶段代码* KEYIN, Reduce阶段输入K的类型:Text* VALUEIN, Reduce阶段输入V的类型:IntWritable* KEYOUT, Reduce阶段输出K的类型:Text* VALUEOUT,Reduce阶段输出K的类型:IntWritable*/
// Reduce阶段继承Reducer类
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {// 定义Reduce阶段输出值的类型IntWritable outV = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values,Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {// TODO Auto-generated method stub// 统计单词的个数int sum = 0;for (IntWritable value : values) {sum += value.get();}outV.set(sum);context.write(key, outV);}}

5、修改工程的jdk兼容性为jdk1.8
java编译器字节码的版本也为1.8。
6、编译,打包,得到文件:
MapReduceDemo-0.0.1-SNAPSHOT.jar
7、上传到hadoop服务器
执行命令:
hadoop jar MapReduceDemo-0.0.1-SNAPSHOT.jar /user/input /user/output2
正常情况就可以得到结果了。
数据也是使用了上次使用的一个数据文件:/user/input/1.txt

在这里插入图片描述
8、查看结果
hdfs dfs -cat /user/output2/*
9、输出文件删除
hdfs dfs -rm -R /user/output2
10、windows下运行的话,可能会遇到这个问题:
Permission denied: user=administrator, access=WRITE
方法是:在系统的环境变量里面添加HADOOP_USER_NAME=hadoop
这个问题原文:
https://blog.csdn.net/zhangjunli/article/details/106321516

如有其他问题解决,再更新文章。

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

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

相关文章

《互联网域名产业报告(2024年)》

域名是互联网的关键基础资源&#xff0c;是数字时代的重要网络入口和人机交互标识。域名系统是互联网的关键基础设施和“中枢神经系统”&#xff0c;攸关互联网安全稳定运行&#xff0c;也是支撑各国经济社会运行和推动数字经济发展的重要基础。域名解析是用户访问互联网过程中…

[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离

今天带来一款优秀的项目&#xff1a;个人博客系统源码 。 系统采用的流行的前后端分离结构&#xff0c;内含功能包括 "写博客文章"&#xff0c;“修改博客文章”&#xff0c;“富文本编辑器”&#xff0c;“评论管理”“管理员角色”&#xff0c;“游客角色”&#x…

简单题27 - 移除元素(Java)20240917

问题描述&#xff1a; 代码&#xff1a; class Solution {public int removeElement(int[] nums, int val) {int k 0; // k指针用于记录不等于val的元素放置位置for (int i 0; i < nums.length; i) {if (nums[i] ! val) {nums[k] nums[i]; // 如果元素不等于val&#…

C#和数据库高级:继承与多态

文章目录 一、继承的基本使用继承的概念&#xff1a;继承的特点&#xff1a;为什么使用继承&#xff1f; 二、继承的关键字1、this关键字2、base关键字3、Protected关键字4、子类调用父类的构造函数的总结&#xff1a; 三、继承的特性继承的传递性&#xff1a;继承的单根性&…

12 vue3之异步组件代码分包内置组件suspense和teleport

异步组件 在大型应用中&#xff0c;我们可能需要将应用分割成小一些的代码块 并且减少主包的体积&#xff08;不需要在首屏加载得都可使用异步组件&#xff09; 这时候就可以使用异步组件 顶层 await 在setup语法糖里面 使用方法 <script setup> 中可以使用顶层 awa…

IA4054 独立直线锂离子电池充电器,带热调节功能芯片IC

一般描述 LA4054 是一款适用于单体锂离子电池的完整恒流/恒压线性充电器。其ThinSOT封装和较低的外部元件数量使IA4054非常适合便携式应用。此外&#xff0c;LA4054专门设计用于在USB电源规格内工作。 由于内部MOSFET架构&#xff0c;不需要外部感测电阻器&…

Spring6梳理9—— 依赖注入之注入对象类型属性

9.1 依赖注入之外部注入对象类型属性 9.1.1 创建dept与emp类 1.dept类 package com.atguigu.spring6.iocxml.ditest;//部门类 public class Dept {private String dname;public String getDname() {return dname;}public void setDname(String dname) {this.dname dname;…

鸿蒙NEXT生态应用核心技术理念:统一生态,原生智能

统一生态 移动操作系统和桌面操作系统的跨平台应用开发框架不尽相同&#xff0c;从渲染方式的角度可以归纳为 WebView 渲染、原生渲染和自渲染这三类&#xff0c;鸿蒙系统对应的提供系统 WebView、ArkUI 框架和XComponent 能力来支撑三种类型的跨平台框架的接入主流跨平台开发…

Java项目实战II基于Java+Spring Boot+MySQL的保密信息学科平台系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着高等教…

Ruffle 继续在开源软件中支持 Adobe Flash Player

大多数人已经无需考虑对早已寿终正寝的 Adobe Flash 的支持&#xff0c;但对于那些仍有一些 Adobe Flash/SWF 格式的旧资产&#xff0c;或想重温一些基于 Flash 的旧游戏/娱乐项目的人来说&#xff0c;开源 Ruffle 项目仍是 2024 年及以后处理 Flash 的主要竞争者之一。 Ruffl…

免费好用的ppt素材库有哪些?这2个在线网站值得推荐!

ppt素材去哪找&#xff1f; 对于很多做PPT的人来说&#xff0c;做PPT的过程中&#xff0c;不是在找素材&#xff0c;就是在去找ppt素材的路上&#xff0c;想寻找到与内容相匹配的ppt素材&#xff0c;往往占用了大量的时间&#xff0c;且ppt和ppt素材库本身是分离的&#xff0c…

Qt 学习第十天:小项目:QListWidget的使用

一、页面布局 二、命名按钮 双击按钮可以修改显示中的文字&#xff08;例如&#xff1a;改成“全选”&#xff09;&#xff0c;objectName是要改成程序员所熟悉的名字&#xff08;英文&#xff0c;符合代码规范&#xff09;方便修改和书写代码&#xff0c;一看就能看懂的 三、…

直接从U盘里删除文件能找回吗?不慌!教你4种恢复技巧

在数字化时代&#xff0c;U盘已成为我们日常生活和工作中不可或缺的数据存储工具。然而&#xff0c;随着使用频率的增加&#xff0c;误删文件的情况也时有发生。当文件从U盘中被直接删除时&#xff0c;许多人可能会感到绝望&#xff0c;认为这些文件已经永久丢失。 但实际上&am…

C#基础(14)冒泡排序

前言 其实到上一节结构体我们就已经将c#的基础知识点大概讲完&#xff0c;接下来我们会讲解一些关于算法相关的东西。 我们一样来问一下gpt吧&#xff1a; Q:解释算法 A: 算法是一组有序的逻辑步骤&#xff0c;用于解决特定问题或执行特定任务。它可以是一个计算过程、一个…

Python全网最全基础课程笔记(十一)——字符串所有操作,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

本专栏系列为Pythong基础系列&#xff0c;每篇内容非常全面&#xff0c;包含全网各个知识点&#xff0c;非常长&#xff0c;请耐心看完。 每天都会更新新的内容&#xff0c;搜罗全网资源以及自己在学习和工作过程中的一些总结&#xff0c;可以说是非常详细和全面。 以至于为什么…

麦克风是不是越贵越好?选购无线麦克风需注意的五个关键点

相信接触过短视频或者直播行业的朋友们都知道麦克风的重要性&#xff0c;这是拍摄中很常用的设备&#xff0c;而麦克风的好坏也决定了整体音质的效果如何。不过有些刚入门的朋友们对麦克风并不是很了解&#xff0c;认为麦克风是不是越贵就越好&#xff1f; 其实并不是&#xff…

电抗器可以减少发电机阻力吗

电抗器通常用于电力系统中主要为了限制短路电流、改善功率因数和抑制谐波等&#xff0c;而不是直接减少发电机的阻力。具体来说&#xff0c;电抗器在发电机系统中的作用主要包括以下几个方面&#xff1a; 1. 限制短路电流 电抗器&#xff08;特别是限流电抗器&#xff09;可以…

22:SPI一:简单的使用

SPI简单的使用 1、什么是SPI2、数据通信2.1&#xff1a;5个重要参数2.2&#xff1a;4种传输模式 3、程序模拟SPI通信时序3、片上外设SPI通信时序 1、什么是SPI SPI是一种同步的&#xff0c;全双工&#xff0c;支持总线挂载多设备的通信协议。它特别适用于高效&#xff0c;快速…

激光粉尘传感器:筑牢粮仓安全防线,有效应对粮食粉尘爆炸高危风险

随着我国农业的持续发展和粮食产量的稳步提升&#xff0c;2023年全国粮食总产量达到了13908.2亿斤&#xff0c;这一丰硕成果不仅保障了国家的粮食安全&#xff0c;也对粮食的储备、加工、运输等环节提出了更高的要求。然而&#xff0c;在粮食产业链的各个环节中&#xff0c;粮食…

11_Python函数基本概念和示例

函数 函数是组织代码、提高代码复用性的基本工具。一个函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。函数类型&#xff1a;内置函数、自定义函数 定义函数 在 Python 中&#xff0c;使用 def 关键字来定义一个函数。 函数可以有参数&#xff0c;也可以…