Ubuntu的安装至文件MapReduce处理

一、在Windows中使用VirtualBox安装Ubuntu

1.安装前的准备

(1)打开VirtualBox,点击“创建”按钮,创建一个虚拟机
     给虚拟机命名,选择操作系统,版本
     如果您选择的系统是32位Ubuntu,那么版本请选择“Ubuntu (32 bit)”
     如果您选择的系统是64位Ubuntu,那么版本请选择“Ubuntu (64 bit)”
     如果界面中有“文件夹”选项,则在“文件夹”后面可以设置为本地磁盘目录,比如“D:\”。

在这里插入图片描述

(2)选择内存大小
     因为笔者的电脑总内存为4GB,因此这里划分1GB的内存给Ubuntu(实际上在这种配置运行虚拟机以后,仍会稍显卡顿,
     建议电脑总内存增加到8GB以上)。如果你电脑上的总内存有8GB,那么可以划分3GB内存给Ubuntu,这样运行会快很多。

在这里插入图片描述

(3)创建虚拟硬盘

在这里插入图片描述

(4)选择虚拟硬盘文件类型VDI

在这里插入图片描述

(5)虚拟硬盘选择动态分配

在这里插入图片描述

(6)选择文件存储的位置和容量大小
如果只是学习hadoop,那么认8G容量是够用的。但是考虑到读 者可能安装其他应用软件,
因此这里划分30GB用于文件存储(如 果少于30GB,后期会出现磁盘空间不够的情况)。

在这里插入图片描述

(7)点击创建就可以

2. 安装Ubuntu

(1)选择下载的Ubuntu LTS 14.04的ISO映像文件
进入存储设置界面后,点击没有盘片,再点击光盘按钮,选择一个虚拟光驱,添加上面您下载的Ubuntu LTS 14.04 ISO映像文件

在这里插入图片描述

(2)选择刚创建的虚拟机Ubuntu,点击“启动”按钮
启动如果看到下面的界面,那么请下拉选项选择你刚才选择的ISO文件。(如果没有出现此界面,直接跳往下一步即可)
启动看到Ubuntu 的安装欢迎界面,选择你想用的语言,推荐使用中文(简体)

在这里插入图片描述

(3)检查是否连接网络,是否安装第三方软件
直接点击“继续”按钮。

在这里插入图片描述

(4)确认安装类型
我们选择”其他选项”,在点击继续
安装完成后,选择时区
时区选择认即可,点击“继续”

在这里插入图片描述

(5)键盘布局
左右栏目都选择汉语即可

在这里插入图片描述

(6)设置用户名和密码
建议选择“登录时需要密码”选项。由于我们现在处于学习阶段,不需要考虑安全问题,密码建议使用一位的密码,
这样在安装软件需要输入密码的时候也比较方便。

在这里插入图片描述

(7)点击继续,现在安装过程,系统会自动安装,不要点击skip,可以泡杯咖啡,等候系统自动安装完成。
安装完成,重启安装终于完成,点击“现在重启”即可。“现在重启”只是重启虚拟机系统的运行,并不是重启Windows系统。

在这里插入图片描述


在这里插入图片描述

二、Hadoop安装教程_单机/伪分布式配置

1.创建hadoop用户

(1)首先按 ctrl+alt+t 打开终端窗口,输入如下命令创建新用户 :
$ sudo useradd -m hadoop -s /bin/bash
(2)接着使用如下命令设置密码,可简单设置为 hadoop,按提示输入两次密码:
$ sudo passwd hadoop
(3)可为 hadoop 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题:
$ sudo adduser hadoop sudo
(4)最后注销当前用户(点击屏幕右上角的齿轮,选择注销),返回登陆界面。在登陆界面中选择刚创建的 hadoop 用户进行登陆。

2.更新apt

(1)用 hadoop 用户登录后,我们先更新一下 apt,后续我们使用 apt 安装软件,如果没更新可能有一些软件安装不了。
按 ctrl+alt+t 打开终端窗口,执行如下命令:
$ sudo apt-get update
(2)后续需要更改一些配置文件,我比较喜欢用的是 vim(vi增强版,基本用法相同),
建议安装一下(如果你实在还不会用 vi/vim 的,请将后面用到 vim 的地方改为 gedit,
这样可以使用文本编辑器进行修改,并且每次文件更改完成后请关闭整个 gedit 程序,否则会占用终端):
$ sudo apt-get install vim
(3)安装软件时若需要确认,在提示处输入 y 即可

