Hadoop 3.x Windows 本地开发:Maven项目集成与WordCount实战代码

发布时间:2026/9/18 2:16:32
Hadoop 3.x Windows 本地开发:Maven项目集成与WordCount实战代码 Hadoop 3.x Windows本地开发Maven项目集成与WordCount实战指南对于Java开发者而言在Windows环境下搭建Hadoop开发环境并进行本地调试一直是个令人头疼的问题。本文将彻底解决这个痛点带你从零构建一个完整的Maven项目实现Hadoop MapReduce作业的本地开发闭环。1. 环境准备与Hadoop本地化配置在开始编码之前我们需要确保Windows系统具备运行Hadoop的基本条件。与Linux环境不同Windows需要额外的支持文件才能正常运行Hadoop。1.1 基础环境检查首先确认以下组件已正确安装Java JDK 8Hadoop 3.x需要Java 8或更高版本Maven 3.6用于项目依赖管理IDE支持IntelliJ IDEA或Eclipse推荐使用最新版本验证Java环境java -version mvn -v1.2 Hadoop Windows支持文件配置从GitHub获取winutils和hadoop.dll文件# 推荐使用cdarlint维护的版本 git clone https://github.com/cdarlint/winutils将下载的文件放置到正确位置复制winutils.exe和hadoop.dll到Hadoop安装目录的bin文件夹可选复制相同文件到C:\Windows\System321.3 关键环境变量设置在系统环境变量中添加以下配置变量名示例值说明HADOOP_HOMED:\hadoop-3.3.4Hadoop安装目录PATH%HADOOP_HOME%\bin添加Hadoop命令到系统路径验证配置hadoop version2. 创建Maven项目与依赖配置现在我们来创建一个标准的Maven项目并配置必要的Hadoop依赖。2.1 初始化Maven项目使用以下命令创建项目骨架mvn archetype:generate -DgroupIdcom.hadoop.demo -DartifactIdhadoop-wordcount -DarchetypeArtifactIdmaven-archetype-quickstart -DinteractiveModefalse2.2 完善pom.xml配置完整的pom.xml应包含以下关键依赖和配置properties hadoop.version3.3.4/hadoop.version maven.compiler.source11/maven.compiler.source maven.compiler.target11/maven.compiler.target /properties dependencies !-- Hadoop核心依赖 -- dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-client/artifactId version${hadoop.version}/version /dependency !-- 本地开发特殊依赖 -- dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-common/artifactId version${hadoop.version}/version /dependency dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-mapreduce-client-core/artifactId version${hadoop.version}/version /dependency !-- 测试依赖 -- dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.13.2/version scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-shade-plugin/artifactId version3.2.4/version executions execution phasepackage/phase goals goalshade/goal /goals configuration transformers transformer implementationorg.apache.maven.plugins.shade.resource.ServicesResourceTransformer/ /transformers /configuration /execution /executions /plugin /plugins /build提示使用mvn clean install验证项目配置是否正确3. WordCount实现与本地运行经典的WordCount示例是学习Hadoop的最佳起点。我们将实现一个完整的本地可运行版本。3.1 Mapper实现创建WordCountMapper.javaimport 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; import java.util.StringTokenizer; public class WordCountMapper extends MapperLongWritable, Text, Text, IntWritable { private final static IntWritable one new IntWritable(1); private Text word new Text(); Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } }3.2 Reducer实现创建WordCountReducer.javaimport 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 ReducerText, IntWritable, Text, IntWritable { private IntWritable result new IntWritable(); Override protected void reduce(Text key, IterableIntWritable values, Context context) throws IOException, InterruptedException { int sum 0; for (IntWritable val : values) { sum val.get(); } result.set(sum); context.write(key, result); } }3.3 驱动程序实现创建WordCountDriver.java作为作业入口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; public class WordCountDriver { public static void main(String[] args) throws Exception { Configuration conf new Configuration(); // 设置为本地模式运行 conf.set(mapreduce.framework.name, local); conf.set(fs.defaultFS, file:///); Job job Job.getInstance(conf, word count); job.setJarByClass(WordCountDriver.class); job.setMapperClass(WordCountMapper.class); job.setCombinerClass(WordCountReducer.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); // 使用项目resources目录下的测试文件 FileInputFormat.addInputPath(job, new Path(src/main/resources/input.txt)); FileOutputFormat.setOutputPath(job, new Path(output)); System.exit(job.waitForCompletion(true) ? 0 : 1); } }3.4 测试数据准备在src/main/resources目录下创建input.txtApache Hadoop is an open source framework Hadoop enables distributed processing of large data sets Hadoop is designed to scale up from single servers4. 高级调试技巧与优化掌握了基础实现后我们需要了解如何在IDE中高效开发和调试Hadoop应用。4.1 IntelliJ IDEA调试配置创建运行配置Main class:WordCountDriverVM options:-Dhadoop.home.dirD:\hadoop-3.3.4Working directory: 项目根目录调试断点设置在Mapper的map方法设置断点在Reducer的reduce方法设置断点使用条件断点跟踪特定单词4.2 本地模式优化参数在WordCountDriver中添加以下配置可提升本地运行效率// 设置本地模式下的内存分配 conf.set(mapreduce.map.memory.mb, 1024); conf.set(mapreduce.reduce.memory.mb, 1024); // 启用中间输出压缩 conf.set(mapreduce.map.output.compress, true); conf.set(mapreduce.map.output.compress.codec, org.apache.hadoop.io.compress.SnappyCodec);4.3 常见问题解决方案问题1java.io.IOException: Could not locate executable null\bin\winutils.exe解决方案// 在Driver类中添加以下代码 System.setProperty(hadoop.home.dir, D:\\hadoop-3.3.4);问题2ExitCodeException exitCode-1073741515这通常是由于缺少Microsoft Visual C运行库导致安装最新VC运行库即可解决。5. 项目结构与最佳实践一个规范的Hadoop Maven项目应该遵循以下结构hadoop-wordcount/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── hadoop/ │ │ │ └── demo/ │ │ │ ├── WordCountDriver.java │ │ │ ├── WordCountMapper.java │ │ │ └── WordCountReducer.java │ │ └── resources/ │ │ ├── core-site.xml │ │ ├── hdfs-site.xml │ │ └── input.txt │ └── test/ │ └── java/ │ └── com/ │ └── hadoop/ │ └── demo/ │ └── WordCountTest.java ├── pom.xml └── output/ (运行后生成)5.1 资源配置文件示例core-site.xml本地开发配置configuration property namefs.defaultFS/name valuefile:////value /property property namehadoop.tmp.dir/name value/tmp/hadoop-tmp/value /property /configuration5.2 单元测试示例创建WordCountTest.java进行逻辑验证import static org.junit.Assert.*; import org.apache.hadoop.io.*; import org.junit.Test; public class WordCountTest { Test public void testMapper() throws Exception { WordCountMapper mapper new WordCountMapper(); Text value new Text(hello world hello); // 使用MockContext验证输出 MockContext context new MockContext(); mapper.map(null, value, context); assertEquals(2, context.getCount(hello)); assertEquals(1, context.getCount(world)); } // 简化版的MockContext实现 static class MockContext extends MapperLongWritable, Text, Text, IntWritable.Context { // 实现细节省略 } }6. 性能调优与生产准备当本地开发完成后我们需要考虑如何将代码迁移到生产环境。6.1 本地与生产环境配置切换创建Profile实现环境隔离!-- pom.xml中添加 -- profiles profile idlocal/id properties hadoop.runtimelocal/hadoop.runtime /properties activation activeByDefaulttrue/activeByDefault /activation /profile profile idcluster/id properties hadoop.runtimecluster/hadoop.runtime /properties /profile /profiles修改Driver类支持多环境// 根据系统属性决定运行模式 String runtime System.getProperty(hadoop.runtime, local); if (local.equals(runtime)) { conf.set(mapreduce.framework.name, local); conf.set(fs.defaultFS, file:///); } else { conf.set(mapreduce.framework.name, yarn); conf.set(yarn.resourcemanager.hostname, your-cluster-address); }6.2 打包与部署使用Maven生成可部署的JAR包mvn clean package -Pcluster生产环境提交作业hadoop jar hadoop-wordcount-1.0.jar \ com.hadoop.demo.WordCountDriver \ /input/path /output/path7. 扩展应用自定义输入输出格式除了基本的文本处理Hadoop还支持各种数据格式。7.1 处理JSON数据创建JsonMapper.javapublic class JsonMapper extends MapperLongWritable, Text, Text, IntWritable { private ObjectMapper mapper new ObjectMapper(); Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { JsonNode node mapper.readTree(value.toString()); String product node.get(product).asText(); context.write(new Text(product), new IntWritable(1)); } }7.2 自定义输出格式实现CustomOutputFormat.javapublic class CustomOutputFormat extends FileOutputFormatText, IntWritable { Override public RecordWriterText, IntWritable getRecordWriter(TaskAttemptContext job) throws IOException { Path outputDir FileOutputFormat.getOutputPath(job); Path file new Path(outputDir, result.csv); FileSystem fs file.getFileSystem(job.getConfiguration()); FSDataOutputStream out fs.create(file); return new CustomRecordWriter(out); } static class CustomRecordWriter extends RecordWriterText, IntWritable { private DataOutputStream out; public CustomRecordWriter(DataOutputStream out) { this.out out; } Override public void write(Text key, IntWritable value) throws IOException { out.writeBytes(String.format(\%s\,%d\n, key.toString(), value.get())); } Override public void close(TaskAttemptContext context) throws IOException { out.close(); } } }在Driver中配置使用job.setOutputFormatClass(CustomOutputFormat.class);

