初学Hadoop——MapReduce Java API的使用

一、MapReduce简介

MapReduce是面向大数据并行处理的计算模型、框架和平台,它有以下三层含义:

(1) MapReduce是一个基于集群的高性能并行计算平台

它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。

(2) MapReduce是一个并行计算与运行软件框架

它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。

(3) MapReduce是一个并行程序设计模型与方法

它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理

二、实验环境

操作系统:Ubuntu64位
Hadoop版本:Hadoop 2.7.1
Jdk版本:jdk-8u241-linux-x64
Eclipse版本:eclipse3.8

三、使用Eclipse编译运行MapReduce程序

(1)安装eclipse

即我的博客:
“初学Hadoop——HDFS Java API 的使用”
中eclipse的安装。
博客链接:初学Hadoop——HDFS Java API 的使用

(2)安装 Hadoop-Eclipse-Plugin

要在 Eclipse 上编译和运行MapReduce 程序,需要安装 hadoop-eclipse-plugin。

① 进入网站:Hadoop-Eclipse-Plugin
在这里插入图片描述

② 在release中找到hadoop-eclipse-kepler-plugin-2.6.0.jar下载
在这里插入图片描述
③ 将release 中的hadoop-eclipse-kepler-plugin-2.6.0.jar (还提供了2.2.0 和 2.4.1 版本)复制到Eclipse 安装目录的plugins 文件夹中

unzip -qo ~/Downloads/hadoop2x-eclipse-plugin-master.zip -d ~/ Downloads   
# 解压到 ~/ Downloads 中
sudo cp ~/ Downloads/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-plugin-2.6.0.jar /usr/lib/eclipse/plugins/    
# 复制到 eclipse 安装目录的 plugins 目录下

在这里插入图片描述

/usr/lib/eclipse/eclipse -clean    
# 添加插件后需要用这种方式使插件生效

在这里插入图片描述

(3)配置 Hadoop-Eclipse-Plugin

①开启Hadoop

Start-dfs.sh

在这里插入图片描述

② 启动eclipse

在这里插入图片描述

③ 选择perspective选择MapReduce就会出现DFS locations
在这里插入图片描述

④ 配置插件

第一步:选择 Window 菜单下的Preference:
在这里插入图片描述
在这里插入图片描述

会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)

第二步:切换 Map/Reduce 开发视图,选择
Window 菜单下选择 Open Perspective -> Other,弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换:

在这里插入图片描述

第三步:建立与 Hadoop 集群的连接,点击
Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location:

在这里插入图片描述
在这里插入图片描述

在弹出来的 General 选项面板中,General的设置要与 Hadoop 的配置一致。一般两个 Host 值是一样的,如果是伪分布式,填写 localhost 即可,我设置的fs.defaultFS 为 hdfs://localhost:9000,则 DFS Master 的 Port 要改为 9000。Map/Reduce(V2) Master 的 Port 用默认的即可,Location Name 随意填写。

(4) 在 Eclipse 中操作 HDFS 中的文件

借助Eclipse只能进行简单的HDFS操作,如查看,删除,上传,下载。
点击左侧 Project Explorer 中的 MapReduce Location (点击三角形展开)就能直接查看 HDFS 中的文件列表了(HDFS 中要有文件,如下图是 WordCount 的输出结果),双击可以查看内容,右键点击可以上传、下载、删除 HDFS 中的文件,无需再通过繁琐的 hdfs dfs -ls 等命令进行操作了。

以下output/part-r-00000文件记录了输出结果:
在这里插入图片描述

(5) 在 Eclipse 中创建 MapReduce 项目

点击 File 菜单,选择 New -> Project
在这里插入图片描述

会产生以下界面:
在这里插入图片描述
选择 Map/Reduce Project,点击 Next:

在这里插入图片描述

填写 Project name 为WordCount ,其他保持默认设置即可,点击 Finish 就创建好了项目(此时在左侧的 Project Explorer 就能看到刚才建立的项目了):
在这里插入图片描述

右键点击刚创建的 WordCount 项目,选择 New -> Class:

在这里插入图片描述

需要填写两个地方:在 Package 处填写org.apache.Hadoop.examples;在Name 处填写 WordCount:
在这里插入图片描述

创建 Class 完成后,在Project 的 src 中就能看到WordCount.java 这个文件:

在这里插入图片描述
(6)编写程序代码

WordCount代码,分为三部分内容:Driver、Mapper和Reducer。

① Driver内容(main()方法):程序入口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

② Mapper内容:

Mapper共有三个函数,分别是setup、map和cleanup:
Mapper任务启动后首先执行setup函数,用于初始化工作;
map函数针对每条输入键值对执行函数中定义的逻辑处理,并按规定的键值对格式输出;
所有键值对处理完成后,调用cleanup函数,用于关闭资源等操作。
自定义Mapper类继承Mapper,同时继承的Mapper中需要设置输入输出键值对格式。
注意:
输出的键值对格式要和Driver中设置的Mapper输出键值对格式匹配
在这里插入图片描述

③ reducer类:

Reducerr共有三个函数,分别是setup、reduce和cleanup:
Reducer任务启动后首先执行setup函数,用于初始化工作;
reduce函数针对每条输入键值对执行函数中定义的逻辑处理,并按规定的键值对格式输出;
所有键值对处理完成后,调用cleanup函数,用于关闭资源等操作。
在这里插入图片描述

(7) 通过 Eclipse 运行 MapReduce
在运行 MapReduce 程序前,还需要执行一项重要操作(也就是上面提到的通过复制配置文件解决参数设置问题):将/usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中:

cp /usr/local/hadoop/etc/hadoop/core-site.xml~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml~/workspace/WordCount/src
cp /usr/local/hadoop/etc/Hadoop/log4j.properties~/Workspace/WordCount/src

在这里插入图片描述
在这里插入图片描述

没有复制这些文件的话程序将无法正确运行。
复制完成后,务必右键点击 WordCount 选择 refresh 进行刷新(不会自动刷新,需要手动刷新),可以看到文件结构如下所示:
在这里插入图片描述

点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 WordCount.java,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了。不过由于没有指定参数,运行时会提示 “Usage: wordcount “,需要通过Eclipse设定一下运行参数;
右键点击刚创建的 WordCount.java,选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数(如果 Java Application 下面没有 WordCount,那么需要先双击 Java Application)。切换到 “Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。
在这里插入图片描述

或者也可以直接在代码中设置好输入参数。可将代码 main() 函数的
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
改为:String[] otherArgs=new String[]{“input”,“output”};

设定参数后,再次运行程序,可以看到运行成功的提示,刷新 DFS Location 后也能看到输出的output 文件夹。
在使用Eclipse 运行MapReduce 程序时,会读取Hadoop-Eclipse-Plugin 的Advanced parameters 作为Hadoop 运行参数,如果我们未进行修改,则默认的参数其实就是单机(非分布式)参数,因此程序运行时是读取本地目录而不是HDFS 目录,就会提示Input 路径不存在;所以我们需要将配置文件复制到项目中的src 目录,来覆盖这些参数。让程序能够正确运行。
在这里插入图片描述

四、使用命令行编译打包运行自己的MapReduce程序

(1)Hadoop 2.x 版本中的依赖 jar

使用 Hadoop 2.6.0 运行WordCount 实例至少需要如下三个 jar:

$HADOOP_HOME/share/hadoop/common/hadoop-common-2.6.0.jar
$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.0.jar
$HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar

通过命令 hadoop classpath 可以得到运行 Hadoop 程序所需的全部 classpath 信息:
在这里插入图片描述
(2)编译、打包Hadoop MapReduce 程序

将 Hadoop 的classhpath 信息添加到 CLASSPATH 变量中,在~/.bashrc 中增加如下几行:

export HADOOP_HOME=/usr/local/hadoop 
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH

在这里插入图片描述
在这里插入图片描述
执行source ~/.bashrc 使变量生效:
在这里插入图片描述

接着就可以通过 javac 命令编译 WordCount.java 了:
在这里插入图片描述

接着把 .class 文件打包成jar,才能在 Hadoop 中运行:
在这里插入图片描述

打包完成后,运行试试,创建几个输入文件:

在这里插入图片描述
在这里插入图片描述
把本地文件上传到伪分布式HDFS上:
在这里插入图片描述

开始运行:

在这里插入图片描述

出现上面找不到类的错误是因为在代码中设置了package包名,这里也要写全,正确的命令如下:

在这里插入图片描述
在这里插入图片描述

五、MapReduce具体实例

(1)word count

①编写MapReduce阶段Java程序代码WordCount代码,分为三部分内容:Driver、Mapper和Reducer。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、 Mapper内容

Mapper共有三个函数,分别是setup、map和cleanup:
Mapper任务启动后首先执行setup函数,用于初始化工作;
map函数针对每条输入键值对执行函数中定义的逻辑处理,并按规定的键值对格式输出;
所有键值对处理完成后,调用cleanup函数,用于关闭资源等操作。
自定义Mapper类继承Mapper,同时继承的Mapper中需要设置输入输出键值对格式。
注意:
输出的键值对格式要和Driver中设置的Mapper输出键值对格式匹配
在这里插入图片描述