在这里插入图片描述

3.安装SSH、配置SSH无密码登陆

(1)集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 认已安装了 SSH client,此外还需要安装 SSH server:
$ sudo apt-get install openssh-server
(2)安装后,可以使用如下命令登陆本机:
$ ssh localhost
(3)此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 hadoop,这样就登陆到本机了。

在这里插入图片描述

(4)但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。
首先退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成 密钥,并将密钥加入到授权中:
$ exit 
$ cd ~/.ssh/ 
$ ssh-keygen -t rsa
$ cat ./id_rsa.pub >> ./authorized_keys
(5)此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了,如下图所示。

在这里插入图片描述

4.安装Java环境

(1)第1种安装JDK方式(手动安装,推荐采用本方式)
需要按照下面步骤来自己手动安装JDK1.8。
我们已经把JDK1.8的安装包jdk-8u162-linux-x64.tar.gz放在了百度云盘,可以点击   这里到百度云盘下载JDK1.8安装包(提取码:99bg)。请把压缩格式的文件jdk-8u162-linux-x64.tar.gz下载到本地电脑,假设保存在“/home/linziyu/Downloads/”目录下。

在Linux命令行界面中,执行如下Shell命令(注意:当前登录用户名是hadoop):

$ cd /usr/lib
$ sudo mkdir jvm
$ cd ~
$ cd Downloads
$ sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm 
(2)上面使用了解压缩命令tar,如果对Linux命令不熟悉,可以参考常用的Linux命令用法。
JDK文件解压缩以后,可以执行如下命令到/usr/lib/jvm目录查看一下:
$ cd /usr/lib/jvm
$ ls
(3)可以看到,在/usr/lib/jvm目录下有个jdk1.8.0_162目录。
下面继续执行如下命令,设置环境变量:
$ cd ~
$ vim ~/.bashrc
(4)上面命令使用vim编辑器(查看vim编辑器使用方法)打开了hadoop这个用户的环境变量配置文件,请在这文件的开头位置,添加如下几行内容:export 
JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLAsspATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
(5)保存.bashrc文件退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:
$ source ~/.bashrc
(6)这时,可以使用如下命令查看是否安装成功:
$ java -version
(7)如果能够在屏幕上返回如下信息,则说明安装成功:

在这里插入图片描述

5.安装 Hadoop 2

(1)我们选择将 Hadoop 安装至 /usr/local/ 中:
$ sudo tar -zxf ~/下载/hadoop-2.10.0.tar.gz -C /usr/local 
$ cd /usr/local/
$ sudo mv ./hadoop-2.10.0/ ./hadoop
$ sudo chown -R hadoop ./hadoop 
(2)Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
$ cd /usr/local/hadoop
$ ./bin/hadoop version

6.Hadoop单机配置(非分布式)

