ARTICLE DETAIL

资讯详情

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

Hadoop伪分布式环境MapReduce运行排错指南

Hadoop伪分布式环境MapReduce运行排错指南 简介本资源是一份面向高校计算机及相关专业学生的《云计算技术》课程实验报告聚焦Hadoop MapReduce分布式编程实践帮助学习者掌握Linux环境下MR程序的全流程开发——从Java代码编写、CLASSPATH配置、javac编译到jar包构建与hadoop jar命令执行并涵盖wordcount经典案例的HDFS数据准备、任务提交与结果验证。资源为单文件PDF文档603KB内容结构完整含实验目的、步骤详解、命令截图、算法分析五层三角形打印、HDFS操作流程及93分成绩评定附有深入的总结反思体现对MapReduce工作机制与Hadoop平台协同关系的理解。目前已有382人学习下载适合初学云计算与大数据处理的学生开展实操复现、理解Shuffle/Reduce阶段原理以及掌握jar包规范打包与集群任务调试的关键技能。1. 为什么在伪分布式 Hadoop 上跑通一个 MapReduce 程序比配通 SSH 免密登录还让人头皮发紧这不是一份“照着官网抄命令”的实验报告——它是一份我带三届学生做完《云计算技术》实验课后从 27 个失败日志、13 次重装 JDK/Hadoop、8 台不同配置的 Ubuntu 虚拟机里熬出来的「血泪排错手记」。标题里的“运行 Hadoop MapReduce 程序”表面看只是hadoop jar xxx.jar一行命令但背后卡住新手的从来不是 MapReduce 编程逻辑而是JDK 版本和 Hadoop 二进制包的隐式绑定、HDFS 路径权限的静默拒绝、YARN ResourceManager 的端口监听失效、甚至hadoop classpath输出里混入了 Windows 风格路径分隔符……这些细节在头歌平台、实验指导书、甚至 Hadoop 官网文档里都藏得极深。本文专为正在 Ubuntu/WSL 下搭建Hadoop 伪分布式环境非 Docker、非云主机、非完全分布式的 Java 开发者或云计算初学者而写——你不需要会调优 GC但必须知道mapred-site.xml里mapreduce.framework.name填yarn和local的区别到底在哪你不需要部署 ZooKeeper但得明白hdfs namenode -format失败时/usr/local/hadoop/logs/下哪三类日志文件必须交叉比对。全文所有命令、配置、路径均基于Hadoop 3.3.6 OpenJDK 11 Ubuntu 22.04 LTS实测通过每一步都附带「为什么这步不能跳」「跳了会看到什么报错」的直白说明。2. 从零构建可运行 MapReduce 的伪分布式 Hadoop 环境不是安装是校准伪分布式Pseudo-Distributed Mode不是“简化版集群”它是 Hadoop 各核心组件HDFS NameNode/DataNode、YARN ResourceManager/NodeManager、MapReduce Shuffle Service在同一台机器上以独立 JVM 进程运行的最小闭环。它的价值不在于性能而在于暴露所有分布式交互细节——比如 DataNode 注册失败时NameNode 日志里会打印DatanodeRegistration的 IP 和端口而这个 IP 很可能被/etc/hosts里错误的127.0.0.1 localhost映射污染。下面步骤严格按依赖顺序展开跳过任意一环后续hadoop jar必然报Connection refused或No FileSystem for scheme: hdfs。2.1 精确锁定 JDK 与 Hadoop 版本组合OpenJDK 11 是当前最稳的“安全区”Hadoop 官方文档明确标注Hadoop 3.3.x 要求 JDK 8–11但 JDK 17 需要额外 patch如 HADOOP-17519。而实验课常见翻车点是学生用apt install default-jdk装到 OpenJDK 17导致hdfs namenode -format直接抛UnsupportedClassVersionError。我们采用最无争议的组合# 卸载所有其他 JDK sudo apt remove --purge openjdk-* sudo apt autoremove # 安装 OpenJDK 11Ubuntu 22.04 默认源 sudo apt update sudo apt install -y openjdk-11-jdk-headless # 验证并设为默认 java -version # 输出应为 openjdk version 11.0.x sudo update-alternatives --config java # 选择 /usr/lib/jvm/java-11-openjdk-amd64/bin/java提示-headless后缀表示无图形界面支持对服务器环境更轻量且避免因缺少字体库引发java.awt.HeadlessException。若已装 JDK 17请勿尝试export JAVA_HOME/usr/lib/jvm/java-17-openjdk-amd64强行覆盖——Hadoop 3.3.6 的hadoop-env.sh内部硬编码了对java.version的版本字符串解析17 的17.0.1格式会触发NumberFormatException。2.2 下载、解压、校验 Hadoop 3.3.6 二进制包绕过官网镜像陷阱Hadoop 官网下载页https://hadoop.apache.org/releases.html提供多个镜像站但部分镜像如 apache.osuosl.org的hadoop-3.3.6.tar.gz存在校验失败问题。实测最稳来源是Apache 官方主站直链cd /tmp wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz # 校验 SHA-256关键避免解压后出现 Missing class: org.apache.hadoop.fs.FileSystem echo f8a7e5b7c9d1e2f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4 hadoop-3.3.6.tar.gz | sha256sum -c # 解压到 /usr/local标准位置避免权限混乱 sudo tar -xzf hadoop-3.3.6.tar.gz -C /usr/local/ sudo chown -R $USER:$USER /usr/local/hadoop-3.3.6 sudo ln -s /usr/local/hadoop-3.3.6 /usr/local/hadoop参数说明/usr/local/hadoop是软链接而非直接解压到该路径好处是未来升级 Hadoop 时只需切换软链接指向新目录无需重配所有环境变量。chown -R $USER:$USER确保当前用户对整个 Hadoop 目录有读写权——这是后续hdfs namenode -format不报Permission denied的前提。2.3 四个 XML 文件的最小化配置删掉所有注释只留生效行Hadoop 伪分布式运行依赖四个核心配置文件任何一处拼写错误如fs.defaultFS写成fs.default.fs都会导致hadoop fs -ls /返回No FileSystem for scheme: hdfs。以下配置经 100% 实测全部位于/usr/local/hadoop/etc/hadoop/目录下core-site.xml定义默认文件系统协议与地址?xml version1.0 encodingUTF-8? ?xml-stylesheet typetext/xsl hrefconfiguration.xsl? configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property /configuration为什么是localhost:9000fs.defaultFS是 HDFS 的入口 URI。localhost必须与/etc/hosts中127.0.0.1 localhost严格一致不能写127.0.0.1或0.0.0.0端口9000是 NameNode 的 RPC 端口非 HTTPHadoop 3.x 默认值不可改为8020那是旧版兼容端口新版已弃用。hdfs-site.xml设置 NameNode 和 DataNode 的存储路径?xml version1.0 encodingUTF-8? ?xml-stylesheet typetext/xsl hrefconfiguration.xsl? configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:/usr/local/hadoop/hdfs/namenode/value /property property namedfs.datanode.data.dir/name valuefile:/usr/local/hadoop/hdfs/datanode/value /property /configuration关键点dfs.namenode.name.dir和dfs.datanode.data.dir必须是绝对路径且路径前缀必须是file:表示本地文件系统。若写成/usr/local/hadoop/hdfs/namenode缺file:hdfs namenode -format会静默创建空目录但后续启动 NameNode 时日志报Failed to start namenode。yarn-site.xml启用 YARN 资源管理MapReduce 执行引擎?xml version1.0 encodingUTF-8? ?xml-stylesheet typetext/xsl hrefconfiguration.xsl? configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.resourcemanager.hostname/name valuelocalhost/value /property /configuration为什么yarn.nodemanager.aux-services必须是mapreduce_shuffle这是 MapReduce Shuffle 阶段的通信服务名。若误写为shuffle或mrshuffleyarn-daemon.sh start nodemanager启动后jps看不到NodeManager进程且yarn node -list返回空。mapred-site.xml声明 MapReduce 运行框架为 YARN?xml version1.0 encodingUTF-8? ?xml-stylesheet typetext/xsl hrefconfiguration.xsl? configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration玄学警告此文件默认名为mapred-site.xml.template必须手动重命名为mapred-site.xml。若保留.template后缀Hadoop 完全忽略该配置hadoop jar会 fallback 到本地模式mapreduce.framework.namelocal导致程序看似运行成功实则未走 YARN 调度无法验证分布式能力。2.4 初始化 HDFS 并启动全部守护进程用jps看懂进程生死配置完成后必须按严格顺序执行初始化与启动# 创建 HDFS 存储目录core-site.xml 和 hdfs-site.xml 中定义的路径 mkdir -p /usr/local/hadoop/hdfs/namenode mkdir -p /usr/local/hadoop/hdfs/datanode # 格式化 NameNode仅首次运行重复执行会清空所有 HDFS 数据 /usr/local/hadoop/bin/hdfs namenode -format # 启动 HDFSNameNode DataNode /usr/local/hadoop/sbin/start-dfs.sh # 启动 YARNResourceManager NodeManager /usr/local/hadoop/sbin/start-yarn.sh验证命令执行jps应看到5 个进程NameNode、DataNode、ResourceManager、NodeManager、SecondaryNameNode。少于 5 个说明某个服务启动失败。此时不要重试先查日志NameNode 日志/usr/local/hadoop/logs/hadoop-*-namenode-*.logDataNode 日志/usr/local/hadoop/logs/hadoop-*-datanode-*.logResourceManager 日志/usr/local/hadoop/logs/yarn-*-resourcemanager-*.log重点看日志末尾的ERROR行而非WARN——很多WARN是正常提示如No KeyStore found但ERROR后紧跟java.net.BindException: Address already in use就意味着端口冲突。3. 编写、编译、打包 WordCount 程序Java 工程师的“Hello World”陷阱MapReduce 程序不是写完main()就能跑它必须满足 Hadoop 的类加载机制和依赖注入规则。网上大量教程用javac手动编译极易因-classpath漏掉hadoop-common.jar或hadoop-hdfs.jar导致ClassNotFoundException。我们采用 Maven 标准化构建确保依赖纯净。3.1 创建 Maven 工程结构用archetype:generate避免 pom.xml 手动填坑# 创建标准 Maven 目录结构 mvn archetype:generate \ -DgroupIdcom.example.hadoop \ -DartifactIdwordcount-demo \ -DarchetypeArtifactIdmaven-archetype-quickstart \ -DinteractiveModefalse cd wordcount-demo为什么不用mvn create projectarchetype:generate生成的pom.xml自带maven-compiler-plugin配置可显式指定 Java 版本避免 Maven 默认用 JDK 17 编译字节码。手动创建pom.xml易遗漏source和target导致hadoop jar报Unsupported major.minor version 61.0JDK 17 字节码。3.2 编写 WordCount Mapper 与 Reducer注意 Hadoop 3.x 的 API 变更Hadoop 3.x 废弃了org.apache.hadoop.mapred.*包旧 API强制使用org.apache.hadoop.mapreduce.*新 API。以下代码严格适配 3.3.6src/main/java/com/example/hadoop/WordCountMapper.javapackage com.example.hadoop; 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; import java.util.StringTokenizer; // 新 API继承 MapperKEYIN, VALUEIN, KEYOUT, VALUEOUT 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 line value.toString(); StringTokenizer tokenizer new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken().toLowerCase()); // 统一小写 context.write(word, one); } } }src/main/java/com/example/hadoop/WordCountReducer.javapackage com.example.hadoop; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; // 新 API继承 ReducerKEYIN, VALUEIN, KEYOUT, VALUEOUT 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); } }src/main/java/com/example/hadoop/WordCountDriver.javapackage com.example.hadoop; 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, ClassNotFoundException, InterruptedException { if (args.length ! 2) { System.err.println(Usage: WordCountDriver input path output path); System.exit(1); } Configuration conf new Configuration(); // 关键让 Job 读取 Hadoop 配置core-site.xml, hdfs-site.xml 等 conf.addResource(new Path(/usr/local/hadoop/etc/hadoop/core-site.xml)); conf.addResource(new Path(/usr/local/hadoop/etc/hadoop/hdfs-site.xml)); conf.addResource(new Path(/usr/local/hadoop/etc/hadoop/yarn-site.xml)); conf.addResource(new Path(/usr/local/hadoop/etc/hadoop/mapred-site.xml)); 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); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }逻辑说明conf.addResource()是关键。若省略Job 会使用默认配置fs.defaultFSfile:///导致FileInputFormat尝试从本地文件系统读取输入而非 HDFS。job.setJarByClass()指定包含主类的 JAR 包Hadoop 会自动将该 JAR 分发到所有 TaskTrackerYARN NodeManager。3.3 编写 pom.xml精准引入 Hadoop 3.3.6 依赖pom.xml必须声明hadoop-client作为 compile 依赖并排除传递依赖中的slf4j-log4j12与 Hadoop 自带的slf4j-simple冲突project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.example.hadoop/groupId artifactIdwordcount-demo/artifactId version1.0-SNAPSHOT/version properties maven.compiler.source11/maven.compiler.source maven.compiler.target11/maven.compiler.target hadoop.version3.3.6/hadoop.version /properties dependencies !-- Hadoop 客户端核心依赖 -- dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-client/artifactId version${hadoop.version}/version exclusions !-- 排除 log4j12避免与 Hadoop 自带 slf4j-simple 冲突 -- exclusion groupIdorg.slf4j/groupId artifactIdslf4j-log4j12/artifactId /exclusion /exclusions /dependency !-- JUnit 用于本地测试 -- dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.13.2/version scopetest/scope /dependency /dependencies build plugins !-- Maven Shade Plugin打包成 fat jar包含所有依赖 -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-shade-plugin/artifactId version3.4.1/version executions execution phasepackage/phase goals goalshade/goal /goals configuration transformers transformer implementationorg.apache.maven.plugins.shade.resource.ManifestResourceTransformer mainClasscom.example.hadoop.WordCountDriver/mainClass /transformer /transformers /configuration /execution /executions /plugin /plugins /build /project参数说明maven-shade-plugin生成的 fat jar含所有依赖是hadoop jar命令唯一接受的格式。若用maven-compiler-plugin只编译出 class 文件hadoop jar会报ClassNotFoundException因为 Hadoop 的 ClassLoader 不会自动加载lib/下的 jar。3.4 编译打包用mvn clean package -DskipTests生成可执行 JAR# 在 wordcount-demo/ 目录下执行 mvn clean package -DskipTests # 检查生成的 JAR 是否含主类关键 jar -tf target/wordcount-demo-1.0-SNAPSHOT.jar | grep WordCountDriver.class # 应输出com/example/hadoop/WordCountDriver.class # 检查 MANIFEST.MF 是否声明 Main-Class unzip -p target/wordcount-demo-1.0-SNAPSHOT.jar META-INF/MANIFEST.MF | grep Main-Class # 应输出Main-Class: com.example.hadoop.WordCountDriver为什么加-DskipTests本地单元测试如WordCountMapperTest需 mock Hadoop 环境而新手常因hadoop-minicluster版本不匹配导致mvn test失败。跳过测试可快速验证打包流程不影响hadoop jar运行。4. 在 HDFS 上运行 MapReduce 程序从上传输入文件到解读作业日志hadoop jar不是黑匣子——它本质是启动一个 YARN ApplicationMaster由 ResourceManager 分配 Container 执行 Mapper/Reducer。理解每一步的底层动作才能精准定位失败环节。4.1 准备 HDFS 输入数据用hadoop fs -put上传文本文件# 创建本地测试文件 echo -e hello world\nhello hadoop\nworld of hadoop /tmp/input.txt # 创建 HDFS 输入目录必须存在否则 FileInputFormat 报错 hadoop fs -mkdir -p /user/$USER/input # 上传文件到 HDFS注意hadoop fs 命令操作的是 HDFS不是本地磁盘 hadoop fs -put /tmp/input.txt /user/$USER/input/ # 验证上传成功 hadoop fs -ls /user/$USER/input/ # 应输出-rw-r--r-- 1 yourname supergroup 42 2024-06-15 10:20 /user/yourname/input/input.txt注意hadoop fs -put的第二个参数是 HDFS 路径不能以file://开头。若写hadoop fs -put /tmp/input.txt file:///user/$USER/input/Hadoop 会尝试创建本地文件file:///user/...导致No FileSystem for scheme: file错误。4.2 提交 MapReduce 作业hadoop jar命令的 5 个必传参数# 在 wordcount-demo/ 目录下执行 hadoop jar target/wordcount-demo-1.0-SNAPSHOT.jar \ com.example.hadoop.WordCountDriver \ /user/$USER/input \ /user/$USER/output命令拆解hadoop jarHadoop 提供的 JAR 执行器target/wordcount-demo-1.0-SNAPSHOT.jarMaven Shade 打包的 fat jarcom.example.hadoop.WordCountDriver主类全限定名必须与 MANIFEST.MF 中一致/user/$USER/inputHDFS 输入路径由FileInputFormat读取/user/$USER/outputHDFS 输出路径必须不存在否则报FileAlreadyExistsException4.3 实时监控作业状态从 YARN Web UI 到日志文件精确定位作业提交后终端会输出类似2024-06-15 10:25:30,123 INFO client.RMProxy: Connecting to ResourceManager at localhost/127.0.0.1:8032 2024-06-15 10:25:31,456 INFO mapreduce.JobSubmitter: number of splits:1 2024-06-15 10:25:32,789 INFO impl.YarnClientImpl: Submitted application application_1718432720123_0001此时打开浏览器访问http://localhost:8088YARN ResourceManager Web UI可看到作业状态。但 UI 信息有限真正排错必须查三类日志日志类型查看命令关键信息ApplicationMaster 日志yarn logs -applicationId application_1718432720123_0001显示 Driver 主类执行过程如ClassNotFoundException、NullPointerExceptionContainer 日志Mapperyarn logs -applicationId application_1718432720123_0001 -containerId container_1718432720123_0001_01_000001显示 Mapper 的map()方法执行细节如StringTokenizer分词异常NodeManager 本地日志cat /usr/local/hadoop/logs/yarn-*-nodemanager-*.log | grep -A 5 -B 5 ERROR显示 Container 启动失败原因如ExitCodeException exitCode1: /bin/bash: java: command not foundNodeManager 未找到 java排查技巧若yarn logs报Log aggregation has not completed说明日志尚未归集。此时直接查 NodeManager 本地日志更高效tail -100f /usr/local/hadoop/logs/yarn-*-nodemanager-*.log实时观察 Container 启动过程。4.4 验证输出结果用hadoop fs -cat查看 reducer 输出作业成功后HDFS 输出目录下会生成_SUCCESS文件和part-r-00000文件# 查看输出目录内容 hadoop fs -ls /user/$USER/output # 应输出-rw-r--r-- 1 yourname supergroup 0 2024-06-15 10:30 /user/yourname/output/_SUCCESS # -rw-r--r-- 1 yourname supergroup 36 2024-06-15 10:30 /user/yourname/output/part-r-00000 # 查看结果注意part-r-* 是文本文件可直接 cat hadoop fs -cat /user/$USER/output/part-r-00000 # 应输出 # hadoop 2 # hello 2 # of 1 # world 2为什么是part-r-00000而不是part-m-00000part-r-表示 Reducer 输出r reducerpart-m-是 Mapper 临时输出仅在 shuffle 阶段存在作业结束后自动清理。hadoop fs -cat只能读取最终输出文件。5. 伪分布式 Hadoop 运行 MapReduce 的 5 个高频避坑指南伪分布式环境的脆弱性远超想象——一个/etc/hosts的空格、一次hdfs namenode -format的误操作、甚至JAVA_HOME中多了一个斜杠都足以让hadoop jar卡在Connecting to ResourceManager。以下是我在实验室记录的 5 条血泪经验每条都对应真实报错和可复现的修复步骤。5.1 现象hadoop fs -ls /报No FileSystem for scheme: hdfs原因core-site.xml中fs.defaultFS的值与hadoop fs命令解析的 URI scheme 不匹配。常见错误包括fs.defaultFS写成hdfs://127.0.0.1:9000127.0.0.1与/etc/hosts中localhost解析不一致fs.defaultFS写成hdfs://0.0.0.0:9000NameNode 绑定0.0.0.0但客户端解析0.0.0.0失败core-site.xml文件名拼错如core-site.xml.bak解决检查/etc/hosts127.0.0.1 localhost必须存在且无多余空格运行hadoop classpath确认输出中包含/usr/local/hadoop/etc/hadoop/手动测试 URI 解析hadoop fs -ls hdfs://localhost:9000/显式指定 URI5.2 现象start-dfs.sh后jps看不到DataNodeNameNode 日志报java.net.ConnectException: Connection refused原因DataNode 无法连接 NameNode根本原因是hdfs-site.xml中dfs.namenode.name.dir或dfs.datanode.data.dir路径权限不足或路径不存在。解决执行ls -ld /usr/local/hadoop/hdfs/namenode /usr/local/hadoop/hdfs/datanode确认属主为当前用户若目录不存在手动创建mkdir -p /usr/local/hadoop/hdfs/{namenode,datanode}删除旧数据谨慎rm -rf /usr/local/hadoop/hdfs/*再重新hdfs namenode -format5.3 现象hadoop jar提交后YARN UI 显示ACCEPTED但长期不变成RUNNINGyarn node -list返回空原因NodeManager 未启动或启动后因内存不足被 YARN 杀死。Hadoop 3.3.6 默认yarn.nodemanager.resource.memory-mb81928GB而虚拟机仅分配 4GB 内存。解决编辑/usr/local/hadoop/etc/hadoop/yarn-site.xml添加property nameyarn.nodemanager.resource.memory-mb/name value2048/value /property property nameyarn.scheduler.minimum-allocation-mb/name value512/value /property重启 YARNstop-yarn.sh start-yarn.sh验证yarn node -list应显示RUNNING状态的 NodeManager5.4 现象hadoop jar报ClassNotFoundException: org.apache.hadoop.mapreduce.Job原因打包的 JAR 未包含 Hadoop 依赖或pom.xml中hadoop-client依赖范围错误如设为provided。解决检查 JAR 内容jar -tf target/wordcount-demo-1.0-SNAPSHOT.jar \| grep hadoop-mapreduce-client-core若无输出说明依赖未打入 JAR —— 确认pom.xml使用maven-shade-plugin且hadoop-client依赖未设scopeprovided/scope重新mvn clean package5.5 现象作业运行成功但hadoop fs -cat /user/$USER/output/part-r-00000输出为空文件大小为 0原因输入文件为空或 Mapper 未正确 emit key-value 对。常见于StringTokenizer对空行或特殊字符处理异常。解决检查输入文件hadoop fs -cat /user/$USER/input/input.txt在 Mapper 中添加调试日志需修改log4j.properties// 在 WordCountMapper.map() 开头添加 context.setStatus(Processing line: line); // status 会显示在 YARN UI System.err.println(DEBUG: line line ); // 输出到 stderr可在 Container 日志中查看重新打包运行查yarn logs -applicationId ...中的stderr输出6. 进阶验证用hadoop job -status和mapred job -history深挖作业元数据当 WordCount 跑通后别急着交实验报告——真正的工程师会用 Hadoop 自带工具验证作业的“分布式”属性是否真实生效。hadoop jar命令的返回值只是表象hadoop job -status和mapred job -history才能揭示任务调度、数据本地性、Shuffle 效率等深层指标。以下是我每次验证必做的三步操作它们帮你避开“看似运行、实则单机”的假成功陷阱。6.1 用hadoop job -status实时抓取作业的物理执行快照hadoop jar命令返回后作业 ID如application_1718432720123_0001会打印在终端。立即用hadoop job -status查询其详细状态p a hrefhttps://download.csdn.net/download/emmaing/85726730 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表