Hadoop MapReduce图文并茂

详细 Hadoop MapReduce 图文并茂

概观:

Hadoop MapReduce是一个软件框架,用于轻松编写应用程序,以可靠,容错的方式在大型集群(数千个节点)的商用硬件上并行处理大量数据(多TB数据集)。

MapReduce 作业通常将输入数据集拆分为独立的块,这些块由map任务以完全并行的方式处理。框架对地图的输出进行排序,然后输入到reduce任务。通常,作业的输入和输出都存储在文件系统中。该框架负责调度任务,监视任务并重新执行失败的任务。

通常,计算节点和存储节点是相同的,即MapReduce框架和Hadoop分布式文件系统(请参阅HDFS体系结构指南)在同一组节点上运行。此配置允许框架有效地在已存在数据的节点上调度任务,从而在集群中产生非常高的聚合带宽。

MapReduce框架由单个主ResourceManager,每个集群节点一个从NodeManager和每个应用程序的MRAppMaster组成(参见YARN体系结构指南)。

最低限度,应用程序通过适当的接口和/或抽象类的实现来指定输入/输出位置并提供映射减少功能。这些和其他作业参数包括作业配置

然后,Hadoop 作业客户端将作业(jar /可执行文件等)和配置提交给ResourceManager,然后ResourceManager负责将软件/配置分发给从站,调度任务并监视它们,为作业提供状态和诊断信息 -客户。

虽然Hadoop框架是用Java™实现的,但MapReduce应用程序不需要用Java编写。

  • Hadoop Streaming 是一个实用程序,它允许用户使用任何可执行文件(例如shell实用程序)作为映射器和/或reducer创建和运行作业。
  • Hadoop Pipes 是一个与SWIG兼容的C ++ API,用于实现MapReduce应用程序(非基于JNI™)。

​ MapReduce 是一种程序开发模式,可以使用大量服务器来并行处理。MapReduce,简单来说,Map就是分配工作,Reduce就是将工作结果汇总整理。

​ 1、首先使用 Map 将待处理的数据分割成很多的小份数据,由每台服务器分别运行。

​ 2、再通过 Reduce 程序进行数据合并,最后汇总整理出结果。

简单介绍 WordCount.java

在这里插入图片描述

顺序开发步骤说明
1编辑 WordCount.java使用 getdit 编辑 WordCount.java
2编译 WordCount.java编译、打包 WordCount.java 程序
3创建测试文本文件使用 Hadoop 目录下的 LICENSE.txt 文件作为测试文件,并上传文本文件至HDFS
4运行 WordCount.java在 Hadoop 环境运行 WordCount
5查看运行结果运行会产生输出文件并存储到 HDFS 中,可使用 HDFS 命令查看

编辑 WordCount.java

在此我们使用最简单的方式(使用 gedit)编辑 WordCount.java

1、创建 wordcount 目录
1.1 创建 wordcount 测试目录
mkdir -p ~/wordcount/input
1.2 切换至 wordcount 测试目录
cd ~/wordcount
2、复制 Wordcount.java 程序代码

​ 在 Hadoop 说明文件中就具有 WordCount.java 的程序代码,在浏览器输入下列网址就可以看到原文的详细说明与源代码。

http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html

3、编辑 WordCount.java
3.1 使用 gedit 编辑 WordCount.java
sudo gedit 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 {

  
}
4、 Import 相关的Lib 并创建 WordCount.java 类

首先要 Import 相关的 Lib 链接库,并且创建 WordCount 类 class ,后续的程序都是引入到 WordCount 类中。

4.1 创建 main function
 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);
  }
4.2 创建 TokenizerMapper 类

​ 在 TokenizerMapper 类的 map 方法中,先创建 StringTokenizer,然后使用 while(itr.hasMoreTokens())读取每一个 word 并写入 context.write(word,one),创建 key/value(word,1)。

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);
      }
    }
  }
4.3 创建 IntSumReducer 类

​ 在 IntSumReducer 类的 reduce 方法中,先使用 for(IntWritable val:values)读取每一个数值,并使用 sum+=val.get() 求和,最后写入结果。

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);
    }
  }

