当前位置: 首页 > news >正文

编写第一个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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue3<script setup>中使用reactive包裹的对象被重新赋值失去响应式原因和解决方式
  • 面试金典题2.5
  • 【软件工程】需求分析概念
  • 【Delphi】Delphi 中的 LiveBindings 使用场景与概念
  • WPF 自定义路由事件
  • C++从入门到起飞之——多态 全方位剖析!
  • 普通程序员如何快速入门AIGC
  • C/C++内存管理 ——
  • 【WPF】桌面程序开发之窗口的用户控件详解
  • 医院信息化运维监控:确保医疗系统的稳定与安全
  • 运行WPS报错
  • 14年数据结构
  • Spring IoC DI
  • [图解]静态关系和动态关系
  • qt-C++笔记之作用等同的宏和关键字
  • ES6 ...操作符
  • Facebook AccountKit 接入的坑点
  • gf框架之分页模块(五) - 自定义分页
  • JAVA之继承和多态
  • Java知识点总结(JavaIO-打印流)
  • log4j2输出到kafka
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Shadow DOM 内部构造及如何构建独立组件
  • spring学习第二天
  • 阿里云应用高可用服务公测发布
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 翻译--Thinking in React
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • ------- 计算机网络基础
  • 聊聊sentinel的DegradeSlot
  • 深度学习入门:10门免费线上课程推荐
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 正则学习笔记
  • HanLP分词命名实体提取详解
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ###项目技术发展史
  • #pragma 指令
  • #QT(智能家居界面-界面切换)
  • #图像处理
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (实战篇)如何缓存数据
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)SpringBoot3---尚硅谷总结
  • .net core 的缓存方案
  • .NET Core跨平台微服务学习资源
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • @angular/cli项目构建--http(2)
  • @DataRedisTest测试redis从未如此丝滑
  • @media screen 针对不同移动设备
  • @ResponseBody
  • @Valid和@NotNull字段校验使用