60分钟

MapReduce实战

实验预计耗时:60分钟

1. 课程背景

1.1 课程目的

弹性 MapReduce(EMR)是腾讯云结合云技术和 Hadoop、Spark 等社区开源技术,提供的安全、低成本、高可靠、可弹性伸缩的云端托管 Hadoop 服务。您可以在数分钟内创建安全可靠的专属 Hadoop 集群,以分析位于集群内数据节点或 COS 上的 PB 级海量数据。

本实验将从搭建开发环境开始,分步带领学员完成MapReduce程序的开发和部署。课程将以经典的WordCount案例为例,使用Java编写WordCount程序并放到腾讯云EMR平台运行。学员在学会MapReduce开发流程的同时,还将熟悉腾讯云EMR服务的基本操作和使用。

1.2 课前知识准备

学习本课程前,学员需要掌握以下前置知识:

1、能力基础

  • Java环境配置:Java的安装以及JAVA_HOME环境变量的配置。
  • Java编程基础:包括数据结构、逻辑语句、函数、注解、面向对象编程等。
  • HDFS基本命令的使用:包括文件的移动、文件的上传、文件权限的修改等。

2、相关技术

  • Maven:Maven是一个项目管理工具,我们通过创建Maven工程快速获取项目所需要的jar包,并保存在本地仓库,也可以帮助我们对自己的项目进行生成jar包等项目管理操作。
  • Hadoop:是由Apache基金会所开发的分布式系统基础架构,其核心包括以下几个组件:
    • HDFS:提供数据高吞吐量访问的分布式文件系统。
    • YARN:作业调度和集群资源管理框架。
    • MapReduce:一种基于YARN的大型数据集并行处理系统。
  • MapReduce:MapReduce是一种编程模型,核心步骤主要包括"Map(映射)"和"Reduce(归约)"。其运行原理如图:先指定一个Map(映射)函数,用来把数据映射成一组键值对,指定并发的Reduce(归约)函数,用来对映射的键值对进行合并计算。
  • YARN主要负责Hadoop集群的Job(任务)的资源分配与执行,其角色主要包括ResourceManager(在主节点) 和 NodeManager(在子节点),其运行程序的步骤大致如下:
    • 步骤1:用户将应用程序提交到ResourceManager上;
    • 步骤2:ResourceManager为应用程序ApplicationMaster申请资源,并与某个NodeManager通信,以启动ApplicationMaster;
    • 步骤3:ApplicationMaster与ResourceManager通信,为内部要执行的任务申请资源( Container ),一旦得到资源后,将于NodeManager通信,以启动对应的任务。
    • 步骤4:所有任务运行完成后,ApplicationMaster向ResourceManager注销,整个应用程序运行结束。

2. 实验环境

2.1 实验操作环境

本课程需要以下实验操作环境:

  1. 可以接入互联网的笔记本电脑或者台式机,包括但不限于Windows、Mac系统
  2. 实验环境:计算机本地+腾讯云控制台
  3. Java软件开发工具包JDK(版本:1.8)
  4. Maven(版本:3.5及以上)
  5. Eclipse或者IDEA,此实验采用IDEA作为开发工具

2.2 实验架构图

本实验将开发的MapReduce程序提交给EMR三节点集群(Master节点和两个Core节点),其架构图如下:

2.3 实验的数据规划表

资源名称

数据

说明

腾讯云账号

账号:XXXXXXXX、密码:XXXXXXXX

涉及产品如下:VPC、EMR

JDK

版本:1.8即可

Maven

版本:3.6.3

IntelliJ IDEA

版本:最新版即可

PuTTY

版本:0.73

words.dat数据集

JDK下载

Maven下载

IntelliJ IDEA下载

PuTTY下载

words.dat数据集下载

3. 实验流程

实验共分为四个步骤,首先在计算机准备开发环境,开发MapReduce程序需要基本的Java环境,此步骤会引导您安装Java、Maven以及一个集成开发环境软件IntelliJ IEDA,并完成基本配置。

接着我们开始编写WordCount程序代码,项目代码确认无误后可以借助Maven将项目封装成一个jar包,等待后面步骤的计算使用。

