ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在Windows的VSCode上配置Java-Hadoop开发环境,并用MapReduce实现WordCount功能|TaoToken统一Key接入实践

在Windows的VSCode上配置Java-Hadoop开发环境,并用MapReduce实现WordCount功能|TaoToken统一Key接入实践 1. Windows 本地跑通 Hadoop 到底卡在哪从 VSCode 到 WordCount 的完整链路很多人第一次在 Windows 上折腾 Hadoop卡点往往不在 MapReduce 代码本身而在环境这一层。JDK 版本对不上、Hadoop 的 winutils 缺失、Maven 拉不到依赖、VSCode 里 Java 插件装错包任何一个环节出问题最后都会表现成一句看不懂的报错。这篇就把 Windows VSCode Java Hadoop 这条链路从头搭一遍最后用 MapReduce 的 WordCount 输出计数结果作为验收动作。核心检索词先摆出来Windows 上用 VSCode 配置 Java-Hadoop 开发环境指的是在本地不依赖 Linux 虚拟机的前提下用 JDK 8、Hadoop 2.7.x、Maven 和 VSCode 的 Java 插件组成一套能编译、能提交本地 Job 的开发链路。它能做什么让你在 Windows 上直接写 Mapper、Reducer用hadoop jar跑本地模式看到part-r-00000里的词频结果。适合谁适合刚学大数据、手头只有 Windows 机器、又不想一上来就配虚拟机的同学。我试过把 Hadoop 装在系统盘后来 C 盘爆了所以下面所有路径都建议放 D 盘。整条链路分六段先解决 JDK 和 Hadoop 解压配置再装 VSCode 插件然后配 Maven 和settings.json接着写core-site.xml、hadoop-env.cmd再补上 TaoToken 统一 Key 的接入位最后跑 WordCount 验证。每一步都给可复制的片段你照着改路径就行。需要提前说明的是Hadoop 在 Windows 上跑本地模式必须要有winutils.exe和hadoop.dll否则会报Could not locate executable null\bin\winutils.exe。这个坑后面第五节会专门讲。另外 JDK 一定用 8Hadoop 2.7.x 对高版本 JDK 兼容性差用 JDK 17 大概率起不来。2. 前置准备JDK、Hadoop 解压与 TaoToken 统一 Key 接入位先说 JDK。下载 JDK 8比如jdk1.8.0_301安装路径建议D:\Java\jdk1.8.0_301。装完配环境变量新建JAVA_HOME指向该目录然后在Path里加%JAVA_HOME%\bin。开个新的 cmd 敲java -version能看到1.8.0_301就对了。注意一定要新开终端老终端读不到新变量。接着是 Hadoop。去 Apache 官网下hadoop-2.7.1.tar.gz这类二进制包用 7-Zip 解压到D:\hadoop-2.7.1。解压完先别急着配Windows 上缺winutils.exe需要把对应版本的winutils.exe和hadoop.dll放进D:\hadoop-2.7.1\bin目录。这一步不做后面跑 Job 必挂。环境变量这块新建HADOOP_HOMED:\hadoop-2.7.1Path里加%HADOOP_HOME%\bin。同时建议把HADOOP_USER_NAME设成你的 Windows 用户名避免权限相关的怪报错。然后是 TaoToken 的接入位。为什么要在这里提因为后面写 Mapper、Reducer 时你大概率想让 AI 帮你补全代码或解释报错与其每个工具单独配 Key不如用一套统一 Key 通道。TaoToken 提供统一的 API 入口Base URL 是https://taotoken.net/api你可以在官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content拿到 Key然后在控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite管理额度。这一步只是预留接入位不影响 Hadoop 本身运行。Maven 也顺手装了。下载apache-maven-3.8.8解压到D:\apache-maven-3.8.8在目录下新建repository当本地仓库。新建MAVEN_HOMED:\apache-maven-3.8.8Path加%MAVEN_HOME%\bin。敲mvn -version验证。3. 可复制配置settings.json、core-site.xml 与 hadoop-env.cmd这一节是全文最该抄的部分。先配 Maven 的settings.xml路径D:\apache-maven-3.8.8\conf\settings.xml。在mirrors里加阿里云镜像在profiles里锁定 JDK 1.8localRepository指向本地仓库localRepositoryD:\apache-maven-3.8.8\repository/localRepository mirrors mirror idalimaven/id mirrorOfcentral/mirrorOf namealiyun maven/name urlhttps://maven.aliyun.com/repository/central/url /mirror /mirrors profiles profile idjdk-1.8/id activation activeByDefaulttrue/activeByDefault jdk1.8/jdk /activation properties maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target maven.compiler.compilerVersion1.8/maven.compiler.compilerVersion /properties /profile /profiles然后是 VSCode 的settings.json。按CtrlShiftP输入Open User Settings (JSON)把 Java 和 Maven 路径写进去这样 VSCode 才能找到你的 JDK 和 Maven{ java.jdt.ls.java.home: D:\\Java\\jdk1.8.0_301, java.configuration.runtimes: [ { name: JavaSE-1.8, path: D:\\Java\\jdk1.8.0_301, default: true } ], maven.executable.path: D:\\apache-maven-3.8.8\\bin\\mvn.cmd, maven.terminal.useJavaHome: true, java.compile.nullAnalysis.mode: automatic }Hadoop 这边编辑D:\hadoop-2.7.1\etc\hadoop\core-site.xml指定默认文件系统本地模式用file:///configuration property namefs.defaultFS/name valuefile:////value /property property namehadoop.tmp.dir/name valueD:/hadoop-2.7.1/tmp/value /property /configuration再改hadoop-env.cmd把JAVA_HOME显式写死避免它去找默认路径set JAVA_HOMED:\Java\jdk1.8.0_301如果你想让 AI 辅助写这些配置可以在 VSCode 里装 Continue 或 Cline 这类插件把 Base URL 填https://taotoken.net/apiKey 用 TaoToken 控制台生成的Model ID 按你选的模型填。这样配置片段、报错解释都能直接问不用来回切浏览器。模型对话入口在https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite需要长期编码或 Agent 场景可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite。4. 验证请求从 Maven 项目到 WordCount 输出计数结果配置写完要验证。先敲mvn -version看到 Maven 3.8.8 和 Java 1.8 就说明 Maven 链路通了。然后在 VSCode 里按CtrlShiftP输入Java: Create Java Project选 Maven选maven-archetype-quickstart选个目录等它初始化完。打开生成的pom.xml加 Hadoop 依赖和版本属性properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target hadoop.version2.7.1/hadoop.version /properties dependencies dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-common/artifactId version${hadoop.version}/version /dependency dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-hdfs/artifactId version${hadoop.version}/version /dependency dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-mapreduce-client-core/artifactId version${hadoop.version}/version /dependency dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-client/artifactId version${hadoop.version}/version /dependency /dependencies保存后右下角弹窗点 Yes让它重新解析。然后写三个类。WordCountMapper.javapackage com.example; 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 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 { String[] words value.toString().split(\\s); for (String w : words) { if (w.isEmpty()) continue; word.set(w); context.write(word, one); } } }WordCountReducer.javapackage com.example; 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 ReducerText, IntWritable, Text, IntWritable { Override protected void reduce(Text key, IterableIntWritable values, Context context) throws IOException, InterruptedException { int sum 0; for (IntWritable val : values) { sum val.get(); } context.write(key, new IntWritable(sum)); } }WordCount.java主类package com.example; 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 WordCount { public static void main(String[] args) throws Exception { if (args.length ! 2) { System.err.println(Usage: WordCount input path output path); System.exit(-1); } Configuration conf new Configuration(); Job job Job.getInstance(conf, Word Count); job.setJarByClass(WordCount.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }编译打包。在项目根目录开终端先编译javac -classpath %HADOOP_HOME%\share\hadoop\common\*;%HADOOP_HOME%\share\hadoop\mapreduce\*;%HADOOP_HOME%\share\hadoop\hdfs\*;%HADOOP_HOME%\share\hadoop\yarn\* -d . src\main\java\com\example\WordCount.java src\main\java\com\example\WordCountMapper.java src\main\java\com\example\WordCountReducer.java再打包jar -cvf wordcount.jar -C . com\example新建word.txt内容写hello world hello world hello。运行hadoop jar wordcount.jar com.example.WordCount word.txt output_dir注意output_dir必须是当前不存在的目录否则报Output directory already exists。跑完看结果type output_dir\part-r-00000正常输出是hello 3和world 2。看到这两行说明整条链路通了。5. 本篇常见错排查401、winutils、reading choices 与 OAuth 报错跑不通的时候对照下面几个真实报错。第一个Could not locate executable null\bin\winutils.exe。这是 Windows 上最经典的坑原因是HADOOP_HOME没配或winutils.exe没放进bin。解决确认HADOOP_HOMED:\hadoop-2.7.1并把对应版本的winutils.exe、hadoop.dll拷进D:\hadoop-2.7.1\bin然后重启终端。第二个java.io.IOException: No FileSystem for scheme: file。多半是core-site.xml没生效或fs.defaultFS写错。检查D:\hadoop-2.7.1\etc\hadoop\core-site.xml里是不是file:///三个斜杠别少。第三个Output directory already exists。删掉output_dir再跑或者换个新目录名。Hadoop 不允许输出目录已存在这是设计如此。第四个Error: Could not find or load main class com.example.WordCount。检查jar -cvf时-C .后面的路径对不对com\example下应该有.class文件。用jar -tf wordcount.jar看包内容。第五个如果你在 VSCode 里用 AI 插件可能遇到401 Unauthorized或local proxy failed。401 一般是 Key 没填对或过期去 TaoToken 控制台https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite重新生成。local proxy failed通常是 Base URL 写成了带路径的地址正确写法是https://taotoken.net/api不要多加/v1之类。如果插件报reading choices相关错误多半是返回体解析失败检查 Model ID 是否填对别把模型名写成不存在的值。第六个OAuth 类报错。有些插件走 OAuth 登录流程如果你用的是 API Key 模式就别选 OAuth直接在配置里填 Base URL Key Model ID 三件套。以 Cline 为例Provider 选 OpenAI CompatibleBase URL 填https://taotoken.net/apiAPI Key 填 TaoToken 的 KeyModel ID 填你选的模型。Codex 的auth.json同理把base_url和api_key写对即可。接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite遇到不确定的字段去那里对。第七个mvn命令找不到。检查MAVEN_HOME和Path注意Path里加的是%MAVEN_HOME%\bin不是%MAVEN_HOME%。改完环境变量一定要新开终端。6. 后续怎么用把统一 Key 接进日常编码与 Agent 流程环境跑通之后日常写 MapReduce 或调 Hadoop 报错时AI 辅助能省不少时间。TaoToken 的价值在于一套 Key 走通多个工具不用每个插件单独申请。模型对话适合问「这个 Reducer 为什么输出类型不匹配」Coding Plan 适合长期写代码或跑 Agent 任务接入文档适合查字段。具体接入时记住三件套Base URL 用https://taotoken.net/apiKey 从控制台拿Model ID 按你选的模型填。Claude Code 这类工具如果走 Anthropic 协议入口在https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite配置时同样把 Base URL 和 Key 填对。别把 TaoToken 当成编辑器替代品它只是模型通道代码还是在你 VSCode 里写。最后留个实用技巧Hadoop 本地模式跑 WordCount 时如果输入文件有中文记得在WordCountMapper里处理编码或者把word.txt存成 UTF-8 无 BOM。另外output_dir每次跑之前删掉可以写个rmdir /s /q output_dir的批处理省事。跑通一次之后把wordcount.jar和word.txt放同一个目录以后改代码重新jar -cvf覆盖即可不用每次从头配环境。
返回列表