相关新闻

留学网站建设避坑指南:别让你的官网变成“僵尸站”,真人实操血泪史

留学网站建设避坑指南:别让你的官网变成“僵尸站”,真人实操血泪史

做了三年留学网站,发现百分之八十的机构都在用模板堆砌,结果流量惨淡,咨询寥寥无几。这篇不整虚的,直接拆解那些让留学官网沦为“电子名片”的致命误区,教你怎么把网站变成真正的获客利器。我见过太多同行,花几万块找个外包公司做个高大上的官网,结果上线半年,百度收录…

发布时间:2026/8/20 5:29:59
别被忽悠了!写城市网站建设摘要论文,这3个坑我替你踩了

别被忽悠了!写城市网站建设摘要论文,这3个坑我替你踩了

昨天半夜两点,我还在改稿子。咖啡喝了三杯,手都在抖。为啥?因为甲方又提了新需求。他说:“小王啊,这个城市网站建设摘要论文,你得写出那种‘高大上’的感觉。”我笑了。真的,我笑了。很多做网站的朋友,一听到“摘要”两个字,就头大。觉得要引经据典,要堆砌辞藻。其实…

发布时间:2026/8/20 5:30:00
别被忽悠了!揭秘网站建设的运作原理,小白也能看懂的门道

别被忽悠了!揭秘网站建设的运作原理,小白也能看懂的门道

