大数据实战——WordCount案例实践

本文详细介绍了如何在Hadoop环境中实现WordCount大数据处理案例,从文件准备、Hadoop启动、Eclipse环境编程到MapReduce程序的执行,解析了MapReduce的原理和WordCount的解题思路,展示了完整的操作步骤和截图。
摘要由CSDN通过智能技术生成

🌟欢迎来到 我的博客 —— 探索技术的无限可能!


🌟博客的简介(文章目录)

一.过程分析(截图)

1.确定Hadoop处于启动状态

在这里插入图片描述

图1:打开hdfs

在终端输入./sbin/start-dfs.sh启动hdfs。

在这里插入图片描述

图2:确定Hadoop处于启动状态
通过输入jps确定Hadoop处于启动状态。

2.在/usr/local/filecotent下新建hellodemo文件,并写入以下内容

在这里插入图片描述

图3:新建filecotent文件夹

cd进入/usr/local,通过sudo mkdir filecotent新建filecotent文件夹。

在这里插入图片描述

图4:新建hellodemo文件

在终端输入sudo vi hellodemo新建hellodemo文件,并写入以下内容:

hello you
Hello me

在这里插入图片描述

图5:进入hellodemo文件
在这里插入图片描述

图6:写好内容进hellodemo文件

在这里插入图片描述

图7:按 ESC 保存,然后 shift+:wq

3.hdfs中创建data目录

在这里插入图片描述
图8:hdfs中创建data目录
在终端进入hadoop文件夹后输入bin/hdfs dfs -mkdir data创建data目录。

4.将/usr/local/filecontent/hellodemo 上传到hdfs的data目录中

在这里插入图片描述
图9:上传到hdfs的data目录

5.查看data目录下的内容

在这里插入图片描述

图10:查看data目录下的内容

在终端输入命令:bin/hdfs dfs -ls data查看data目录下的内容,可以看到我们已经成功将刚刚写的hellodemo文件上传到hdfs的data目录下。

在这里插入图片描述

图11:查看hellodemo文件内容

在终端输入命令:bin/hdfs dfs -text data/hellodemo查看hellodemo文件内容。

6.编写WordCountTest.java并运行文件

6.1进入eclipse

在这里插入图片描述

图12:启动eclipse

在终端输入启动命令:./eclipse启动eclipse。

6.2默认workspace(这里必须是Hadoop用户下,如果是个人用户名下,就代表前面错误,你不是在Hadoop下完成的操作,会显示没有java路径)

在这里插入图片描述

图13:默认workspace

默认workspace点击launch进入下一步。

6.3新建Mapreduce包和class

在这里插入图片描述

图14:新建Mapreduce包

在这里插入图片描述

图15:给新建class起名WordCountTest

6.4点击libraries,添加jar包,添加完成后点击finish

在这里插入图片描述

图16:添加mapreduce的jar包
在这里插入图片描述

图17:添加mapreduce的里面lib的jar包
在这里插入图片描述

图18:添加yarn的jar包
在这里插入图片描述

图19:添加yarn的里面lib的jar包

6.5编写WordCountTest.java

在这里插入图片描述

图20:编写WordCountTest.java

在这里插入图片描述

图21:注意要把位置写对

在这里插入图片描述

图23:运行成功

7.打成jar包并指定主类,在linux中运行

在这里插入图片描述

图24:创建myapp
在终端输入命令:mkdir myapp创建myapp目录。

在这里插入图片描述

图25:选择“export”
在Eclipse工作界面左侧的“Package Explorer”面板中,在工程名称“WordCount”上点击鼠标右键,在弹出的菜单中选择“Export”。

在这里插入图片描述

图26:选择“Runnable JAR file”
在该界面中,选择“Runnable JAR file”,然后,点击“Next>”按钮。

在这里插入图片描述

图27:WordCountTest工程打包生成WordCountTest.jar

在该界面中,“Launch configuration”用于设置生成的JAR包被部署启动时运行的主类,需要在下拉列表中选择刚才配置的类“WordCount”。在“Export destination”中需要设置JAR包要输出保存到哪个目录,这里设置为“/usr/local/hadoop/myapp/WordCountTest.jar”。在“Library handling”下面选择“Extract required libraries into generated JAR”。然后,点击“Finish”按钮完成打包。

在这里插入图片描述

图28:查看是否打包成功
在进入myapp目录下终端输入命令:ls,可以看到,“/usr/local/hadoop/myapp”目录下已经存在一个WordCount.jar文件。