3、 reducer类

Reducerr共有三个函数,分别是setup、reduce和cleanup:
Reducer任务启动后首先执行setup函数,用于初始化工作;
reduce函数针对每条输入键值对执行函数中定义的逻辑处理,并按规定的键值对格式输出;
所有键值对处理完成后,调用cleanup函数,用于关闭资源等操作。
在这里插入图片描述

②在虚拟机的eclipse中编译运行MapReduce程序

1、在eclipse中创建Java工程选择“File->New->Java Project”菜单,开始创建一个Java工程,会弹出如下图所示的界面。
在这里插入图片描述
在“Project name”后面输入工程名称“WrodCount”,选中“Use default location”,让这个Java工程的所有文件都保存到“/home/hadoop/workspace/ WrodCount”目录下。在“JRE”这个选项卡中,可以选择当前的Linux系统中已经安装好的JDK。然后,点击界面底部的“Next>”按钮,就创建了一个“WrodCount”java工程:
在这里插入图片描述

2、在eclipse中创建class文件
在Eclipse工作界面左侧的“Package Explorer”面板中,找到刚才①中创建好的工程名称“WrodCount”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New->Class”菜单。
在这里插入图片描述

在“Name”后面输入新建的Java类文件的名称,这里采用名称“WrodCount”,其他都可以采用默认设置,然后,点击界面右下角“Finish”按钮。
可以看出,Eclipse自动创建了一个名为“HDFSFileIfExist.java”的源代码文件:
在这里插入图片描述

3、将编写的MapReduce代码写入上面创建的“WrodCount.java”源代码文件中:

在这里插入图片描述

4、在eclipse中编译运行程序:
在开始编译运行程序之前,一定要确保Hadoop已经启动运行,如果还没有启动,需要打开一个Linux终端,输入以下命令启动Hadoop:

start-dfs.sh

start-all.sh

在这里插入图片描述

用“jps”看各节点工作情况:

在这里插入图片描述

然后就可以编译运行程序。
可以直接点击Eclipse工作界面上部的运行程序的快捷按钮,当把鼠标移动到该按钮上时,在弹出的菜单中选择“Run As”,继续在弹出来的菜单中选择“Run on Hadoop”,如下图所示。
在这里插入图片描述

然后,会弹出如下图所示的界面:

在这里插入图片描述

选择要运行的WordCount.java文件。
运行时控制台的输出:
在这里插入图片描述

查看输出文件:

在这里插入图片描述

可以在终端查看统计出的总共366个不同的单词以及它的出现次数。
也可以直接在eclipse中查看:
在这里插入图片描述

③把Java应用程序生成JAR包,部署到Hadoop平台上(终端编译运行程序需要使用jar包)

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

在这里插入图片描述

在该界面中,选择“Runnable JAR file”,然后,点击“Next>”按钮,弹出如下图所示的界面:

在这里插入图片描述

在该界面中,“Launch configuration”用于设置生成的JAR包被部署启动时运行的主类,需要在下拉列表中选择刚才配置的类“WordCount -WordCount”。在“Export destination”中需要设置JAR包要输出保存到哪个目录,这里设置为“/usr/local/hadoop/myapp/WordCount3.jar”。其中WordCount3.jar为jar包名字,不能重复。在“Library handling”下面选择“Extract required libraries into generated JAR”。然后,点击“Finish”按钮,会出现如下图所示的界面:
在这里插入图片描述
在这里插入图片描述

可以忽略这两个界面的信息,直接点击界面右下角的“OK”按钮。

至此,已经顺利把WordCount工程打包生成了WordCount3.jar。可以到Linux系统中查看一下生成的WordCount3.jar文件:
在这里插入图片描述
也可以直接在文件中查看:

在这里插入图片描述

④ 在终端编译运行java程序对应生成的jar包

生成jar包后,就可以直接在终端中使用命令编译运行了:
使用hadoop jar命令运行程序,命令如下:

hadoop jar WordCount3.jar

因为输出文件已经存在的话,程序就会出现下面的运行结果:

在这里插入图片描述

所以需要先删除输出文件:

在这里插入图片描述
在这里插入图片描述

然后再运行命令:

hadoop jar WordCount3.jar

在这里插入图片描述

注意:需要显示的指出输入文件和输出文件的路径

查看结果(输出文件):

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45154565/article/details/109188900