今天咱们不整那些虚头巴脑的大词。 直接聊聊最实在的东西。 很多老板找我做网站, 开口就是:“给我弄个高大上的。” 其实吧, 你根本不需要知道代码怎么写。 但你得懂点底层逻辑。 不然被人坑了都不知道。 这就好比装修房子, 你得知道水电怎么走, 对吧? 不然工人给你乱接一…

发布时间:2026/8/20 5:30:00
跑断腿?我在平阳县建设局网站办证的血泪史与避坑指南

跑断腿?我在平阳县建设局网站办证的血泪史与避坑指南

说实话,以前我对“跑审批”这四个字充满了恐惧。总觉得那是只有大企业或者专业中介才能玩转的游戏,咱们普通小老板或者刚入行的工程人,根本摸不着头脑。直到上个月,我为了一个小型装修项目的施工许可,硬着头皮去了一趟平阳县建设局网站,结果发现,只要找对路子,这事儿真…

发布时间:2026/9/17 2:43:10
为什么你的网站留不住人?揭秘建设网站会员体系的底层逻辑与实操指南

为什么你的网站留不住人?揭秘建设网站会员体系的底层逻辑与实操指南

很多老板都在问:为什么我的网站流量不少,转化率却惨不忍睹?其实,问题往往出在“留客”上。你花了大价钱买流量,用户进来逛了一圈,连个招呼都没打就走了。这就像开了一家实体店,顾客进门看看,然后转身离开,你连个联系方式都没拿到。这种“一次性买卖”思维,在今天的互…

发布时间:2026/9/17 3:03:14
徐州市丰县建设局网站 咋用才不踩坑?老业主掏心窝子分享

徐州市丰县建设局网站 咋用才不踩坑?老业主掏心窝子分享

昨晚半夜两点,我还在盯着手机屏幕,心里那个急啊。为啥?因为我家那套安置房的事儿,开发商那边一直拖泥带水,说是等公示,可公示啥样我心里没底。没办法,只能硬着头皮去查“徐州市丰县建设局网站”。说实话,第一次上去的时候,我整个人是懵的。界面那叫一个复古,跟咱们老…

发布时间:2026/9/17 3:03:14
龙口网站建设公司哪家好?别踩坑,看这几点就够了

龙口网站建设公司哪家好?别踩坑,看这几点就够了

本文关键词:龙口网站建设公司哪家好做企业官网,最怕啥?怕花了几万块,结果打开慢得像蜗牛,手机端还乱码。更怕的是,搜“龙口某某公司”,首页连个影子都找不着。钱打水漂,还耽误事。很多老板找我聊,开口就问:“龙口网站建设公司哪家好?”这话问得实在。毕竟龙口这地方…

发布时间:2026/9/17 3:03:16
别再被忽悠了!一份真正落地的建筑网站建设方案,专治各种花里胡哨

别再被忽悠了!一份真正落地的建筑网站建设方案,专治各种花里胡哨

说实话,我见过太多建筑公司的官网了。真的,多到让人想吐。要么就是满屏的大图,加载慢得像蜗牛。要么就是文案写得云里雾里,根本不知道你是干啥的。客户点进来三秒钟,啪,关掉了。这就叫浪费生命。今天我不讲那些虚头巴脑的理论。我就想聊聊,到底怎么做一个真正能接活的建…

发布时间:2026/9/16 22:01:01
个人做计算机编程与网站建设到底难不难?老程序员掏心窝子说几句

个人做计算机编程与网站建设到底难不难?老程序员掏心窝子说几句

这篇文章不讲那些虚头巴脑的理论,直接告诉你新手入坑计算机编程与网站建设最真实的坑在哪,以及怎么避开。很多人以为写代码就是对着黑屏幕敲字母,其实那是电影骗人的。真正的难点在于怎么把脑子里的想法变成别人能看懂、能用的网页。如果你正纠结要不要学,或者刚起步觉得头…

发布时间:2026/9/17 3:03:19