第三章、Hadoop基础操作

目录结构:

1.查看Hadoop集群的基本信息

    1.1 查询集群的存储系统信息

    1.2 查询系统的计算资源信息

2.上传文件到HDFS目录

    2.1 了解HDFS文件系统

    2.2 掌握HDFS的基本操作

    2.3 任务实现

3.运行首个MapReduce任务

    3.1 了解Hadoop官方的示例程序包

    3.2 提交MapReduce任务给集群运行

4.管理多个MapReduce任务

    4.1 查询MapReduce任务

    4.2 中断MapReduce任务

5.小结

6.课后练习


主要背景:是统计某网站的用户登录次数,整个任务体系包括检查Hadoop集群资源、文件存储、分布式计算调用及任务监控等。

1.查看Hadoop集群的基本信息

    Hadoop集群的数据存储是通过HDFS来实现的。HDFS是由一个NameNode和多个DataNode组成,构成了一个分布式的文件系统。通常有两种方式查看HDFS文件系统的信息,分别是命令行方式浏览器方式

    Hadoop集群的计算资源也是分布在集群的各个节点上,通过ResourceManager与NodeManager来协同调配。一般可以通过浏览器访问ResourceManager的监控服务来查询Hadoop集群的计算资源。

    1.1 查询集群的存储系统信息

        (1)HDFS的监控服务通过NameNode的端口50070来访问,我们可以通过此界面看到运行情况

hadoop入门 hadoop 教程_HDFS

        (2)通过命令行也可以查询HDFS信息。在集群服务器的终端,输入相关查询命令

hdfs dfsadmin -report [-live] [-dead] [-decommissioning]

            -live 输出在线节点基本信息及相关数据统计

            -dead 输出失效节点的基本信息及相关数据统计

            -decommissioning 停用节点的基本信息及相关数据统计

        

    1.2 查询系统的计算资源信息

        (1)通过ResourceManager可以方便地查询目前集群上的计算资源信息。进入8088端口:

hadoop入门 hadoop 教程_hdfs_02

        (2)进入8042端口查看节点的各项资源信息:

hadoop入门 hadoop 教程_hdfs_03

        根据以上显示的信息,就可以初步了解到当前集群的计算资源情况,主要包括集群上的可用计算节点、可用CPU核心与内存,以及各个节点自身的CPU及内存资源。

2.上传文件到HDFS目录

    2.1 了解HDFS文件系统

        HDFS是一个类Linux的独立的文件系统,其跟我们的了解操作系统目录类似。(可以通过web端查看文件目录信息)

hadoop入门 hadoop 教程_HDFS_04

    2.2 掌握HDFS的基本操作

        对于HDFS文件系统的基本操作,可以通过HDFS命令来实现,在终端,输入“hdfs dfs”命令,就可以完成对HDFS目录及文件的大部分管理操作,包括创建新目录、上传与下载文件、查看文件内容、删除文件等。

        (1)创建新目录/user/dfstest

            直接在终端输入 hdfs dfs 就可以得到提示的命令:

hadoop入门 hadoop 教程_文件系统_05

        然后我们执行创建目录路径的命令:

        注意,此命令只能主机创建目录,所以我们可以加-p来补全中间并不存在的目录结构:

hadoop入门 hadoop 教程_hdfs_06

hdfs dfs -mkdir -p /user/test/example

hadoop入门 hadoop 教程_hadoop入门_07

         然后我们在根目录下查看一下我们创建的hdfs文件目录:   

hdfs dfs -ls [path]     //因为hdfs文件系统不同于Linux,所以要用hdfs命令才能看到 

//一定要注意一下,如果没有指定path,系统会自动的定向到path=/home/[username],因为我们并没有此目录,所以系统找不到,我们要指定path,根目录就直接用 / 即可。

hadoop入门 hadoop 教程_文件系统_08

         (2)上传文件与下载文件

            再创建一个新的文件夹,用于做测试

hadoop入门 hadoop 教程_文件系统_09

            ①上传文件

            测试任务:利用 hdfs 命令把集群服务器节点上的本地文件 test1.txt 上传到 HDFS目录 /user/dfstest中

            命令:

hdfs dfs [-copyFromLocal [-f][-p][-l] <localsrc> <dst> ]
//将文件从本地系统复制到HDFS文件系统,主要参数<localsrc>为本地路径,<dst>为要复制到的目的路径

hdfs dfs [-moveFromLocal <localsrc> <dst>]
//将文件从本地文件系统移动到HDFS文件系统,主要参数<localsrc>为本地路径,<dst>为要移动到的目的路径

hdfs dfs [-put [-f][-p][-l] <localsrc> <dst>]
//将文件从本地文件系统上传到HDFS文件系统,主要参数<localsrc>为本地路径,<dst>为要上传到的目的路径

hadoop入门 hadoop 教程_文件系统_10

            ②下载文件

            同样,我们也可以从HDFS中下载需要的文件

            命令:

hdfs dfs [-copyTolocal [-p][-ignoreCrc][-crc] <src> <localdst>]
//将文件从HDFS文件系统复制到本地文件系统,主要参数<src>为HDFS文件系统路径,<localdst>为本次存放文件路径

hdfs dfs [-get [-p][-ignoreCrc][-crc] <src> <localdst>]
//获取HDFS文件系统上指定路径的文件到本地文件系统,主要参数<src>为HDFS文件系统路径,<localdst>为本次存放文件路径

        (3)查看文件内容

            查看HDFS系统中的文件内容:

            命令:

hdfs dfs [-cat [-ignoreCrc] <src>]
//查看HDFS文件内容,<src>指定文件路径

hdfs dfs [-tail [-f] <file>]
//查看HDFS最后1024字节,<file>指定文件路径

        示例:

hadoop入门 hadoop 教程_hadoop入门_11

        (4)删除文件或目录

hdfs dfs [-rm [-f][-r][-skipTrash] <src>]
//删除HDFS上的文件,主要参数-r用于递归删除,<src>指定删除的文件路径

hdfs dfs [-rmdir [--ignore-fail-on-non-empty] <dir>]
//如果删除的是一个目录,可以用此命令,主要参数<dir>指定目录路径

            示例:

hadoop入门 hadoop 教程_文件系统_12

    2.3 任务实现

        (1)把email_log.txt传输到master的/testhadoop目录下

hadoop入门 hadoop 教程_hadoop入门_13

        (2)将文件上传到HDFS文件系统的/user/dftest目录下

hadoop入门 hadoop 教程_hadoop入门_14

        (3)在web端单击 email_log.txt 检查文件内容

hadoop入门 hadoop 教程_文件系统_15

            我们可以看到文件分为两个块来存储(文件大小216M),每个文件块都有3个副本,分别存储在3个不同的数据节点上。

3.运行首个MapReduce任务

    要求对HDFS文件目录中的数据文件/user/root/email_log.txt进行计算处理,统计出每个用户的登录次数,即可以等同于求出每个email出现的次数,可以进一步抽象为统计每个单词出现的频次。在Hadoop集群上执行程序包,即提交一个MapReduce任务,通常使用hadoop jar命令完成。

    3.1 了解Hadoop官方的示例程序包

        在集群服务器本地目录:“$HADOOP_HOME/share/hadoop/mapreduce/ ”中可以发现示例程序包 “hadoop-mapreduce-examples-2.7.7.jar”,这个程序包封装了一些常用的测试模块,内容如下:

multifilewc

统计多个文件中单词的数量

pi

应用quasi-Monte Carlo算法来估算圆周率π的值

randomtextwriter

在每个数据节点随机生成一个10GB的文本文件

wordcount

对输入文件的单词进行频次统计

wordmean

计算输入文件中单词的平均长度

wordmedian

计算输入文件中单词长度的中位数

wordstandarddeviation

计算输入文件中单词长度的标准差

        在本次测试中,使用wordcount对email_log.txt文件中的数据进行登录次数统计。

    3.2 提交MapReduce任务给集群运行

       (1) 提交MapReduce任务时,hadoop jar 命令用法:

hadoop jar <jar> [mainClass] args

        下面结合实例来对各个参数进行说明:

hadoop jar hadoop-mapreduce-examples-2.7.7.jar wordcount /user/dftest/email_log.txt /user/dftest/output

//<jar>是jar包的位置,[mainClass是指要使用的已封装好的类],args可以指定一些读取文件和输出文件的存放目录。

        (2)运行日志如下:

hadoop入门 hadoop 教程_文件系统_16

hadoop入门 hadoop 教程_hdfs_17

hadoop入门 hadoop 教程_hadoop入门_18

        (3)结果查看:

hadoop入门 hadoop 教程_文件系统_19

        我们可以看到,在output文件中生成了两个新文件:一个是_SUCCESS,这是一个标识文件,表示这个任务执行完成;另一个是part-r-00000,即任务执行完成后产生的结果文件。

        查看part-r-00000内容:

hadoop入门 hadoop 教程_hdfs_20

        任务基本完成 ^_^ 。

4.管理多个MapReduce任务

    Hadoop是一个多任务系统,可以同时为多个用户、多个作业处理多个数据集。对于提交到Hadoop集群的多个任务,如何进行管理呢,比如:如何知道集群完成了哪些任务;执行结果是成功还是失败;怎么检查任务的实际执行情况;如果某个任务执行时间过长,如何中断它?

    4.1 查询MapReduce任务

        (1)本例中用示例程序包内的PI类来执行估计π的值

hadoop jar hadoop-mapreduce-examples-2.7.7.jar pi 10 100

//后面两个参数代表Map数量与每个Map的测算次数,参数的值越大,计算出来的结果精度越高

        (2)执行日志:

hadoop入门 hadoop 教程_hdfs_21

hadoop入门 hadoop 教程_hadoop入门_22

        (3)查看刚刚提交的MapReduce任务的计算资源使用情况:

        ①在此页面我们可以实时看到集群资源的使用情况(因为执行完成,所以参数为初始参数)

hadoop入门 hadoop 教程_HDFS_23

        ②资源管理器显示的MapReduce任务列表:

hadoop入门 hadoop 教程_文件系统_24

        ③查看任务的详细信息:

hadoop入门 hadoop 教程_文件系统_25

        (4)提交多任务:

            同时启动集群的两个服务器终端,依次提交两个作业:wordcount和计算pi值

            我们可以观察集群上的计算资源使用情况,有一个作业在运行中,占用了大部分的计算资源,另一个作业在等待状态(等待给它分配计算资源,当计算资源满足后,它才会开始执行)。

    4.2 中断MapReduce任务

        对已提交的MapReduce任务,在某些特殊情况下需要中断它,比如发现程序有异常、某个任务执行时间过长、占用大量计算资源等。

        可以通过web界面上面的Application 页面选择界面上的选项“Kill Application”,选择确定即可中断该任务,再次刷新页面可以看到该任务已被终止,等待中的任务执行。

5.小结

    本章主要介绍了Hadoop的基础操作知识,结合实际任务及多个实例,使我对Hadoop集群的文件操作系统与计算资源,以及提交MapReduce任务有了初步的了解。

6.小练习

C

        A.覆盖原目录                                B.自动创建新目录                        C. 报错并终止任务                           D. 以上都不是   

 

 

下一章将介绍MapReduce编程入门 ^_^ 。

人生的奔跑不在于瞬间的爆发,而在于途中的坚持。