最后我们需要借助腾讯云弹性MapReduce服务快速搭建一个Hadoop集群,用来运行WordCount程序。集群购买完成且运行成功后,我们将前面步骤生成的jar包上传至主节点,通过hadoop命令进行运行,体验MapReduce在YARN上的运行。

4. 实验步骤

任务1 开发环境准备

【任务目标】

在计算机上安装Java的开发环境,包括开发工具的安装和Maven的安装,为后面练习编写MapReduce程序做环境准备。

【任务步骤】

1、安装 Java环境

1.安装Java

注意:如果已安装Java,请直接进行下一步:安装Maven环境。

如果没有安装 Java,请下载安装 Java 软件开发套件(JDK)。官方下载地址:JDK下载

安装时,请记录Java的安装路径。一般Windows默认的安装路径为C:\Program Files\Java\jdk-13.0.2。

Java下载需要注册Oracle账号,请学员自行解决。

2.设置 Java 环境

设置JAVA_HOME环境变量,并指向您机器上的 Java 安装目录。本课程将不会对设置Java环境的操作进行具体的讲解,仅提供一些提示。

操作系统

设置环境变量

Windows

在系统变量中“新建”JAVA_HOME变量,变量值为Java安装路径,如C:\Program Files\Java\jdk-13.0.2;在系统的PATH变量最后,添加变量值%JAVA_HOME%\bin

Linux

修改用户目录下的.bash_profile文件,在文件中添加JAVA_HOME和PATH变量,变量值分别为Java安装路径和$JAVA_HOME/bin:$PATH

3.检查 Java 安装

打开终端,执行如下命令:

java -version

如果输出 Java 版本号,说明 Java 安装成功。

2、安装 Maven环境

1.下载安装 Maven

官方下载地址:Maven下载

安装时,请记录Maven的安装路径。

2.设置 MAVEN_HOME 和 PATH 环境变量

操作系统

设置环境变量

Windows

在系统变量中“新建”MAVEN_HOME变量,变量值为Maven安装路径,如D:\apache-maven-3.6.3;在系统的PATH变量最后,添加变量值%MAVEN_HOME%\bin

Linux

修改/etc/profile文件,在里面添加MAVEN_HOME和PATH变量,变量值分别为Maven安装路径和$MAVEN_HOME/bin:$PATH

3.验证 Maven 安装

当 Maven 安装完成后, 通过执行如下命令验证 Maven 是否安装成功。

mvn --version

注意:演示使用的是Maven 3.6.1版本,学员使用3.6.3版本无影响。

4.Maven 配置 TSF 私服地址

找到 Maven 所使用的配置文件,一般在Maven目录下的conf目录下,找到settings.xml,在 settings.xml 中加入配置:

注:其中localRepository标签用于指定本地仓库位置,用于存放后续步骤中下载的依赖。学员可以配置一个自定义目录,settings.xml配置内容参考如下:

   <settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
       <div id="saka-gui-root"/>
       <!-- 指定本地仓库位置 -->
       <localRepository>D:\develop\maven\repository</localRepository>
       <pluginGroups/>
       <proxies/>
       <servers/>
       <mirrors/>
       <profiles>
           <profile>
               <id>nexus</id>
               <repositories>
                   <repository>
                       <id>central</id>
                       <url>http://repo1.maven.org/maven2</url>
                       <releases>
                           <enabled>true</enabled>
                       </releases>
                       <snapshots>
                           <enabled>true</enabled>
                       </snapshots>
                   </repository>
               </repositories>
               <pluginRepositories>
                   <pluginRepository>
                       <id>central</id>
                       <url>http://repo1.maven.org/maven2</url>
                       <releases>
                           <enabled>true</enabled>
                       </releases>
                       <snapshots>
                           <enabled>true</enabled>
                       </snapshots>
                   </pluginRepository>
               </pluginRepositories>
           </profile>
           <profile>
               <id>qcloud-repo</id>
               <repositories>
                   <repository>
                       <id>qcloud-central</id>
                       <name>qcloud mirror central</name>
                       <url>
   http://mirrors.cloud.tencent.com/nexus/repository/maven-public/
                       </url>
                       <snapshots>
                           <enabled>true</enabled>
                       </snapshots>
                       <releases>
                           <enabled>true</enabled>
                       </releases>
                   </repository>
               </repositories>
               <pluginRepositories>
                   <pluginRepository>
                       <id>qcloud-plugin-central</id>
                       <url>
   http://mirrors.cloud.tencent.com/nexus/repository/maven-public/
                       </url>
                       <snapshots>
                           <enabled>true</enabled>
                       </snapshots>
                       <releases>
                           <enabled>true</enabled>
                       </releases>
                   </pluginRepository>
               </pluginRepositories>
           </profile>
       </profiles>
       <activeProfiles>
           <activeProfile>nexus</activeProfile>
           <activeProfile>qcloud-repo</activeProfile>
       </activeProfiles>
   </settings>

