目录

一、Hadoop 集群基础环境准备

1. 环境版本与配置检查

2. 初始化 HDFS 文件系统

 3. 启动 Hadoop 服务

 二、HDFS 分布式文件系统操作实战

1. 创建与管理 HDFS 目录

​ 2.上传与下载文件

三、MapReduce 作业全流程实战:WordCount 案例

 1. 提交 WordCount 作业

​2.监控作业执行过程

 3.验证作业结果

 四、分析MapReduce 的 Shuffle 阶段

1.从日志中提取Shuffle信息

2.通过 YARN 界面分析 Shuffle 指标

 五、总结


Hadoop 作为大数据处理的基础框架,其分布式计算能力是理解大数据技术的核心。本文将通过完整的实操案例,带你从零开始体验 Hadoop 集群环境下的 MapReduce 作业流程,涵盖 HDFS 文件操作、YARN 服务管理及 Shuffle 阶段分析等关键环节。

一、Hadoop 集群基础环境准备

1. 环境版本与配置检查

确认Hadoop和java的版本和安装路径,我用的是docker搭建的kiwenlau/hadoop 镜像,不了解的看我之前的文章。

java -version
hadoop version
echo $HADOOP_HOME

如果hadoophome路径没设置,最好设置一下

vi ~/.bashrc

#添加以下内容
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

#添加完后保存

source ~/.bashrc  # 使配置生效

2. 初始化 HDFS 文件系统

首次部署Hadoop或者重置集群时,需要格式化NameNode,谨慎操作,格式化会清空 HDFS 所有元数据,如果已有数据要考虑是否格式化

hdfs namenode -format

 3. 启动 Hadoop 服务

启动 HDFS 和 YARN 服务,查看进程状态。

start-dfs.sh
start-yarn.sh
jps

 二、HDFS 分布式文件系统操作实战

1. 创建与管理 HDFS 目录

创建多级目录

hdfs dfs -mkdir -p /input
hdfs dfs -mkdir -p /mapreduce/input
hdfs dfs -mkdir -p /mapreduce/output
hdfs dfs -mkdir -p /test/cluster

 

创建本地文件

echo "hadoop mapreduce" > words.txt
echo "hello hadoop mapreduce" > test.txt
echo "This is a test file for HDFS" > test-cluster.txt

 2.上传与下载文件

上传文件到HDFS

hdfs dfs -put words.txt /mapreduce/input/
hdfs dfs -put test.txt /input/
hdfs dfs -put test-cluster.txt /test/cluster/

 验证上传结果

hdfs dfs -ls /input
hdfs dfs -ls /mapreduce/input
hdfs dfs -ls /test/cluster

把文件下载到本地并查看文件内容

hdfs dfs -get /test/cluster/test-cluster.txt /tmp/
cat /tmp/test-cluster.txt

 3.HDFS集群状态查看

通过端粒元命令获取集群整体状态,包括存储容量和节点信息。

hdfs dfsadmin -report

说明:
Configured Capacity:集群总存储容量​
DFS Used:已使用存储量​
Live datanodes:存活的数据节点列表,如果为0,集群就无法读写

三、MapReduce 作业全流程实战1:使用官方WordCount 案例

 1. 提交 WordCount 作业

Hadoop自带了WordCount程序,我们可以直接执行,不过要保证/mapreduce/output目录不存在,否则会报错说FileAlreadyExistsException,如果真报错了,可以通过hdfs dfs -rm -r /mapreduce/output 删除目录,然后再重新运行

hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /mapreduce/input /mapreduce/output

2.监控作业执行过程

查看所有作业状态

yarn application -list

 查看所有作业的状态

yarn application -list -appStates ALL

 3.验证作业结果

查看 MapReduce 作业的输出结果,确认单词计数准确性

hdfs dfs -cat /mapreduce/output/part-r-00000

四、MapReduce 作业全流程实战2:自己创建WordCount 案例 

 我们也可以通过自己编写Java代码实现MapReduce作业

1.创建文件目录

mkdir -p ~/hadoop-projects/wordcount/src
cd ~/hadoop-projects/wordcount/src

 

 2.编写MapReduce 程序

vi WordCount.java

 在文件里写入以下代码

import java.io.IOException;
import java.util.StringTokenizer;

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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

  public static class TokenizerMapper
       extends Mapper<Object, Text, Text, IntWritable>{

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }

  public static class IntSumReducer
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values,
                       Context context
                       ) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.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);
  }
}

保存并退出

 3.编译并运行测试程序

创建测试文件

echo "Hello Hadoop MapReduce" > test1.txt
echo "Hello World" >> test1.txt

创建目录 并将输文件复制到hadoop文件系统

mkdir input
hdfs dfs -mkdir -p input
hdfs dfs -put test1.txt input

 编译程序并创建jar包

javac -classpath `hadoop classpath` WordCount.java
jar cf wc.jar WordCount*.class

运行程序

hadoop jar wc.jar WordCount input output

查看输出结果

hdfs dfs -cat output/part-r-00000

 五、分析MapReduce 的 Shuffle 阶段

1.从日志中提取Shuffle信息

Shuffle 是 MapReduce 的核心阶段,通过日志可分析数据流动过程:

yarn logs -applicationId <你的pplicationID> | grep -iE "shuffle|merge|sort"

我的作业太简单了,所以Shuffel完成的太快,日志没有相关信息。

2.通过 YARN 界面分析 Shuffle 指标

 在本地浏览器输入http://<主节点 IP>:8088(若在本地机器且未修改端口,可访问 http://localhost:8088 ),可以看到相关信息

 六、总结

这篇文章写的有些潦草,如果有什么问题可以评论或者私信我。如果想详细了解MapReduce,大家可以去看b站视频理解相关概念,或者点赞高的话我也会考虑写相关文章帮助大家理解。

Logo

更多推荐