(1)Hadoop 认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。
现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。
在此我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。
$ cd /usr/local/hadoop
$ mkdir ./input
$ cp ./etc/hadoop/*.xml ./input
$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
$ cat ./output/* 
(2)执行成功后如下所示,输出了作业的相关信息,输出的结果是符合正则的单词 dfsadmin 出现了1次

在这里插入图片描述


(3)注意,Hadoop 认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除

$ rm -r ./output

7.Hadoop伪分布式配置

(1)Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 Datanode,同时,读取的是 HDFS 中的文件.。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
修改配置文件 core-site.xml (通过 gedit 编辑会比较方便: gedit ./etc/hadoop/core-site.xml),将当中的
<configuration>
</configuration>
修改为下面配置:
<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>
同样的,修改配置文件 hdfs-site.xml:
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>
(2)配置完成后,执行 NameNode 的格式化:
$  cd /usr/local/hadoop
$  ./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。

在这里插入图片描述

 如果在这一步时提示 Error: JAVA_HOME is not set and Could not be found. 的错误,
 则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。如果已经按照前面教程在.
 bashrc文件中设置了JAVA_HOME,还是出现 Error: JAVA_HOME is not set and Could not be found. 的错误,那么,请到hadoop的安装目录修改配置文件
 “/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export  
 JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。

(3)接着开启 NameNode 和 Datanode 守护进程。
$  cd /usr/local/hadoop
$  ./sbin/start-dfs.sh
若出现如下SSH提示,输入yes即可。

在这里插入图片描述

8.运行Hadoop伪分布式实例

(1)上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。
要使用 HDFS,首先需要在 HDFS 中创建用户目录:
$  ./bin/hdfs dfs -mkdir -p /user/hadoop
(2)接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,
即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,
因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:
$  ../bin/hdfs dfs -mkdir input
$  ./bin/hdfs dfs -put ./etc/hadoop/*.xml input
(3)复制完成后,可以通过如下命令查看文件列表:
$  ./bin/hdfs dfs -ls input
(4)伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。
$  ../bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

(5)查看运行结果的命令(查看的是位于 HDFS 中的输出结果):

在这里插入图片描述

结果如下,注意到刚才我们已经更改了配置文件,所以运行结果不同。
    (6)我们也可以将运行结果取回到本地:
$  ..rm -r ./output 
$ ./bin/hdfs dfs -get output ./output 
$ cat ./output/*
Hadoop 运行程序时,输出目录不能存在,否则会提示错误 
“org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory 
hdfs://localhost:9000/user/hadoop/output already exists” ,
因此若要再次执行,需要执行如下命令删除 output 文件夹:
$  ./bin/hdfs dfs -rm -r output 
(7)若要关闭 Hadoop,则运行
$  ./sbin/stop-dfs.sh

三、分布式文件系统HDFS

在学习HDFS编程实践前,我们需要启动Hadoop。执行如下命令
$  cd /usr/local/hadoop
$  ./sbin/start-dfs.sh

1.利用Shell命令与HDFS进行交互

1.目录操作

(1)需要注意的是,Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录。
本教程全部采用hadoop用户登录Linux系统,因此,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:
$ cd /usr/local/hadoop
$  ./bin/hdfs dfs –mkdir –p /user/hadoop
(2)该命令中表示在HDFS中创建一个“/user/hadoop”目录,“–mkdir”是创建目录的操作,
“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,
因此必须使用参数“-p”,否则会出错。
“/user/hadoop”目录就成为hadoop用户对应的用户目录,
可以使用如下命令显示HDFS中与当前用户hadoop对应的用户目录下的内容
$ ./bin/hdfs dfs –ls .
(3)该命令中,“-ls”表示列出HDFS某个目录下的所有内容,“.”表示HDFS中的当前用户目录,
也就是“/user/hadoop”目录,因此,上面的命令和下面的命令是等价的:
$ ./bin/hdfs dfs –ls /user/hadoop

(4)如果要列出HDFS上的所有目录,可以使用如下命令:

$ ./bin/hdfs dfs –ls
(5)下面,可以使用如下命令创建一个input目录:
$ ./bin/hdfs dfs –mkdir input

(6)在创建个input目录时,采用了相对路径形式,实际上,这个input目录创建成功以后,
它在HDFS中的完整路径是“/user/hadoop/input”。如果要在HDFS的根目录下创建一个名称为input的目录,则需要使用如下命令:

$ ./bin/hdfs dfs –mkdir /input
(7)可以使用rm命令删除一个目录,比如,可以使用如下命令删除刚才在HDFS中创建的“/input”目录(不是“/user/hadoop/input”目录):
$ ./bin/hdfs dfs –rm –r /input

2.文件操作

(1)在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。

首先,使用vim编辑器,在本地Linux文件系统的“/home/hadoop/”目录下创建一个文件myLocalFile.txt,里面可以随意输入一些单词,比如,输入如下三行:

Hadoop
Spark
XMU DBLAB
(2)然后,可以使用如下命令把本地文件系统的“/home/hadoop/myLocalFile.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的“/user/hadoop/input/”目录下:
$ ./bin/hdfs dfs -put /home/hadoop/myLocalFile.txt  input
(3)可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:
$ ./bin/hdfs dfs –ls input
该命令执行后会显示类似如下的信息:
Found 1 items   
-rw-r--r--   1 hadoop supergroup         36 2017-01-02 23:55 input/ myLocalFile.txt
(4)下面使用如下命令查看HDFS中的myLocalFile.txt这个文件内容
$ ./bin/hdfs dfs –cat input/myLocalFile.txt
(5)下面把HDFS中的myLocalFile.txt文件下载到本地文件系统中的“/home/hadoop/下载/”这个目录下,命令如下:
$ ./bin/hdfs dfs -get input/myLocalFile.txt  /home/hadoop/下载
(6)可以使用如下命令,到本地文件系统查看下载下来的文件myLocalFile.txt:
$ cd ~
$ cd 下载
$ ls
$ cat myLocalFile.txt
(7)最后,了解一下如何把文件从HDFS中的一个目录拷贝到HDFS中的另外一个目录。
比如,如果要把HDFS的“/user/hadoop/input/myLocalFile.txt”文件,拷贝到HDFS的另外一个目录“/input”中(注意,这个input目录位于HDFS根目录下),可以使用如下命令:
$ ./bin/hdfs dfs -cp input/myLocalFile.txt  /input

2.利用Java API与HDFS进行交互

打开Linux自带的Firefox浏览器,点击此链接HDFS的Web界面,即可看到HDFS的web管理界面

在这里插入图片描述

3.利用Java API与HDFS进行交互

1.在Ubuntu中安装Eclipse

(1)利用Ubuntu左侧边栏自带的软件中心安装软件,在Ubuntu左侧边栏打开软件中心
打开软件中心后,呈现如下界面 
在软件中心搜索栏输入“ec”,软件中心会自动搜索相关的软件
点击如下图中Eclipse,进行安装
安装需要管理员权限,Ubuntu系统需要用户认证,弹出“认证”窗口,请输入当前用户登录密码

在这里插入图片描述

(2)ubuntu便会进入如下图的安装过程中,安装结束后安装进度条便会消失。
 点击Ubuntu左侧边栏搜索工具,输入“ec”,自动搜索已经安装好的相关软件,打开Eclipse

2.在Eclipse创建项目

第一次打开Eclipse,需要填写workspace(工作空间),用来保存程序所在的位置,这里按照认,不需要改动,如下图
点击“OK”按钮,进入Eclipse软件。

在这里插入图片描述

可以看出,由于当前是采用hadoop用户登录了Linux系统,因此,认的工作空间目录位于hadoop用户目录“/home/hadoop”下。

Eclipse启动.

在这里插入图片描述

选择“File->New->Java Project”菜单,开始创建一个Java工程

在这里插入图片描述

3.为项目添加需要用到的jar包

进入下一步的设置以后,需要在这个界面中加载该Java工程所需要用到的jar包,
这些jar包中包含了可以访问HDFS的Java API。这些jar包都位于Linux系统的Hadoop安装目录下,
对于本教程而言,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,

在这里插入图片描述

在该界面中,上面的一排目录按钮(即“usr”、“local”、“hadoop”、“share”、“hadoop”、“mapreduce”和“lib”),当点击某个目录按钮时,就会在下面列出该目录的内容
为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下jar包
(1)”/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar;
(2)/usr/local/hadoop/share/hadoop/common/lib”目录下的所有jar包
(3)“/usr/local/hadoop/share/hadoop/hdfs”目录下的haoop-hdfs-2.7.1.jar和haoop-hdfs-nfs-2.7.1.jar;
(4)“/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有jar包
比如,如果要把“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar添加到当前的Java工程中,可以在界面中点击目录按钮,进入到common目录,然后,界面会显示出common目录下的所有内容(如图4-7所示)。

在这里插入图片描述

请在界面中用鼠标点击选中hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar,然后点击界面右下角的“确定”按钮,就可以把这两个jar包增加到当前Java工程中,出现的界面如图4-8所示。

在这里插入图片描述

从这个界面中可以看出,hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar已经被添加到当前Java工程中。然后,按照类似的操作方法,可以再次点击“Add External JARs…”按钮,把剩余的其他jar包添加进来。需要注意的是,当需要选中某个目录下的所有jar包时,可以使用“Ctrl+A”组合键进行全选操作。全部添加完毕以后,就可以点击界面右下角的“Finish”按钮,完成Java工程HDFSExample的创建。

4.编写Java应用程序代码

(1)下面编写一个Java应用程序,用来检测HDFS中是否存在一个文件。
请在Eclipse工作界面左侧的“Package Explorer”面板中(如图4-9所示),找到刚才创建好的工程名称“HDFSExample”,
然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New->Class”菜单。
选择“New->Class”菜单以后会出现如图4-10所示界面。

在这里插入图片描述

(2)在该界面中,只需要在“Name”后面输入新建的java类文件名称,这里采用名称“HDFSFileIfExist”,其他都可以采用认设置,然后,点击界面右下角“Finish”按钮

在这里插入图片描述

(3)可以看出,Eclipse自动创建了一个名为“HDFSFileIfExist.java”的源代码文件,请在该文件中输入以下代码

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSFileIfExist {
    public static void main(String[] args){
        try{
            String fileName = "test";
            Configuration conf = new Configuration();
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.distributedFileSystem");
            FileSystem fs = FileSystem.get(conf);
            if(fs.exists(new Path(fileName))){
                System.out.println("文件存在");
            }else{
                System.out.println("文件不存在");
            }
 
        }catch (Exception e){
            e.printstacktrace();
        }
    }
}
该程序用来测试HDFS中是否存在一个文件,其中有一行代码
String fileName = "test"
这行代码给出了需要被检测的文件名称是“test”,没有给出路径全称,表示是采用了相对路径,
实际上就是测试当前登录Linux系统的用户hadoop,在HDFS中对应的用户目录下是否存在test文件,也就是测试HDFS中的“/user/hadoop/”目录下是否存在test文件

5.编译运行程序

(1)在开始编译运行程序之前,请一定确保Hadoop已经启动运行,如果还没有启动,需要打开一个Linux终端,输入以下命令启动Hadoop:
$ cd /usr/local/hadoop
$ ./sbin/start-dfs.sh
(2)现在就可以编译运行上面编写的代码。可以直接点击Eclipse工作界面上部的运行程序的快捷按钮,当把鼠标移动到该按钮上时,在弹出的菜单中选择“Run As”,继续在弹出来的菜单中选择“Java Application”.

在这里插入图片描述

   (3)在该界面中,需要在“Select type”下面的文本框中输入“HDFSFileIfExist”,Eclipse
就会自动找到相应的类“HDFSFileIfExist-(default package)”(注意:这个类在后面的导出jar包操作中的Launch configuration中会被用到),
然后,点击界面右下角的“OK”按钮,开始运行程序。程序运行结束后,会在底部的“Console”面板中显示运行结果信息(如图4-14所示)。
由于目前HDFS的“/user/hadoop”目录下还没有test文件,因此,程序运行结果是“文件不存在”。同时,“Console”面板中还会显示一些类似“log4j:WARN…”的警告信息,可以不用理会。

在这里插入图片描述

6.应用程序的部署

(1)首先,在Hadoop安装目录下新建一个名称为myapp的目录,用来存放我们自己编写的Hadoop应用程序,可以在Linux的终端中执行如下命令:
$ cd /usr/local/hadoop
$ mkdir myapp
(2)然后,请在Eclipse工作界面左侧的“Package Explorer”面板中,
在工程名称“HDFSExample”上点击鼠标右键,在弹出的菜单中选择“Export”:

在这里插入图片描述

 在该界面中,选择“Runnable JAR file”,然后,点击“Next>”按钮,弹出如图4-17所示界面。
 “Launch configuration”用于设置生成jar包被部署启动时运行的主类,需要在下拉列表中选择刚才配置的类“HDFSFileIfExist-HDFSExample”。
 在“Export destination”中需要设置jar包输出保存到哪个目录,比如,这里设置为“/usr/local/hadoop/myapp/HDFSExample.jar”。
 在“Library handling”下面选择“Extract required libraries into generated JAR”。然后,点击“Finish”按钮,会出现如图4-18所示界面。

在这里插入图片描述

可以忽略该界面的信息,直接点击界面右下角的“OK”按钮,启动打包过程。打包过程结束后,会出现一个警告信息界面,

在这里插入图片描述

(4)可以忽略该界面的信息,直接点击界面右下角的“OK”按钮。
至此,已经顺利把HDFSExample工程打包生成了HDFSExample.jar。
可以到Linux系统中查看一下生成的HDFSExample.jar文件,可以在Linux的终端中执行如下命令:
$ cd /usr/local/hadoop/myapp
$ ls
可以看到,“/usr/local/hadoop/myapp”目录下已经存在一个HDFSExample.jar文件。现在,就可以在Linux系统中,使用hadoop jar命令运行程序,命令如下:
$ cd /usr/local/hadoop
$ ./bin/hadoop jar ./myapp/HDFSExample.jar
或者也可以使用如下命令运行程序:
$ cd /usr/local/hadoop
$ java -jar ./myapp/HDFSExample.jar
(5)命令执行结束后,会在屏幕上显示执行结果“文件不存在”。
至此,检测HDFS文件是否存在的程序,就顺利部署完成了。

四.使用Eclipse编译运行MapReduce程序

1.安装 Hadoop-Eclipse-Plugin

要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 hadoop-eclipse-plugin,可下载 Github 上的 hadoop2x-eclipse-plugin(备用下载地址:http://pan.baidu.com/s/1i4ikIoP)。
下载后,将 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar (还提供了 2.2.0 和 2.4.1 版本)
复制到 Eclipse 安装目录的 plugins 文件夹中,运行 eclipse -clean 重启 Eclipse 即可
(添加插件后只需要运行一次该命令,以后按照正常方式启动就行了)。
$ unzip -qo ~/下载/hadoop2x-eclipse-plugin-master.zip -d ~/下载
$ udo cp ~/下载/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-plugin-2.6.0.jar /usr/lib/eclipse/plugins/
$ /usr/lib/eclipse/eclipse -clean

2.在 Eclipse 中操作 HDFS 中的文件

配置好后,点击左侧 Project Explorer 中的 MapReduce Location (点击三角形展开)就能直接查看 HDFS 中的文件列表了(HDFS 中要有文件,
如下图是 WordCount 的输出结果),双击可以查看内容,右键点击可以上传、下载、删除 HDFS 中的文件,无需再通过繁琐的 hdfs dfs -ls 等命令进行操作了。
以下output/part-r-00000文件记录了输出结果。点击查看HDFS文件系统数据的三种方法可进行扩展学习。

在这里插入图片描述

如果无法查看,可右键点击 Location 尝试 Reconnect 或重启 Eclipse。

3.在 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 这个文件。将如下 WordCount 的代码复制到该文件中。
package org.apache.hadoop.examples;
 
import java.io.IOException;
import java.util.Iterator;
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;
import org.apache.hadoop.util.GenericoptionsParser;
 
public class WordCount {
    public WordCount() {
    }
 
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        String[] otherArgs = (new GenericoptionsParser(conf, args)).getRemainingArgs();
        if(otherArgs.length < 2) {
            System.err.println("Usage: wordcount <in> [<in>...] <out>");
            System.exit(2);
        }
 
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(WordCount.TokenizerMapper.class);
        job.setCombinerClass(WordCount.IntSumReducer.class);
        job.setReducerClass(WordCount.IntSumReducer.class);
        job.setoutputKeyClass(Text.class);
        job.setoutputValueClass(IntWritable.class);
 
        for(int i = 0; i < otherArgs.length - 1; ++i) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
        }
 
        FileOutputFormat.setoutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
        System.exit(job.waitForCompletion(true)?0:1);
    }
 
    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();
 
        public IntSumReducer() {
        }
 
        public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            int sum = 0;
 
            IntWritable val;
            for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
                val = (IntWritable)i$.next();
            }
 
            this.result.set(sum);
            context.write(key, this.result);
        }
    }
 
    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
        private static final IntWritable one = new IntWritable(1);
        private Text word = new Text();
 
        public TokenizerMapper() {
        }
 
        public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
 
            while(itr.hasMoretokens()) {
                this.word.set(itr.nextToken());
                context.write(this.word, one);
            }
 
        }
    }
}

4.通过 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
直接在代码中设置好输入参数。可将代码 main() 函数的 String[] otherArgs = new GenericoptionsParser(conf, args).getRemainingArgs(); 改为:
String[] otherArgs=new String[]{"input","output"}; 
设定参数后,再次运行程序,可以看到运行成功的提示,刷新 DFS Location 后也能看到输出的 output 文件夹。

在这里插入图片描述

相关文章

ubuntu退出redis的示例:指定配置文件方式启动源码redis:roo...
ubuntu中mysql改密码忘了的解决方法:1.在终端中切换到root权...
ubuntu安装mysql失败的解决方法原因:可能是原有的MySQL还有...
使用centos和ubuntu建站的区别有以下几点1.CentOS是Linux发行...
ubuntu图形界面和字符界面切换的方法:可以通过快捷键CTRL+A...
ubuntu中重启mysql失败的解决方法1.首先,在ubuntu命令行中,...