编译 WordCount.java

接下来编译 WordCount.java,只是需要先设置环境变量。

1、修改编译所需要的环境变量文件
1.1 编译 ~/.bashrc
sudo gedit ~/.bashrc
export PATH=${JAVA_HOME}/bin:${PATH}
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
1.2 设置 PATH
export PATH = $ {JAVA_HOME} / bin:$ {PATH}

​ 因为我们后续要使用的命令(例如jar)存在 /usr/lib/jvm/java-7-openjdk-amd64/bin,所以将 ${JAVA_HOME}/bin 加入 PATH,这样,切换到其他目录时也就能够使用此命令了。

1.3 设置 HADOOP_CLASSPATH,编译时才找得到链接库export
HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
2、让 ~/.bashrc 修改的设置值生效

​ 当我们修改 ~/.bashrc 之后,可以先从系统注销再重新登录,该设置会生效;或者使用 source 让命令 ~/.bashrc 设置立即生效。

2.1 让 ~/.bashrc 设置生效
source ~/.bashrc
3、开始编辑

使用下列命令进行编译,编译完成后,就会生成 wc.jar 文件

命令说明
hadoop com.sun.tools.javac.Main WordCount.java编辑 WordCount 程序
jar cf wc.jar WordCount*.class把 WordCount 类打包成 wc.jar
ll查看目录内容

​ jar 文件(java ARchive)是一种压缩文件,包含 Class 与相关资源(文字、图片等),之后就可以运行 wc.jar 这个程序了。

创建测试文本文件

为了测试 WordCount 程序,我们可以使用 Hadoop 目录下的 LICENSE.txt 文件。

1、复制 LICENSE.txt
1.1 切换到输入目录
cp /usr/local/hadoop/LICENSE.txt  ~/wordcount/input

ll ~/wordcount/input
1.2 启动所有虚拟服务器
1.3 进入 master 虚拟机,启动 Hadoop Multi-Node Cluster
启动 Hadoop Multi-Node Cluster
Start-all.sh
1.4 上传测试文件到 HDFS 目录
在 HDFS 创建目录
hadoop fs -mkdir -p /user/hduser/wordcount/input
切换到 ~/wordcount/input 数据文件目录
cd ~/wordcount/input
上传文本文件到 HDFS
hadoop fs -copyFromLocal LICENSE.txt /user/hduser/wordcount/input
列出 HDFS 文件
hadoop fs -ls /user/hduser/wordcount/input

运行 WordCount.java

1、切换目录
cd ~/wordcount
2、运行 WordCount.java 程序
hadoop jar wc.jar WordCount /user/hduser/wordcount/input/LICENSE.txt /user/hduser/wordcount/output

​ 运行 WordCount 程序,语句格式为 “hadoop jar wc.jar [输入文件] [输出目录]"。如上述命令所示,程序会读取输入文件 /user/hduser/wordcount/input/LICENSE.txt ,处理完成后将结果写入 /user/hduser/wordcount/output 目录。

在这里插入图片描述

查看运行结果

运行后,程序会将结果存储到 /user/hduser/wordcount/output 目录中。

1、查看输出目录
1.1 查看 HDFS 的目录
hadoop fs -ls /user/hduser/wordcount/output

_SUCCESS :代表程序运行成功

part-r-00000:运行结果的文本文件

在这里插入图片描述

2、 查看输出文件
2.1 查看 HDFS 中的输文件内容
hadoop fs -cat /user/hduser/wordcount/output/part-r-00000|more
3、删除输出目录

​ 如果要再次执行 WordCount 程序,请先删除输出目录,这样才不会出现文件已经存在的包错信息。

hadoop fs -rm -R /user/hduser/wordcount/output

结论:

本章介绍了 Hadoop MapReduce,同时发现它有以下缺点:

1、程序设计模式不容易使用,而且 Hadoop 的 Map Reduce API 太过低级,很难提高开发者的效率。

2、有运行效率问题,MapReduce 需要将中间产生的数据保存到硬盘中,因此会有读写数据延迟问题。

3、不支持实时处理,它原始的设计就是以批处理为主。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值