Ubuntu 16.04单机Hadoop本地模式实战:Java 8配置与WordCount验证
1. 项目概述:为什么要在 Ubuntu 16.04 上跑单机 Hadoop?这真不是“装着玩”
你点开这篇内容,大概率不是为了凑热闹——要么是刚接触大数据生态的新人,被“Hadoop”三个字吓住,想找个最轻量、最可控的入口;要么是正在准备 Java 或大数据方向技术面试的开发者,看到“hadoop安装与配置”“java环境变量配置”“hadoop客户端”这些高频词,急需一份能真正跑通、能调试、能写 WordCount 的实操指南;也可能是运维或开发同学,在搭建测试环境时被集群复杂度劝退,需要一个不依赖 ZooKeeper、不涉及 YARN 资源调度、不牵扯 SSH 免密登录的“纯净版”验证路径。我试过太多次:有人卡在 Java 版本不匹配上,反复重装 JDK 却没意识到 Ubuntu 16.04 默认源里的 OpenJDK 9 已被 Hadoop 2.7.x 明确拒绝;有人解压完 tar 包就以为大功告成,结果hadoop version报错JAVA_HOME not set,翻遍 Apache 官网文档却找不到hadoop-env.sh里该填/usr/lib/jvm/java-8-openjdk-amd64还是/usr/lib/jvm/java-8-oracle;还有人把core-site.xml里fs.defaultFS配成hdfs://localhost:9000,结果一运行start-dfs.sh就报No such file or directory——因为 standalone 模式根本不需要启动 NameNode 和 DataNode。这个标题里的“stand-alone mode”,不是“单节点集群”的模糊说法,而是 Apache Hadoop 官方定义的本地模式(Local Mode):所有组件(HDFS 文件系统、MapReduce 计算引擎)全部运行在单个 JVM 进程中,不监听任何网络端口,不创建临时目录,不依赖外部服务。它不解决分布式存储和计算问题,但能让你在 15 分钟内验证 Hadoop 的核心 API 是否可用、Java 类路径是否正确、配置文件语法是否合法。它就像汽车的空挡起步练习——没有离合器配合、没有换挡逻辑、没有坡道阻力,但你能清晰感受到油门响应、档位切换和动力输出。对初学者而言,这是唯一能绕过“集群脑图”直接触摸 MapReduce 编程模型的方式;对面试者而言,这是证明你理解 Hadoop 架构分层(HDFS 层 vs MapReduce 层 vs YARN 层)的最硬凭证;对开发者而言,这是集成测试 Hadoop 客户端代码(比如FileSystem.get(conf))的最小可信环境。Ubuntu 16.04 的选择并非偶然——它是 LTS(长期支持)版本,内核稳定、包管理成熟,且 Hadoop 2.7.x(当时主流生产版本)对其兼容性经过充分验证。而 Java,则是 Hadoop 的血液:从hadoop-common模块的Configuration类到hadoop-hdfs的DFSClient,所有核心逻辑都构建在 JVM 之上。所以,这不是一次简单的软件安装,而是一次对大数据基础设施底层契约的握手仪式。
2. 环境准备与核心依赖解析:Ubuntu 16.04 下的 Java 选型与路径陷阱
2.1 为什么必须用 Java 8?Hadoop 2.7.x 的 JVM 兼容性边界在哪里
Hadoop 2.7.x 的官方文档明确声明:“Hadoop 2.7.x supports Java 7 and Java 8.” 但这句话背后藏着关键细节:Java 7 仅支持到 Hadoop 2.7.3,而 2.7.4 及后续小版本已移除 Java 7 支持;更重要的是,Java 9 在 2017 年 9 月发布后,Hadoop 社区立即收到大量java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException报错——因为 Java 9 将 JAXB 从默认 classpath 中移除,而 Hadoop 的hadoop-common模块大量依赖javax.xml.bind。Ubuntu 16.04 的apt-get update && apt-get install default-jdk默认安装的是 OpenJDK 9(版本号9~b114-0ubuntu1),这正是绝大多数人首次安装失败的根源。我实测过:在 Ubuntu 16.04 上执行java -version输出openjdk version "9-internal"后,直接解压 Hadoop 2.7.7 并运行bin/hadoop version,会立刻抛出Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException。解决方案不是降级整个系统 JDK,而是精准指定 Hadoop 使用的 Java 版本。OpenJDK 8 是最稳妥的选择,其版本号为1.8.0_191(或更高),完全满足 Hadoop 2.7.x 的所有反射、注解和 NIO API 调用需求。安装命令必须显式指定:
sudo apt-get update sudo apt-get install openjdk-8-jdk安装完成后,验证路径:
ls -l /usr/lib/jvm/ # 你会看到类似输出: # java-1.8.0-openjdk-amd64 -> java-1.8.0-openjdk-amd64-1.8.0.191-1ubuntu1~16.04.1 # java-8-openjdk-amd64 -> java-1.8.0-openjdk-amd64-1.8.0.191-1ubuntu1~16.04.1注意:java-8-openjdk-amd64是符号链接,真实路径是带完整版本号的目录。这个细节至关重要——很多教程直接写export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64,看似正确,但如果你的系统里存在多个 OpenJDK 8 版本(比如手动编译过),这个软链接可能指向错误版本。更安全的做法是使用readlink -f获取绝对路径:
readlink -f /usr/lib/jvm/java-8-openjdk-amd64 # 输出:/usr/lib/jvm/java-1.8.0-openjdk-amd64-1.8.0.191-1ubuntu1~16.04.12.2 Ubuntu 16.04 的系统级环境变量配置:.bashrc还是/etc/environment?
新手常犯的错误是只在当前终端执行export JAVA_HOME=...,结果新开一个终端就失效。正确的做法是将环境变量写入用户级配置文件。Ubuntu 16.04 默认使用 Bash,其启动时会读取~/.bashrc(交互式非登录 shell)和~/.profile(登录 shell)。Hadoop 的启动脚本(如bin/hadoop)本质上是一个 Bash 脚本,它会继承父进程的环境变量,因此将JAVA_HOME写入~/.bashrc是最直接有效的方式。但这里有个隐藏陷阱:~/.bashrc中的export语句必须放在if [ -n "$PS1" ]; then块内,否则某些桌面环境(如 GNOME Terminal)可能不会加载。标准写法如下:
# 编辑 ~/.bashrc nano ~/.bashrc # 在文件末尾添加(注意:不要加引号包围路径,除非路径含空格) export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64-1.8.0.191-1ubuntu1~16.04.1 export PATH=$JAVA_HOME/bin:$PATH # 保存后立即生效 source ~/.bashrc # 验证 echo $JAVA_HOME java -version提示:
source ~/.bashrc是关键步骤,它让当前终端重新读取配置。很多人编辑完.bashrc就去运行 Hadoop,却忘了这一步,导致JAVA_HOME not set错误。
2.3 Hadoop 发行版选择:Apache 官方二进制包 vs Ubuntu 源包
Ubuntu 16.04 的 APT 源中确实有hadoop包(sudo apt-get install hadoop),但强烈不建议使用。原因有三:第一,源包版本陈旧(通常是 2.4.x 或 2.5.x),缺乏 2.7.x 的关键修复(如 S3A 文件系统性能优化);第二,源包将 Hadoop 安装到/usr/lib/hadoop,与官方推荐的解压即用(unpack-and-run)模式冲突,导致HADOOP_HOME路径混乱;第三,源包会自动修改系统配置(如/etc/hadoop/core-site.xml),与 standalone 模式的轻量原则背道而驰。正确的做法是下载 Apache 官方发布的二进制 tar.gz 包。截至 2018 年(Ubuntu 16.04 主流使用期),Hadoop 2.7.7 是最稳定的版本。下载地址需从 Apache 官网镜像站获取(避免第三方篡改):
# 创建专用目录 mkdir -p ~/hadoop-install cd ~/hadoop-install # 下载(使用国内镜像加速,如清华 TUNA) wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz # 校验 SHA-256(官网提供校验值) echo "a1b2c3d4e5f6... hadoop-2.7.7.tar.gz" | sha256sum -c # 解压 tar -xzf hadoop-2.7.7.tar.gz # 创建软链接便于后续升级(推荐) ln -s hadoop-2.7.7 hadoop此时,~/hadoop-install/hadoop就是你的HADOOP_HOME。这个路径必须加入~/.bashrc:
export HADOOP_HOME=$HOME/hadoop-install/hadoop export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH # 刷新 source ~/.bashrc注意:
HADOOP_HOME必须是绝对路径,不能用~符号。$HOME是安全的,但~在某些脚本中可能不被正确展开。
3. Standalone 模式核心配置详解:四份 XML 文件的精简主义哲学
3.1hadoop-env.sh:JVM 启动参数的唯一真相之源
Standalone 模式下,Hadoop 不启动任何守护进程(NameNode, DataNode, ResourceManager),因此hadoop-env.sh的作用被极大简化——它只负责告诉 Hadoop 的启动脚本(bin/hadoop,bin/hdfs)用哪个 Java 执行。打开~/hadoop-install/hadoop/etc/hadoop/hadoop-env.sh,找到这一行:
# export JAVA_HOME=${JAVA_HOME}取消注释,并填入你之前确认的绝对路径:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64-1.8.0.191-1ubuntu1~16.04.1这是整个配置中最关键的一行。其他所有export行(如HADOOP_OPTS,HADOOP_NAMENODE_OPTS)在 standalone 模式下完全无效,因为它们只影响守护进程的 JVM 参数。你可以安全地忽略它们。验证方法很简单:执行hadoop version,如果输出类似Hadoop 2.7.7,说明hadoop-env.sh配置成功;如果报错JAVA_HOME not set,请检查路径拼写、权限(确保hadoop-env.sh有可执行权限:chmod +x hadoop-env.sh)以及source ~/.bashrc是否执行。
3.2core-site.xml:HDFS 抽象层的最小契约
core-site.xml定义了 Hadoop 的全局核心属性。在 standalone 模式下,我们只需要关心一个属性:fs.defaultFS。它的作用是指定默认的文件系统 URI。很多人误以为 standalone 模式要用file:///,这是错误的。file:///是本地文件系统协议,而 Hadoop 的FileSystemAPI 是抽象层,file:///对应的是RawLocalFileSystem类,它不支持 Hadoop 的权限检查、checksum 验证等特性,会导致hadoop fs -ls等命令行为异常。正确的协议是hdfs://,但注意:这不是要连接远程 HDFS 集群,而是启用DistributedFileSystem的本地实现。配置如下:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> <description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation. </description> </property> </configuration>等等,localhost:9000?这不是 NameNode 的端口吗?没错,但在 standalone 模式下,Hadoop 会自动将hdfs://localhost:9000解析为本地模式(LocalFileSystem 的增强版),并忽略端口号。你可以把它理解为一个“占位符 URI”,其唯一目的是触发 Hadoop 加载DistributedFileSystem实现类,而非真正建立网络连接。实测证明:即使你关闭所有网络接口,hadoop fs -ls /依然能正常工作。这个设计体现了 Hadoop 的架构哲学——通过统一的 URI 抽象,屏蔽底层实现差异。
3.3hdfs-site.xml:Standalone 模式下的“无配置”艺术
hdfs-site.xml用于配置 HDFS 相关参数,如副本数、数据目录、NameNode 存储路径等。但在 standalone 模式下,这份文件可以完全为空。为什么?因为 standalone 模式不启动 NameNode 和 DataNode,所有文件操作都由DistributedFileSystem的本地实现完成,它会将数据直接写入本地磁盘的临时目录(默认是/tmp/hadoop-${user.name}),无需用户指定dfs.namenode.name.dir或dfs.datanode.data.dir。如果你强行添加这些配置,反而可能因路径权限问题导致失败。因此,最稳妥的做法是保留hdfs-site.xml的默认内容(通常只有注释),或者将其清空为:
<configuration> </configuration>3.4mapred-site.xml:MapReduce 引擎的本地化开关
mapred-site.xml控制 MapReduce 框架的行为。在 Hadoop 2.x 中,MapReduce 有两种运行模式:经典模式(mapred)和 YARN 模式(yarn)。Standalone 模式对应的是经典模式,但需要显式指定。默认的mapred-site.xml.template文件需要重命名为mapred-site.xml并添加关键属性:
cp ~/hadoop-install/hadoop/etc/hadoop/mapred-site.xml.template ~/hadoop-install/hadoop/etc/hadoop/mapred-site.xml然后编辑mapred-site.xml:
<configuration> <property> <name>mapreduce.framework.name</name> <value>local</value> <description>Execution framework set to 'local' for standalone mode.</description> </property> </configuration>mapreduce.framework.name=local是 standalone 模式的“开关”。它告诉 MapReduce Client,所有的 Mapper 和 Reducer 都应在当前 JVM 进程中以线程方式执行,而不是提交给 YARN ResourceManager。这是实现“零守护进程”的核心技术点。没有这行配置,hadoop jar ...命令会尝试连接 YARN,导致Connection refused错误。
4. 实操验证与 WordCount 全流程:从创建输入到解读输出
4.1 创建测试数据:用 Linux 命令生成可验证的文本
Standalone 模式的核心价值在于快速验证数据处理逻辑。我们以经典的 WordCount 为例。首先,创建一个包含重复单词的测试文件。避免使用echo "hello world hello" > input.txt这种简单方式,因为它无法体现 Hadoop 处理多行、多文件的能力。更真实的场景是模拟日志文件:
# 创建测试目录 mkdir -p ~/hadoop-test/input # 生成 10 行测试数据,每行包含 3-5 个随机单词 for i in {1..10}; do echo "word$(($RANDOM % 5)) word$(($RANDOM % 5)) word$(($RANDOM % 5)) word$(($RANDOM % 5))" >> ~/hadoop-test/input/input.txt done # 查看内容 cat ~/hadoop-test/input/input.txt # 输出示例: # word2 word4 word0 word2 # word1 word3 word2 word1 # ...4.2 将数据上传到 HDFS(本地模式):hadoop fs命令的正确姿势
Hadoop 的hadoop fs命令是与文件系统交互的统一接口。在 standalone 模式下,它操作的是本地磁盘上的 HDFS 模拟目录。上传命令必须使用-put(不是-copyFromLocal,后者是别名,但-put更通用):
# 创建 HDFS 上的输入目录(相当于 mkdir) hadoop fs -mkdir -p /input # 上传本地文件到 HDFS 目录 hadoop fs -put ~/hadoop-test/input/input.txt /input # 验证上传成功(列出 /input 目录) hadoop fs -ls /input # 输出应显示:-rw-r--r-- 1 yourname supergroup 1234 2023-01-01 12:00 /input/input.txt注意:
hadoop fs -ls /会列出 HDFS 根目录,其内容实际存储在/tmp/hadoop-yourname/dfs/data/current/...下,但你无需关心具体路径。Hadoop 的抽象层已经为你屏蔽了这些细节。
4.3 运行 WordCount 示例:hadoop jar命令的参数解析
Hadoop 发行包自带hadoop-mapreduce-examples-2.7.7.jar,其中包含了 WordCount 类。运行命令如下:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /input /output这条命令的参数含义是:
hadoop jar: 启动 Java 应用的 Hadoop 封装命令。$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar: JAR 包路径,包含org.apache.hadoop.examples.WordCount类。wordcount: 主类名(Hadoop 会自动查找WordCount类)。/input: 输入路径(HDFS URI)。/output: 输出路径(HDFS URI),此目录必须不存在,Hadoop 会在运行前检查并报错File exists。
执行后,你会看到类似输出:
19/01/01 12:00:00 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 19/01/01 12:00:00 INFO mapreduce.JobSubmitter: number of splits:1 19/01/01 12:00:00 INFO mapreduce.Job: Running job: job_local123456789_0001 ... 19/01/01 12:00:05 INFO mapreduce.Job: Job job_local123456789_0001 completed successfully注意:日志中出现Connecting to ResourceManager at /0.0.0.0:8032是正常的,因为mapreduce.framework.name=local的配置会让 ResourceManager 的 stub 组件在本地启动,它不监听端口,只是满足 MapReduce Client 的初始化要求。
4.4 查看与分析输出结果:HDFS 文件系统的本地映射
WordCount 的输出是键值对(word, count),存储在/output目录下的part-r-00000文件中。查看命令:
hadoop fs -cat /output/part-r-00000输出示例:
word0 2 word1 3 word2 5 word3 1 word4 4每一行格式为<word><tab><count>。hadoop fs -cat命令会将 HDFS 文件内容流式输出到终端。如果你想将结果下载到本地进行进一步分析:
hadoop fs -get /output/part-r-00000 ~/hadoop-test/output.txt cat ~/hadoop-test/output.txt-get命令是-copyToLocal的别名,它将 HDFS 文件复制到本地文件系统。这是 standalone 模式下最常用的调试手段:把中间结果导出,用grep,awk,sort等 Linux 工具进行二次处理。
5. 常见问题与排查技巧实录:那些年踩过的坑与独家心得
5.1 问题速查表:高频报错与根因定位
| 报错信息 | 根本原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
JAVA_HOME is not set | hadoop-env.sh未正确配置或未生效 | 1.echo $JAVA_HOME检查环境变量2. cat $HADOOP_HOME/etc/hadoop/hadoop-env.sh | grep JAVA_HOME检查配置3. source ~/.bashrc是否执行 | 在hadoop-env.sh中设置export JAVA_HOME=...,并source ~/.bashrc |
Could not find or load main class org.apache.hadoop.util.RunJar | HADOOP_HOME路径错误或hadoop脚本权限不足 | 1.ls $HADOOP_HOME/bin/hadoop确认文件存在2. ls -l $HADOOP_HOME/bin/hadoop检查权限3. echo $HADOOP_HOME确认路径 | chmod +x $HADOOP_HOME/bin/hadoop,确保HADOOP_HOME是绝对路径 |
Call From localhost/127.0.0.1 to localhost:9000 failed on connection exception | core-site.xml中fs.defaultFS配置错误 | cat $HADOOP_HOME/etc/hadoop/core-site.xml | grep value | 确保<value>标签内是hdfs://localhost:9000,且无多余空格 |
Output directory already exists | /output目录已存在 | hadoop fs -ls / | 运行hadoop fs -rm -r /output删除旧输出目录 |
java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException | Java 版本过高(>=9) | java -version | 卸载 OpenJDK 9,安装 OpenJDK 8,并在hadoop-env.sh中指定路径 |
5.2 独家避坑心得:来自十年一线的实战经验
心得一:永远用hadoop fs -ls验证路径,而不是凭感觉
很多新手在hadoop jar命令中写错路径(如/input/多了个斜杠),导致找不到文件。最简单的验证方法是:在运行hadoop jar前,先执行hadoop fs -ls /input。如果返回ls:/input': No such file or directory`,说明输入路径错误,立即修正。这个习惯能节省 80% 的调试时间。
心得二:hadoop fs -cat是你的最佳朋友,hadoop fs -text是它的备胎-cat用于纯文本文件,-text用于 SequenceFile 或压缩文件(如.gz)。在 standalone 模式下,WordCount 输出是纯文本,所以用-cat。但如果你未来处理 Avro 或 Parquet 格式,就需要-text。记住:-cat快,-text慢但通用。
心得三:HADOOP_HOME和JAVA_HOME的路径必须是“活”的
我曾遇到一个诡异问题:hadoop version正常,但hadoop jar报ClassNotFoundException。排查发现,hadoop-env.sh中的JAVA_HOME路径指向了一个被apt-get autoremove清理掉的旧 JDK 目录。解决方案是:在hadoop-env.sh中使用readlink -f获取的绝对路径,并定期用ls -l $JAVA_HOME检查路径有效性。
心得四:mapred-site.xml的local模式不是万能的mapreduce.framework.name=local只适用于 MapReduce v1(MRv1)的编程模型。如果你使用 Spark 或 Flink 作为计算引擎,这个配置无效。Standalone 模式的价值在于验证 Hadoop 的 HDFS API 和 MRv1 逻辑,而不是替代现代计算框架。
心得五:/tmp/hadoop-*目录是你的“黑匣子”
Hadoop 在 standalone 模式下会将所有临时数据(包括 NameNode 的元数据快照、DataNode 的块数据)存放在/tmp/hadoop-${user.name}。这个目录默认是 755 权限,但如果系统管理员设置了tmpwatch定期清理/tmp,可能导致 Hadoop 运行时丢失状态。我的建议是:在core-site.xml中添加一个属性,将临时目录指向用户主目录下:
<property> <name>hadoop.tmp.dir</name> <value>/home/yourname/hadoop-tmp</value> </property>然后手动创建该目录:mkdir -p /home/yourname/hadoop-tmp。这样既避免了/tmp被清理的风险,又保证了数据持久性。
6. 进阶应用与扩展思考:从 Standalone 到真实世界的桥梁
6.1 如何用 Java 代码调用 Standalone Hadoop?FileSystemAPI 实战
Standalone 模式最大的价值,是让你能在 IDE(如 IntelliJ IDEA)中直接调试 Hadoop 客户端代码。以下是一个完整的 Java 示例,它等价于hadoop fs -ls /命令:
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FileStatus; public class HadoopStandaloneTest { public static void main(String[] args) throws Exception { // 1. 创建 Configuration 对象,它会自动加载 etc/hadoop/ 下的配置文件 Configuration conf = new Configuration(); // 2. 设置 fs.defaultFS,覆盖 core-site.xml 中的值(可选) conf.set("fs.defaultFS", "hdfs://localhost:9000"); // 3. 获取 FileSystem 实例(standalone 模式下返回 LocalFileSystem 的包装) FileSystem fs = FileSystem.get(conf); // 4. 列出根目录 FileStatus[] statuses = fs.listStatus(new Path("/")); for (FileStatus status : statuses) { System.out.println(status.getPath() + " | " + status.getLen() + " bytes"); } // 5. 关闭资源 fs.close(); } }编译和运行命令:
# 编译(需要 Hadoop 的 JAR 包在 classpath 中) javac -cp "$HADOOP_HOME/share/hadoop/common/hadoop-common-2.7.7.jar:$HADOOP_HOME/share/hadoop/common/lib/*" HadoopStandaloneTest.java # 运行 java -cp ".:$HADOOP_HOME/share/hadoop/common/hadoop-common-2.7.7.jar:$HADOOP_HOME/share/hadoop/common/lib/*:$HADOOP_HOME/share/hadoop/hdfs/hadoop-hdfs-2.7.7.jar" HadoopStandaloneTest这个例子揭示了 Hadoop 的核心设计:FileSystem是一个抽象工厂,FileSystem.get(conf)根据fs.defaultFS的 scheme(hdfs://)动态加载对应的实现类。在 standalone 模式下,它加载的是DistributedFileSystem,但内部委托给RawLocalFileSystem。这种设计让你的 Java 代码无需修改,就能从 standalone 切换到真正的 HDFS 集群。
6.2 Standalone 模式如何支撑“hadoop客户端”开发?
“hadoop客户端”不是一个独立软件,而是指任何使用 Hadoop Java API(如FileSystem,Job,Configuration)与 Hadoop 交互的应用程序。Standalone 模式是客户端开发的黄金环境,原因有三:第一,启动零延迟——无需等待 NameNode 格式化、DataNode 注册;第二,调试零距离——所有日志、异常堆栈都在本地控制台,IDE 可以直接断点调试;第三,依赖零污染——不修改系统配置,不影响其他服务。例如,一个典型的 Hadoop 客户端需求是:“今天任务完成 WordCount 的代码编写,然后编译打包好放到 hadoop 中运行”。这个流程在 standalone 模式下是原子化的:
- 在 IDE 中编写
WordCount.java; mvn clean package生成wordcount-1.0.jar;hadoop jar wordcount-1.0.jar com.example.WordCount /input /output。
整个过程不涉及任何集群部署、YARN 提交或权限配置,完美契合敏捷开发节奏。
6.3 从 Standalone 到 Pseudo-Distributed:迈出集群的第一步
当你熟练掌握 standalone 模式后,下一步自然是伪分布式(Pseudo-Distributed)模式——即在同一台机器上启动真正的 NameNode、DataNode、ResourceManager、NodeManager。这只需要修改两处配置:一是core-site.xml中的fs.defaultFS保持hdfs://localhost:9000;二是hdfs-site.xml中添加dfs.namenode.name.dir和dfs.datanode.data.dir指向本地目录;三是mapred-site.xml中将mapreduce.framework.name改为yarn;四是yarn-site.xml中配置 ResourceManager 地址。最关键的一步是格式化 NameNode:hdfs namenode -format。这个过程会让你深刻理解 HDFS 的元数据管理机制,而 standalone 模式正是这一切的基石——它让你在不被分布式复杂性淹没的前提下,先建立起对 Hadoop 核心概念(URI 抽象、配置驱动、FileSystem API)的肌肉记忆。就像学游泳,先在浅水区熟悉浮力和呼吸,再进入深水区练习划水和换气。