5.验证配置是否成功

配置完settings后,可以在CMD命令行窗口执行如下命令。

mvn help:effective-settings

运行命令后,当我们看到BUILD SUCCESS时,表明 settings.xml 格式正确。

3、IDEA 安装

1.下载 IntelliJ IDEA 安装包并安装;

IntelliJ IDEA下载

选择社区版本即可。

2.配置IDEA

在Configure选项栏下,点击Settings。

在搜索栏搜索maven,将maven的位置进行配置。配置的内容包括:

  • Maven home directory:Maven安装路径
  • User settings file:settings.xml文件
  • Local repository:本地仓库位置

注意:如果此处不能配置,可新建一个任意项目后,在项目内部进行配置。

任务2 编写WordCount程序

【任务目标】

通过练习WordCount的编写让学员掌握MapReduce的编写过程和任务提交流程。

【任务步骤】

1、Idea中创建项目

1.打开IDEA后,点击Create New Project

2.选择项目类型为Maven

3.GroupId为:com.test;ArtifactId为:WordCount

4.Project name为:WordCount

项目创建成功后配置Maven的pom.xml,增加以下文件的内容在project标签内;

   <dependencies>
       <dependency>
           <groupId>org.apache.hadoop</groupId>
           <artifactId>hadoop-common</artifactId>
           <version>3.1.2</version>
       </dependency>
       <dependency>
           <groupId>org.apache.hadoop</groupId>
           <artifactId>hadoop-mapreduce-client-core</artifactId>
           <version>3.1.2</version>
       </dependency>
   </dependencies>

点击Import ChangesEnable Auto-Import,开始下载依赖。(此处建议每次更改POM文件后手动点击Import Changes)

下载需要等待一定时间,界面下侧会有进度说明。

2、编写WordCount程序

1.创建package名:com.test.wordcount,需要在src-main-java右键,选择【new】-【package】创建。在该package下创建WordCount类。

2.WordCount类代码编写如下:

   package com.test.wordcount;
   
   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();
   
           @Override
           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();
   
           @Override
           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、编译打包

1.代码编写确认后,我们使用Maven对程序生成jar包。

使用IDEA,点击右侧Maven选项卡,点击每一模块下的Lifecycle,双击生命周期中的package,即可开始构建jar包。

package运行结果大致如下,其中我们看到BUILD SUCCESS时,表示构建成功:

2.打包成功后,我们可以在该模块目录的target文件夹下,查看到已有jar包。将jar包移至D盘等待上传EMR。

任务3 EMR集群部署

【任务目标】

借助腾讯云EMR快速搭建一个hadoop集群,用来运行WordCount程序。如已有EMR集群,可跳过本任务。

【任务步骤】

1、EMR集群选购

1.在腾讯云官网,找到弹性MapReduce首页,点击立即购买

2.可用区与软件配置如下:

配置项

配置项说明

计费模式

按量计费

地域/可用区

广州/广州四区(可根据所在地自定义选择)

产品版本

EMR-V3.0.0

必选组件

hadoop、zookeeper、knox

可选组件

确认配置无误后,点击下一步:硬件配置

注意:请勿选择EMR-3.0.0 tlinux,如产品版本无EMR-3.0.0版本,请更换个人主账号进行实验。

3.硬件配置如下:

配置项

配置项说明

节点高可用

不启用

Master配置1台

EMR标准型S4 / 2核8G,CBS云盘:100G高效云盘 X 1

Core配置2台

EMR标准型S4 / 2核8G,CBS云盘:100G高效云盘 X 1

集群外网

开启集群Master节点公网

集群网络

新建或选择已有的私有网络