8.查看输出文件内容

在这里插入图片描述

图29:使用hadoop jar命令运行程序
在终端输入命令:./bin/hadoop jar ./myapp/WordCount.jar运行打包的程序。

在这里插入图片描述

图30:运行结果
词频统计结果已经被写入了HDFS的“/user/hadoop/out1”目录中。

在这里插入图片描述

图31:查看输出文件内容

在终端输入命令:bin/hdfs dfs -cat /out1/*查看输出文件内容,词频统计结果入图31所示,自此词频统计程序顺利运行结束。

二.解题思路

1.MapReduce原理

MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。
Map
Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。

Reduec
Reduce负责“合”,即对map阶段的结果进行全局汇总。
在这里插入图片描述

图32:WordCountTest说明

2. WordCountTest解题思路

要求:在给定的文本文件中统计输出每一个单词出现的总次数。

根据一个完整的MapReduce程序在分布式运行时需要有三类实例进程:
(1)MrAppMaster:负责整个程序的过程调度及状态协调。
(2)MapTask:负责Map阶段的整个数据处理流程。
(3)ReduceTask:负责Reduce阶段的整个数据处理流程。
所以WordCountTest需要有Map类、Reduce类和main主类。

2.1 编写Mapper

(1)自定义的MyMapper要继承自己的父类
(2)Mapper的输入数据是KV对(K:偏移量,类型为LongWritable,V:对应的内容,类型为Text)
(3)Mapper中的业务逻辑写在map()方法中
(4)Mapper的输出数据是KV对的形式
(5)map() 方法对每一个<K,V>调用一次
将传给我们的文本内容转换成String,根据空格将这一行切分成单词,再将单词输出为<单词,1>。
代码:

private static class MyMapper extends Mapper<LongWritable, Text, Text,LongWritable>{
    Text k2 = new Text();
    LongWritable v2 = new LongWritable();
    @Override
    protected void map(LongWritable key, Text value,//三个参数
                       Mapper<LongWritable, Text, Text, LongWritable>.Context context)
            throws IOException, InterruptedException {
        //获取一行
        String line = value.toString();
        //切割
        String[] splited = line.split(" ");//因为split方法属于string字符的方法,首先应该转化为string类型在使用
        //输出
        for (String word : splited) {
            //word表示每一行中每个单词
            //对K2和V2赋值
            k2.set(word);
            v2.set(1L);
            context.write(k2, v2);
        }
    }
}

2.2 编写Reducer阶段

(1)用户自定义的MyReducer要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
也就是说map输出的结果然后放到reduce中处理
(3)Reducer的业务逻辑写在reduce()方法中
(4)对每一组相同k的<k,v>组调用一次reduce()方法
汇总各个key的个数,输出该key的总次数。
代码:

private static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
    LongWritable v3 = new LongWritable();
    @Override //k2表示单词,v2s表示不同单词出现的次数,需要对v2s进行迭代
    protected void reduce(Text k2, Iterable<LongWritable> v2s,  //三个参数
                          Reducer<Text, LongWritable, Text, LongWritable>.Context context)
            throws IOException, InterruptedException {
        //累加求和
        long sum =0;
        for (LongWritable v2 : v2s) {
            //LongWritable本身是hadoop类型,sum是java类型
            //首先将LongWritable转化为字符串,利用get方法
            sum+=v2.get();
        }
        //输出
        v3.set(sum);
        //将k2,v3写出去
        context.write(k2, v3);
    }
}

2.3 运行分析

在这里插入图片描述

图33:运行分析

在这里插入图片描述

图34:运行结果

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Mapreduce实例-WordCount是一个经典的MapReduce程序,用于统计文本中每个单词出现的次数。它的工作原理是将输入的文本划分为多个片段,每个片段由多个键值对组成,其中键是单词,值是1。然后通过Map阶段将每个片段中的单词提取出来,并将每个单词映射为键值对,其中键是单词,值是1。接下来,通过Shuffle和Sort阶段将具有相同单词的键值对聚集在一起。最后,通过Reduce阶段将相同单词的计数值进行累加,得到每个单词的总次数。 以下是一个示例代码片段,展示了WordCount程序的基本结构和关键组件: ```java import java.io.IOException; import java.util.StringTokenizer; 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 { Job job = Job.getInstance(); 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); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZShiJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值