<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>分布式 on 蛋蛋忧桑</title><link>https://dandansad.com/tags/%E5%88%86%E5%B8%83%E5%BC%8F/</link><description>Recent content in 分布式 on 蛋蛋忧桑</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Sat, 07 Jun 2025 01:05:58 +0800</lastBuildDate><atom:link href="https://dandansad.com/tags/%E5%88%86%E5%B8%83%E5%BC%8F/index.xml" rel="self" type="application/rss+xml"/><item><title>MapReduce工作原理及基础编程</title><link>https://dandansad.com/2025/06/07/mapreduce%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%9F%BA%E7%A1%80%E7%BC%96%E7%A8%8B/</link><pubDate>Sat, 07 Jun 2025 01:05:58 +0800</pubDate><guid>https://dandansad.com/2025/06/07/mapreduce%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%9F%BA%E7%A1%80%E7%BC%96%E7%A8%8B/</guid><description>&lt;h2 id="概念介绍"&gt;&lt;a href="#%e6%a6%82%e5%bf%b5%e4%bb%8b%e7%bb%8d" class="header-anchor"&gt;&lt;/a&gt;概念介绍
&lt;/h2&gt;&lt;p&gt;MapReduce 是一种用于处理和生成大规模数据集的编程模型。&lt;/p&gt;
&lt;p&gt;它将整个计算过程分为两个核心阶段：&lt;strong&gt;Map（映射）&lt;/strong&gt; 和 &lt;strong&gt;Reduce（归并）&lt;/strong&gt;。在 Map 阶段，数据被分成小块并并行处理，提取出中间的键值对结果；在 Reduce 阶段，框架会将所有具有相同键的数据聚合起来，由用户定义的逻辑进行归并处理，最终输出结果。&lt;/p&gt;
&lt;p&gt;MapReduce 的核心优势是：&lt;strong&gt;可扩展性强、适合大数据分布式处理、编程模型简单，框架自动负责数据的调度与容错。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通俗地说，它就像是一条流水线：先把原料（大数据）切碎并加工（Map），然后将相同类型的零件集中起来装配成品（Reduce）。&lt;/p&gt;
&lt;h2 id="执行流程"&gt;&lt;a href="#%e6%89%a7%e8%a1%8c%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;执行流程
&lt;/h2&gt;&lt;p&gt;实际上MapReduce有三个阶段：Map（映射）、Shuffle（派发）、Reduce（规约）。&lt;/p&gt;
&lt;p&gt;在 &lt;strong&gt;Map 阶段&lt;/strong&gt;，每条输入数据（通常是一行文本）被送入用户自定义的 &lt;code&gt;Mapper&lt;/code&gt; 类中进行处理。开发者在这个阶段编写逻辑，将每条原始数据“映射”为一组中间键值对（key-value），例如统计词频时，把一句话拆分成每个词，并赋予每个词一个初始计数（如 key 为单词，value 为 1）。这些中间结果不会立即输出，而是会经过分区、排序和归组。&lt;/p&gt;
&lt;p&gt;接下来是 &lt;strong&gt;Shuffle 阶段&lt;/strong&gt;，这是 &lt;strong&gt;MapReduce 框架自动完成&lt;/strong&gt;的核心过程。框架会将所有 &lt;code&gt;Mapper&lt;/code&gt; 输出的 key 按照值进行聚合，也就是说，把所有具有相同 key 的记录集中在一起，并将它们分发给相应的 &lt;code&gt;Reducer&lt;/code&gt;。这个阶段还涉及网络传输（跨节点数据移动）、排序（对 key 进行字典序排列）以及归组（将相同 key 的 value 组成集合），是整个 MapReduce 中性能和资源消耗最多的一部分。&lt;/p&gt;
&lt;p&gt;最后是 &lt;strong&gt;Reduce 阶段&lt;/strong&gt;，所有已经被聚合并排序好的数据会输入到开发者自定义的 &lt;code&gt;Reducer&lt;/code&gt; 中。Reducer 接收的是某一个 key 以及与它相关联的所有 value 列表，开发者在这个阶段编写聚合逻辑，如累加、求平均、取最大值等。处理后的结果会以最终输出的形式写入 HDFS 或本地文件系统，形成最终的数据处理结果。&lt;/p&gt;
&lt;p&gt;所以说，根据以上叙述我们可以得知：在实际的编程中，我们要做的就是编写Map和Reduce操作的代码。同时我们也可以理解到，Map的处理过程应当是&lt;code&gt;(行号, 一行文本)&lt;/code&gt; → &lt;code&gt;(key, value)&lt;/code&gt;；Reduce的处理过程应当是&lt;code&gt;(key, values)&lt;/code&gt; → &lt;code&gt;(key, value)&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="编程思想"&gt;&lt;a href="#%e7%bc%96%e7%a8%8b%e6%80%9d%e6%83%b3" class="header-anchor"&gt;&lt;/a&gt;编程思想
&lt;/h2&gt;&lt;p&gt;在编写相关Java代码时，我认为最重要的就是理清楚输入输出类型和输入到输出的处理过程，也即&lt;code&gt;(行号, 一行文本)&lt;/code&gt; 是怎么变到 &lt;code&gt;(key, value)&lt;/code&gt;的，&lt;code&gt;(key, values)&lt;/code&gt; 又是怎么变到 &lt;code&gt;(key, value)&lt;/code&gt;的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;标准Mapper类&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.apache.hadoop.io.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.apache.hadoop.mapreduce.Mapper;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.io.IOException;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyMapper&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; Mapper {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Text outKey &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Text();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; IntWritable outValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IntWritable();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;protected&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(LongWritable key, Text value, Context context)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; IOException, InterruptedException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 1. 读取一行文本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String line &lt;span style="color:#f92672"&gt;=&lt;/span&gt; value.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 2. 分割字段（假设是以逗号分隔的 CSV）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; fields &lt;span style="color:#f92672"&gt;=&lt;/span&gt; line.&lt;span style="color:#a6e22e"&gt;split&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 3. 做简单校验&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (fields.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; 2) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String someKey &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fields&lt;span style="color:#f92672"&gt;[&lt;/span&gt;0&lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 例如：用户ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; someValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Integer.&lt;span style="color:#a6e22e"&gt;parseInt&lt;/span&gt;(fields&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 例如：交易金额&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 4. 设置输出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; outKey.&lt;span style="color:#a6e22e"&gt;set&lt;/span&gt;(someKey);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; outValue.&lt;span style="color:#a6e22e"&gt;set&lt;/span&gt;(someValue);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 5. 输出 key-value 对&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context.&lt;span style="color:#a6e22e"&gt;write&lt;/span&gt;(outKey, outValue);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;标准Reducer类&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.apache.hadoop.io.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.apache.hadoop.mapreduce.Reducer;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.io.IOException;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyReducer&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; Reducer {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; IntWritable result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IntWritable();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;protected&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;reduce&lt;/span&gt;(Text key, Iterable values, Context context)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; IOException, InterruptedException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; sum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (IntWritable val : values) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sum &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; val.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// 累加所有值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result.&lt;span style="color:#a6e22e"&gt;set&lt;/span&gt;(sum);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context.&lt;span style="color:#a6e22e"&gt;write&lt;/span&gt;(key, result); &lt;span style="color:#75715e"&gt;// 输出结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;标准Driver类&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.apache.hadoop.conf.Configuration;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.apache.hadoop.fs.Path;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.apache.hadoop.io.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.apache.hadoop.mapreduce.Job;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.apache.hadoop.mapreduce.lib.input.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.apache.hadoop.mapreduce.lib.output.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyDriver&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; Exception {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (args.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; 2) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Usage: MyDriver &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;exit&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Configuration conf &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Configuration();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Job job &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Job.&lt;span style="color:#a6e22e"&gt;getInstance&lt;/span&gt;(conf, &lt;span style="color:#e6db74"&gt;&amp;#34;My MapReduce Job&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; job.&lt;span style="color:#a6e22e"&gt;setJarByClass&lt;/span&gt;(MyDriver.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; job.&lt;span style="color:#a6e22e"&gt;setMapperClass&lt;/span&gt;(MyMapper.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; job.&lt;span style="color:#a6e22e"&gt;setReducerClass&lt;/span&gt;(MyReducer.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; job.&lt;span style="color:#a6e22e"&gt;setMapOutputKeyClass&lt;/span&gt;(Text.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; job.&lt;span style="color:#a6e22e"&gt;setMapOutputValueClass&lt;/span&gt;(IntWritable.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; job.&lt;span style="color:#a6e22e"&gt;setOutputKeyClass&lt;/span&gt;(Text.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; job.&lt;span style="color:#a6e22e"&gt;setOutputValueClass&lt;/span&gt;(IntWritable.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FileInputFormat.&lt;span style="color:#a6e22e"&gt;addInputPath&lt;/span&gt;(job, &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Path(args&lt;span style="color:#f92672"&gt;[&lt;/span&gt;0&lt;span style="color:#f92672"&gt;]&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FileOutputFormat.&lt;span style="color:#a6e22e"&gt;setOutputPath&lt;/span&gt;(job, &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Path(args&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;exit&lt;/span&gt;(job.&lt;span style="color:#a6e22e"&gt;waitForCompletion&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;) &lt;span style="color:#f92672"&gt;?&lt;/span&gt; 0 : 1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实际上，按照以上标准代码，我们需要做的就是修改&lt;strong&gt;输入输出的Key/Value类型&lt;/strong&gt;和&lt;strong&gt;数据处理逻辑&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="常见的输入和输出-keyvalue-类型"&gt;&lt;a href="#%e5%b8%b8%e8%a7%81%e7%9a%84%e8%be%93%e5%85%a5%e5%92%8c%e8%be%93%e5%87%ba-keyvalue-%e7%b1%bb%e5%9e%8b" class="header-anchor"&gt;&lt;/a&gt;常见的输入和输出 Key/Value 类型
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;类型&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;用途示例&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;LongWritable&lt;/td&gt;
					&lt;td&gt;长整型（64位）&lt;/td&gt;
					&lt;td&gt;输入 key，通常表示文本行的字节偏移量（offset）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;IntWritable&lt;/td&gt;
					&lt;td&gt;整型（32位）&lt;/td&gt;
					&lt;td&gt;常用于输出 value，如计数、数值统计&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Text&lt;/td&gt;
					&lt;td&gt;字符串类型，Hadoop自带字符串类型&lt;/td&gt;
					&lt;td&gt;输入或输出的 key/value，多用于字符串数据&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DoubleWritable&lt;/td&gt;
					&lt;td&gt;双精度浮点型&lt;/td&gt;
					&lt;td&gt;处理小数值，如评分、权重等&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;FloatWritable&lt;/td&gt;
					&lt;td&gt;单精度浮点型&lt;/td&gt;
					&lt;td&gt;同上，较少用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BooleanWritable&lt;/td&gt;
					&lt;td&gt;布尔型&lt;/td&gt;
					&lt;td&gt;标记型字段&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;NullWritable&lt;/td&gt;
					&lt;td&gt;空值类型&lt;/td&gt;
					&lt;td&gt;不输出 key 或 value 时用，比如只输出 key&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Hadoop配置——两个节点（master和slave1）</title><link>https://dandansad.com/2025/05/29/hadoop%E9%85%8D%E7%BD%AE-%E4%B8%A4%E4%B8%AA%E8%8A%82%E7%82%B9master%E5%92%8Cslave1/</link><pubDate>Thu, 29 May 2025 14:42:14 +0800</pubDate><guid>https://dandansad.com/2025/05/29/hadoop%E9%85%8D%E7%BD%AE-%E4%B8%A4%E4%B8%AA%E8%8A%82%E7%82%B9master%E5%92%8Cslave1/</guid><description>&lt;h2 id="配置要求"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae%e8%a6%81%e6%b1%82" class="header-anchor"&gt;&lt;/a&gt;配置要求
&lt;/h2&gt;&lt;p&gt;目标是配置一个基本的 Hadoop 分布式集群：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一台主节点：&lt;code&gt;master&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一台从节点：&lt;code&gt;slave1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持：HDFS + YARN&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 已配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hadoop 已安装成功，路径在 &lt;code&gt;/opt/hadoop&lt;/code&gt;（你可替换为实际路径）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用 &lt;code&gt;hadoop version&lt;/code&gt; 命令测试&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注：前置参考资料在文末，建议先按照前置参考资料进行安装配置到 &lt;code&gt;hadoop version&lt;/code&gt; 命令成功执行步骤，再继续参照本文章。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="修改hostshostname"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9hostshostname" class="header-anchor"&gt;&lt;/a&gt;修改hosts、hostname
&lt;/h2&gt;&lt;p&gt;hosts: /etc/hosts
集群所有主机IP地址与对应主机名
格式：IP（空）主机名&lt;/p&gt;
&lt;p&gt;hostname: /etc/hostname
主节点命名为master，子节点命名为slave1
把主机名直接写入此文件（只能保留一个名字），定义本机的主机名（可能需要重启生效）
使用 &lt;code&gt;sudo hostnamectl set-hostname 新主机名&lt;/code&gt; 设置（即时生效）
使用 &lt;code&gt;hostname&lt;/code&gt; 命令查看当前主机名&lt;/p&gt;
&lt;h2 id="ssh-配置免密"&gt;&lt;a href="#ssh-%e9%85%8d%e7%bd%ae%e5%85%8d%e5%af%86" class="header-anchor"&gt;&lt;/a&gt;SSH 配置免密
&lt;/h2&gt;&lt;h4 id="1-生成-ssh-密钥对如果尚未生成"&gt;&lt;a href="#1-%e7%94%9f%e6%88%90-ssh-%e5%af%86%e9%92%a5%e5%af%b9%e5%a6%82%e6%9e%9c%e5%b0%9a%e6%9c%aa%e7%94%9f%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;1. 生成 SSH 密钥对&lt;/strong&gt;（如果尚未生成）
&lt;/h4&gt;&lt;p&gt;在每台机器上执行：&lt;code&gt;ssh-keygen -t rsa&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;一路回车即可（不要设置密码短语）。&lt;/p&gt;
&lt;h4 id="2-将自己的公钥添加到目标机器的-authorized_"&gt;&lt;a href="#2-%e5%b0%86%e8%87%aa%e5%b7%b1%e7%9a%84%e5%85%ac%e9%92%a5%e6%b7%bb%e5%8a%a0%e5%88%b0%e7%9b%ae%e6%a0%87%e6%9c%ba%e5%99%a8%e7%9a%84-authorized_" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;2. 将自己的公钥添加到目标机器的 authorized_keys 中&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;在 &lt;code&gt;master&lt;/code&gt; 上执行以下命令，把自己的公钥发给 &lt;code&gt;slave1&lt;/code&gt; ：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-copy-id root@localhost
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-copy-id root@slave1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同理，在 &lt;code&gt;slave1&lt;/code&gt; 上执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-copy-id root@localhost
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-copy-id root@master
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从每台机器尝试 ssh 到其他机器（包括自己）进行验证：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh root@localhost
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh root@master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh root@slave1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="配置hadoop的配置文件"&gt;&lt;a href="#%e9%85%8d%e7%bd%aehadoop%e7%9a%84%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;配置Hadoop的配置文件
&lt;/h2&gt;&lt;h3 id="1-core-sitexml"&gt;&lt;a href="#1-core-sitexml" class="header-anchor"&gt;&lt;/a&gt;1. core-site.xml
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hadoop.tmp.dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file:/opt/hadoop/tmp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; location to store temporary files
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fs.defaultFS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hdfs://master:9000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-hdfs-sitexml"&gt;&lt;a href="#2-hdfs-sitexml" class="header-anchor"&gt;&lt;/a&gt;2. hdfs-site.xml
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dfs.replication
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dfs.namenode.name.dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file:/opt/hadoop/tmp/dfs/name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dfs.datanode.data.dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file:/opt/hadoop/tmp/dfs/data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-mapred-sitexml"&gt;&lt;a href="#3-mapred-sitexml" class="header-anchor"&gt;&lt;/a&gt;3. mapred-site.xml
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mapreduce.framework.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yarn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yarn.app.mapreduce.am.env
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; HADOOP_MAPRED_HOME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/opt/hadoop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mapreduce.map.env
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; HADOOP_MAPRED_HOME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/opt/hadoop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mapreduce.reduce.env
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; HADOOP_MAPRED_HOME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/opt/hadoop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-yarn-sitexml"&gt;&lt;a href="#4-yarn-sitexml" class="header-anchor"&gt;&lt;/a&gt;4. yarn-site.xml
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yarn.resourcemanager.hostname
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yarn.nodemanager.aux-services
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mapreduce_shuffle
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-workers以前叫-slaves"&gt;&lt;a href="#5-workers%e4%bb%a5%e5%89%8d%e5%8f%ab-slaves" class="header-anchor"&gt;&lt;/a&gt;5. workers（以前叫 slaves）
&lt;/h3&gt;&lt;p&gt;列出所有的从节点（一个 hostname 一行）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;slave1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="复制配置文件"&gt;&lt;a href="#%e5%a4%8d%e5%88%b6%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;复制配置文件
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scp -r /opt/hadoop/etc/hadoop/ root@slave1:/opt/hadoop/etc/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="启动-hadoop"&gt;&lt;a href="#%e5%90%af%e5%8a%a8-hadoop" class="header-anchor"&gt;&lt;/a&gt;启动 Hadoop
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs namenode -format
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;start-dfs.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;start-yarn.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="验证是否成功"&gt;&lt;a href="#%e9%aa%8c%e8%af%81%e6%98%af%e5%90%a6%e6%88%90%e5%8a%9f" class="header-anchor"&gt;&lt;/a&gt;验证是否成功
&lt;/h2&gt;&lt;p&gt;在 master 和 slave1 分别运行：&lt;code&gt;jps &lt;/code&gt;你应该看到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;master&lt;/strong&gt; 节点有：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;NameNode&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;SecondaryNameNode&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ResourceManager&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;slave1&lt;/strong&gt; 节点有：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;DataNode&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;NodeManager&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="../../images/2025/05/image-5.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="../../images/2025/05/image-6.png"&gt;&lt;/p&gt;
&lt;p&gt;然后运行以下命令进行测试，检查是否有问题：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs dfs -ls /
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs dfs -mkdir /testdir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs dfs -ls /
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;Hello Hadoop&amp;#34;&lt;/span&gt; &amp;gt; hello.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs dfs -put hello.txt /testdir/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs dfs -ls /testdir/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs dfs -cat /testdir/hello.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs dfs -get /testdir/hello.txt ./hello_from_hdfs.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs dfs -rm /testdir/hello.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs dfs -rmdir /testdir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdfs dfsadmin -report
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;如果出现问题请先检查防火墙是否开放相应端口。&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 开放端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; p in &lt;span style="color:#ae81ff"&gt;9000&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9870&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;50010..50020&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50075&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8088&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8042&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9864&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9866&lt;/span&gt; 9867; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; firewall-cmd --permanent --add-port&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;p&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;/tcp; &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; firewall-cmd --reload
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 关闭端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; p in &lt;span style="color:#ae81ff"&gt;9000&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9870&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;50010..50020&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50075&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8088&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8042&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9864&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9866&lt;/span&gt; 9867; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; firewall-cmd --permanent --remove-port&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;p&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;/tcp; &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; firewall-cmd --reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意：经过后期实践，发现以上端口没有涵盖Hadoop的所有所需开放端口，最方便的解决方法是暂时关闭防火墙。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="前置参考资料"&gt;&lt;a href="#%e5%89%8d%e7%bd%ae%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;前置参考资料
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://dandansad.com/2025/05/22/%e5%ae%89%e8%a3%85hadoop/" target="_blank" rel="noopener"
 &gt;https://dandansad.com/2025/05/22/%e5%ae%89%e8%a3%85hadoop/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>安装Hadoop</title><link>https://dandansad.com/2025/05/22/%E5%AE%89%E8%A3%85hadoop/</link><pubDate>Thu, 22 May 2025 14:40:19 +0800</pubDate><guid>https://dandansad.com/2025/05/22/%E5%AE%89%E8%A3%85hadoop/</guid><description>&lt;p&gt;&lt;strong&gt;注意：Hadoop（尤其是 3.x 及以下版本）不兼容 Java 9+ 的模块系统，如果之前安装了 Java 的更高版本，则需要重新安装更低版本进行配置。&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id="安装jdk"&gt;&lt;a href="#%e5%ae%89%e8%a3%85jdk" class="header-anchor"&gt;&lt;/a&gt;安装JDK
&lt;/h1&gt;&lt;h2 id="1下载jdk18安装包"&gt;&lt;a href="#1%e4%b8%8b%e8%bd%bdjdk18%e5%ae%89%e8%a3%85%e5%8c%85" class="header-anchor"&gt;&lt;/a&gt;1.下载JDK1.8安装包
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget --no-check-certificate https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2解压下载的jdk18安装包"&gt;&lt;a href="#2%e8%a7%a3%e5%8e%8b%e4%b8%8b%e8%bd%bd%e7%9a%84jdk18%e5%ae%89%e8%a3%85%e5%8c%85" class="header-anchor"&gt;&lt;/a&gt;2.解压下载的JDK1.8安装包
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -zxvf jdk-8u151-linux-x64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3移动并重命名jdk包"&gt;&lt;a href="#3%e7%a7%bb%e5%8a%a8%e5%b9%b6%e9%87%8d%e5%91%bd%e5%90%8djdk%e5%8c%85" class="header-anchor"&gt;&lt;/a&gt;3.移动并重命名JDK包
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mv jdk1.8.0_151/ /usr/java8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4配置java环境变量如果说不想修改原有使用的java版本可以跳过"&gt;&lt;a href="#4%e9%85%8d%e7%bd%aejava%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f%e5%a6%82%e6%9e%9c%e8%af%b4%e4%b8%8d%e6%83%b3%e4%bf%ae%e6%94%b9%e5%8e%9f%e6%9c%89%e4%bd%bf%e7%94%a8%e7%9a%84java%e7%89%88%e6%9c%ac%e5%8f%af%e4%bb%a5%e8%b7%b3%e8%bf%87" class="header-anchor"&gt;&lt;/a&gt;4.配置Java环境变量（如果说不想修改原有使用的Java版本，可以跳过）
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#39;export JAVA_HOME=/usr/java8&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#39;export PATH=$PATH:$JAVA_HOME/bin&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="5查看java是否成功安装"&gt;&lt;a href="#5%e6%9f%a5%e7%9c%8bjava%e6%98%af%e5%90%a6%e6%88%90%e5%8a%9f%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;5.查看Java是否成功安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java -version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="安装hadoop"&gt;&lt;a href="#%e5%ae%89%e8%a3%85hadoop" class="header-anchor"&gt;&lt;/a&gt;安装Hadoop
&lt;/h1&gt;&lt;h2 id="1下载hadoop安装包"&gt;&lt;a href="#1%e4%b8%8b%e8%bd%bdhadoop%e5%ae%89%e8%a3%85%e5%8c%85" class="header-anchor"&gt;&lt;/a&gt;1.下载Hadoop安装包
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget --no-check-certificate https://repo.huaweicloud.com/apache/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2解压hadoop安装包至opthadoop"&gt;&lt;a href="#2%e8%a7%a3%e5%8e%8bhadoop%e5%ae%89%e8%a3%85%e5%8c%85%e8%87%b3opthadoop" class="header-anchor"&gt;&lt;/a&gt;2.解压Hadoop安装包至/opt/hadoop
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -zxvf hadoop-3.1.3.tar.gz -C /opt/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mv /opt/hadoop-3.1.3 /opt/hadoop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3配置hadoop环境变量"&gt;&lt;a href="#3%e9%85%8d%e7%bd%aehadoop%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f" class="header-anchor"&gt;&lt;/a&gt;3.配置Hadoop环境变量
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#39;export HADOOP_HOME=/opt/hadoop/&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#39;export PATH=$PATH:$HADOOP_HOME/bin&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#39;export PATH=$PATH:$HADOOP_HOME/sbin&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4修改配置文件yarn-envsh和hadoop-envsh"&gt;&lt;a href="#4%e4%bf%ae%e6%94%b9%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6yarn-envsh%e5%92%8chadoop-envsh" class="header-anchor"&gt;&lt;/a&gt;4.修改配置文件yarn-env.sh和hadoop-env.sh
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;export JAVA_HOME=/usr/java8&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /opt/hadoop/etc/hadoop/yarn-env.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;export JAVA_HOME=/usr/java8&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /opt/hadoop/etc/hadoop/hadoop-env.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="5测试hadoop是否安装成功"&gt;&lt;a href="#5%e6%b5%8b%e8%af%95hadoop%e6%98%af%e5%90%a6%e5%ae%89%e8%a3%85%e6%88%90%e5%8a%9f" class="header-anchor"&gt;&lt;/a&gt;5.测试Hadoop是否安装成功
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hadoop version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="配置hadoop"&gt;&lt;a href="#%e9%85%8d%e7%bd%aehadoop" class="header-anchor"&gt;&lt;/a&gt;配置Hadoop
&lt;/h1&gt;&lt;h2 id="1修改hadoop配置文件-core-sitexml"&gt;&lt;a href="#1%e4%bf%ae%e6%94%b9hadoop%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6-core-sitexml" class="header-anchor"&gt;&lt;/a&gt;1.修改Hadoop配置文件 core-site.xml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a. 执行以下命令开始进入编辑页面。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /opt/hadoop/etc/hadoop/core-site.xml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;b. 输入i进入编辑模式。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c. 在节点内插入如下内容。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hadoop.tmp.dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file:/opt/hadoop/tmp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; location to store temporary files
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fs.defaultFS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hdfs://localhost:9000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;d. 按Esc键退出编辑模式，输入:wq保存退出。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2修改hadoop配置文件-hdfs-sitexml"&gt;&lt;a href="#2%e4%bf%ae%e6%94%b9hadoop%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6-hdfs-sitexml" class="header-anchor"&gt;&lt;/a&gt;2.修改Hadoop配置文件 hdfs-site.xml
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a. 执行以下命令开始进入编辑页面。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /opt/hadoop/etc/hadoop/hdfs-site.xml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;b. 输入i进入编辑模式。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c. 在节点内插入如下内容。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dfs.replication
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dfs.namenode.name.dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file:/opt/hadoop/tmp/dfs/name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dfs.datanode.data.dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file:/opt/hadoop/tmp/dfs/data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;d. 按Esc键退出编辑模式，输入:wq保存退出。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="配置ssh免密登录"&gt;&lt;a href="#%e9%85%8d%e7%bd%aessh%e5%85%8d%e5%af%86%e7%99%bb%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;配置SSH免密登录
&lt;/h1&gt;&lt;h2 id="1执行以下命令创建公钥和私钥"&gt;&lt;a href="#1%e6%89%a7%e8%a1%8c%e4%bb%a5%e4%b8%8b%e5%91%bd%e4%bb%a4%e5%88%9b%e5%bb%ba%e5%85%ac%e9%92%a5%e5%92%8c%e7%a7%81%e9%92%a5" class="header-anchor"&gt;&lt;/a&gt;1.执行以下命令，创建公钥和私钥
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-keygen -t rsa
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2执行以下命令将公钥添加到authorized_keys文件中"&gt;&lt;a href="#2%e6%89%a7%e8%a1%8c%e4%bb%a5%e4%b8%8b%e5%91%bd%e4%bb%a4%e5%b0%86%e5%85%ac%e9%92%a5%e6%b7%bb%e5%8a%a0%e5%88%b0authorized_keys%e6%96%87%e4%bb%b6%e4%b8%ad" class="header-anchor"&gt;&lt;/a&gt;2.执行以下命令，将公钥添加到authorized_keys文件中
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd .ssh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat id_rsa.pub &amp;gt;&amp;gt; authorized_keys
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入如下命令，在环境变量中添加下面的配置
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;然后向里面加入如下的内容
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export HDFS_NAMENODE_USER&lt;span style="color:#f92672"&gt;=&lt;/span&gt;root
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export HDFS_DATANODE_USER&lt;span style="color:#f92672"&gt;=&lt;/span&gt;root
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export HDFS_SECONDARYNAMENODE_USER&lt;span style="color:#f92672"&gt;=&lt;/span&gt;root
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export YARN_RESOURCEMANAGER_USER&lt;span style="color:#f92672"&gt;=&lt;/span&gt;root
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export YARN_NODEMANAGER_USER&lt;span style="color:#f92672"&gt;=&lt;/span&gt;root
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入如下命令使改动生效
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="启动hadoop"&gt;&lt;a href="#%e5%90%af%e5%8a%a8hadoop" class="header-anchor"&gt;&lt;/a&gt;启动Hadoop
&lt;/h1&gt;&lt;h2 id="1执行以下命令初始化namenode"&gt;&lt;a href="#1%e6%89%a7%e8%a1%8c%e4%bb%a5%e4%b8%8b%e5%91%bd%e4%bb%a4%e5%88%9d%e5%a7%8b%e5%8c%96namenode" class="header-anchor"&gt;&lt;/a&gt;1.执行以下命令，初始化namenode
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hadoop namenode -format
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2依次执行以下命令启动hadoop"&gt;&lt;a href="#2%e4%be%9d%e6%ac%a1%e6%89%a7%e8%a1%8c%e4%bb%a5%e4%b8%8b%e5%91%bd%e4%bb%a4%e5%90%af%e5%8a%a8hadoop" class="header-anchor"&gt;&lt;/a&gt;2.依次执行以下命令，启动Hadoop
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;start-dfs.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;start-yarn.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3启动成功后执行以下命令查看已成功启动的进程"&gt;&lt;a href="#3%e5%90%af%e5%8a%a8%e6%88%90%e5%8a%9f%e5%90%8e%e6%89%a7%e8%a1%8c%e4%bb%a5%e4%b8%8b%e5%91%bd%e4%bb%a4%e6%9f%a5%e7%9c%8b%e5%b7%b2%e6%88%90%e5%8a%9f%e5%90%af%e5%8a%a8%e7%9a%84%e8%bf%9b%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;3.启动成功后，执行以下命令，查看已成功启动的进程
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="../../images/2025/05/image-2.png"&gt;&lt;/p&gt;
&lt;h2 id="4打开浏览器访问如下地址显示如下界面则表示hadoop伪分布式环境搭建完成"&gt;&lt;a href="#4%e6%89%93%e5%bc%80%e6%b5%8f%e8%a7%88%e5%99%a8%e8%ae%bf%e9%97%ae%e5%a6%82%e4%b8%8b%e5%9c%b0%e5%9d%80%e6%98%be%e7%a4%ba%e5%a6%82%e4%b8%8b%e7%95%8c%e9%9d%a2%e5%88%99%e8%a1%a8%e7%a4%bahadoop%e4%bc%aa%e5%88%86%e5%b8%83%e5%bc%8f%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%e5%ae%8c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;4.打开浏览器访问如下地址，显示如下界面则表示Hadoop伪分布式环境搭建完成
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Hadoop 版本&lt;/th&gt;
					&lt;th&gt;NameNode Web UI 默认端口&lt;/th&gt;
					&lt;th&gt;ResourceManager Web UI 默认端口&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Hadoop 2.x&lt;/td&gt;
					&lt;td&gt;50070&lt;/td&gt;
					&lt;td&gt;8088&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Hadoop 3.x 及以上&lt;/td&gt;
					&lt;td&gt;9870&lt;/td&gt;
					&lt;td&gt;8088&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="../../images/2025/05/image-3-1024x496.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="../../images/2025/05/image-4-1024x496.png"&gt;&lt;/p&gt;
&lt;h1 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料
&lt;/h1&gt;&lt;p&gt;&lt;a class="link" href="https://developer.aliyun.com/article/1509751" target="_blank" rel="noopener"
 &gt;Linux（阿里云）安装Hadoop(详细教程+避坑)-阿里云开发者社区&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>