MapReduce编程实践(Hadoop-2.7.2)
MapReduce是谷歌公司的核心计算模型,Hadoop开源实现了MapReduce。MapReduce将复杂的、运行于大规模集群上的并行计算过程高度抽象到了两个函数:Map和Reduce,并极大地方便了分布式编程工作,编程人员在不会分布式并行编程的情况下,也可以很容易将自己的程序运行在分布式系统上,完成海量数据的计算。
本实践所用的环境是Ubuntu16.04、Hadoop-2.7.2,开发工具是Eclipse。
一、启动Hadoop
在学习MapReduce编程实践前,我们需要启动Hadoop。执行如下命令
$ cd /usr/local/hadoop
$ ./sbin/start-dfs.sh #启动hadoop
1.创建用户目录
需要注意的是,Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录。本实践全部采用hadoop用户登录Linux系统,因此,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:
$ cd /usr/local/hadoop
$ ./bin/hdfs dfs –mkdir –p /user/hadoop
该命令中表示在HDFS中创建一个“/user/hadoop”目录,“–mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,因此必须使用参数“-p”,否则会出错。
下面,可以使用如下命令创建一个input目录:
$ ./bin/hdfs dfs –mkdir input
在创建该input目录时,采用了相对路径形式,实际上,这个input目录创建成功以后,它在HDFS中的完整路径是“/user/hadoop/input”。
二、使用MapReduce对单词进行计数
1.上传文件
首先,准备一个txt文件,将其移动到“/home/hadoop/”目录下。本实践使用的txt文件名为File.txt。
然后,可以使用如下命令把本地文件系统的“/home/hadoop/File.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的“/user/hadoop/input/”目录下:
$ ./bin/hdfs dfs -put /home/hadoop/File.txt input
可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:
$ ./bin/hdfs dfs –ls input
该命令执行后会显示类似如下的信息:
Found 1 items
-rw-r--r-- 1 hadoop supergroup 2645484 2020-12-10 23:18 input/File.txt
2.利用Web界面管理HDFS
打开Linux自带的Firefox浏览器,输入localhost:50070,即可看到HDFS的web管理界面。
如图所示,File.txt文件已经被上传到HDFS。
三、在eclipse中创建WordCount项目
1.新建WordCount项目
首先,启动Eclipse,启动以后会弹出如下图所示界面,提示设置工作空间(workspace)。
可以直接采用默认的设置“/home/hadoop/workspace”,点击“OK”按钮。可以看出,由于当前是采用hadoop用户登录了Linux系统,因此,默认的工作空间目录位于hadoop用户目录“/home/hadoop”下。
Eclipse启动以后,呈现的界面如下图所示。
选择“File–>New–>Java Project”菜单,开始创建一个Java工程,弹出如下图所示界面。
在“Project name”后面输入工程名称“WordCount”,选中“Use default location”,让这个Java工程的所有文件都保存到“/home/hadoop/workspace/WordCount”目录下。在“JRE”这个选项卡中,可以选择当前的Linux系统中已经安装好的JDK,比如jdk1.8.0_162。然后,点击界面底部的“Next>”按钮,进入下一步的设置。
2.为项目添加需要用到的JAR包
进入下一步的设置以后,会弹出如下图所示界面。
需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了与Hadoop相关的Java API。这些JAR包都位于Linux系统的Hadoop安装目录下,对于本实践而言,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,弹出如下图所示界面。
在该界面中,上面有一排目录按钮(即“usr”、“local”、“hadoop”、“share”、“hadoop”、“mapreduce”和“lib”),当点击某个目录按钮时,就会在下面列出该目录的内容。
为了编写一个MapReduce程序,一般需要向Java工程中添加以下JAR包:
(1)“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar;
(2)“/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
(3)“/usr/local/hadoop/share/hadoop/mapreduce”目录下的所有JAR包,但是,不包括jdiff、lib、lib-examples和sources目录。
(4)“/usr/local/hadoop/share/hadoop/mapreduce/lib”目录下的所有JAR包。
比如,如果要把“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar添加到当前的Java工程中,可以在界面中点击相应的目录按钮,进入到common目录,然后,界面会显示出common目录下的所有内容。
请在界面中用鼠标点击选中hadoop-common-2.7.2.jar和hadoop-nfs-2.7.2.jar,然后点击界面右下角的“确定”按钮,就可以把这两个JAR包增加到当前Java工程中,出现的界面如下图所示。