启动高可用选项可以自定义选择,默认是选择的,如果取消需要手动取消选择。由于我们这里的实验环境仅仅是一个学习的实验环境所以这里我们将此选项取消,实际生产中要根据实际环境合理选择是否需要这个配置。

确认硬件配置信息无误后,点击下一步:基础配置

4.基础配置如下:

配置项

配置项说明

集群名称

emr-test

远程登录

开启

安全组

创建新安全组

对象存储

不开启

登录密码

EMR集群云主机root用户登录的密码

确认信息无误后,点击购买,会自动跳转至集群页。图中的集群实例状态中显示集群创建中

等待10min左右,集群构建成功,截图如下:

2、第三方工具连接EMR集群

1.复制集群页的主节点外网IP,打开PuTTY创建连接,将复制的外网IP粘贴至Host Name,端口默认22,如图:

2.点击Open,第一次连接会弹出安全警告,点击是(Y)

3.接下在login as:后填写用户名为root,密码为构建EMR的时候设置的密码:

备注:这里只能使用root用户进行连接。

回车确认后,我们即可成功访问主节点实例。输入java进程查看命令jps,可看到应用进程已经启动。

任务4 程序上传并运行

【任务目标】

通过YARN执行WordCount程序,并查看任务运行的结果。

【任务步骤】

1、上传程序jar包

1.使用mkdir命令在Master节点创建一个/test目录。

mkdir /test
cd /test

2.找到PuTTY的安装目录,在上方地址栏输入cmd并执行。

3.上传jar包

在弹出的黑窗口首先输入psftp,打开psftp工具用来传输文件;

psftp

接下来连接服务器,回车后需要输入用户名和密码;

open xxx.xxx.xxx.xxx 

切换远程Linux 服务器上的目录:

cd /test/ 

切换本地的路径:

lcd D:\ 

上传文件:

put WordCount-1.0-SNAPSHOT.jar 

命令使用可以参考下图:

上传成功后在Master节点的/test目录查看到上传的jar包。

2、运行jar包

1.使用chmod命令修改jar包的执行权限;使用chown命令修改jar包的属主为hadoop;

chmod 777 WordCount-1.0-SNAPSHOT.jar
chown hadoop WordCount-1.0-SNAPSHOT.jar

验证: 查看jar包的归属者

ll

2.下载数据集words.dat到/test目录下

wget https://course-public-resources-1252758970.cos.ap-chengdu.myqcloud.com/%E5%AE%9E%E6%88%98%E8%AF%BE/202001bigdata/2-mapreduce/words.dat

3.同样改变words.dat属主为hadoop。

chown hadoop words.dat

验证:查看当前文件夹下words.dat的属主是否变更。

ll

4.切换至hadoop用户,上传words.dat文件至HDFS的/test目录下(执行时没有任何输出,图示输出仅为日志配置信息)。

su - hadoop

hdfs dfs -mkdir /test

hdfs dfs -put /test/words.dat /test

上传成功后,使用hadoop命令运行jar包,使用命令如下:

hadoop jar <jar包名称.jar> <主类> <输入文件(HDFS)> <输出路径(HDFS)>

hadoop jar WordCount-1.0-SNAPSHOT.jar com.test.wordcount.WordCount /test/words.dat  /test/output

验证:直接查看输出目录及文件结果,使用命令如下:

hdfs dfs -ls /test/output

下图为查看查看/test/output/目录下内容:

查看输出结果内容:

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

3、查看任务运行记录

1.在控制台找到组件管理,点击YARN原生WebUI访问地址。注意,第一次访问需要输入用户名(root)和密码(EMR登录密码)。

2.进入YARN页面后可以查看程序名称,运行时间,程序运行状态等信息。

至此,您已完成了实验的全部任务。相信您已经掌握了MapReduce的基本开发和部署流程,您还可以参考官方文档,体验hadoop的其他功能。

5. 注意事项

如实验资源无需保留,请在实验结束后及时销毁,以免产生额外费用。

6. FAQ

【问题】在任务2中,执行编译打包失败。

maven报错:不再支持源选项 5。请使用 7 或更高版本。

【解决】pom.xml文件中增加maven编译的jdk版本设置,maven.compiler.source和maven.compiler.target,另外java.version最好也加上。

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>