前面我们已经配置了一套HADOOP环境,环境虽然有了,但不少朋友恐怕心头依旧茫然,不知道接下来该做什么,不要着急,这主要是因为我们(我字重读)对HADOOP的认知还停留在概念的层面,所知有限自然不明白该如何着手。其实HADOOP没有那么深奥,老话形容说就是层窗户纸,看着朦朦胧胧如雾里看花不知所以,其实一点儿就透。下面我给大家点点,要是没点儿透……您家窗户上装的那是玻璃呀。

HADOOP是套数据分析平台(个人理解),如大家所知,HADOOP由两大核心模块组成:HDFS+MapReduce,我们前面搭建的HADOOP环境其实也正是这两部分。那么如何使用呢,简单讲就是通过MapReduce方法分析HDFS中存储的数据。从这点来看跟传统的数据计算/分析系统没有什么区别,只是说 HADOOP做的很专业,使得用户无须关注任务分解和计算能力扩充方面(都是针对大数据量)的因素可能造成的困扰,而把重心放在实现自己的业务需求上。

对于用户来说,就是把原始数据存储到HDFS中,通过MapReduce方法进行分析。所以,在本节我们就来实战看看怎么向HDFS中存取文件,以及如何使用MapReduce功能进行数据分析。

    提示:以上属个人理解,比较片面,大家可以相信但不能全信。

1、HDFS功能测试

HDFS是一套分布式的文件系统,其数据保存在各datanode上,datanode可能有几十上百或数千个,但对于用户来说完全透明,即不需要关心数据到底写在哪个节点上,也不需要关注应该在哪个节点上进行读写,在任意节点上操作均可,它所看到的数据也始终是一份。

想要操作HDFS文件系统进行读写,从大的类别上可以分成两种:通过程序的API (比如java),或者通过命令行。

    提示:此处理解有限,可能不严谨,也许仍有其它方式向HDFS中读写数据。

需要强调的是,我们这里所说的HDFS文件系统,可并不是我们前面在配置HADOOP环境时,通过conf/hdfs-site.xml文件配置过HDFS的数据节点存储路径哟,比如这段:

    <property>

            <name>dfs.data.dir</name>

            <value>/data2/hadoop/data</value>

            <final>true</final>

    </property>

同学,这段配置指定的是数据节点的存储路径不假,但并不是HDFS文件系统哟,这里所指定的是本节点HDFS映射文件的路径。怎么理解呢,简单讲,如果您在这个路径下创建文件,HDFS里是看不到的;同理,在HDFS中创建的文件,操作系统的文件系统中也看不到(也许能够看到一堆64M大小的映射文件)。

我们想要对HDFS文件系统进行读写操作,只有采用前面说的两种方式。

1.1 命令行方式操作HDFS

命令行方式就是通过hadoop命令附加dfs选项。我们可以直接执行该命令并附加dfs选项,不指定任何参数的情况下,会输出一些简要的帮助信息,如下:

    [grid@hdnode1 ~]$ hadoop dfs

    Usage: java FsShell

               [-ls <path>]

               [-lsr <path>]

               [-du <path>]

               [-dus <path>]

               [-count[-q] <path>]

               [-mv <src> <dst>]

               [-cp <src> <dst>]

               [-rm [-skipTrash] <path>]

               [-rmr [-skipTrash] <path>]

               [-expunge]

               [-put <localsrc> ... <dst>]

               [-copyFromLocal <localsrc> ... <dst>]

               [-moveFromLocal <localsrc> ... <dst>]

               [-get [-ignoreCrc] [-crc] <src> <localdst>]

               [-getmerge <src> <localdst> [addnl]]

               [-cat <src>]

               [-text <src>]

               [-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>]

               [-moveToLocal [-crc] <src> <localdst>]

               [-mkdir <path>]

               [-setrep [-R] [-w] <rep> <path/file>]

               [-touchz <path>]

               [-test -[ezd] <path>]

               [-stat [format] <path>]

               [-tail [-f] <file>]

               [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]

               [-chown [-R] [OWNER][:[GROUP]] PATH...]

               [-chgrp [-R] GROUP PATH...]

               [-help [cmd]]

    Generic options supported are

    -conf <configuration file>     specify an application configuration file

    -D <property=value>            use value for given property

    -fs <local|namenode:port>      specify a namenode

    -jt <local|jobtracker:port>    specify a job tracker

    -files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster

    -libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.

    -archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.

    The general command line syntax is

    bin/hadoop command [genericOptions] [commandOptions]

上面输出的信息指明hadoop dfs能够支持的参数,对于有经验的朋友来说,肯定已经注意到,很多参数名与linux下的文件系统操作命令极为相似(有不少就是一模一样啊),悄悄告诉你,功能也很类似的哟。如果觉着信息稍简化,还可以再附加-help参数查看更详细的信息。下面三思通过几个例子给大家演示一下。

创建目录:-mkdir

比如说创建一个jss目录吧,执行hadoop dfs并附加-mkdir参数:

    [grid@hdnode1 ~]$ hadoop dfs -mkdir jss

浏览HDFS目录结构:-ls

目录(或文件)进行了创建,怎么知道是否创建成功了呐,那就ls看一下呗:

    [grid@hdnode1 ~]$ hadoop dfs -ls

    Found 1 items

    drwxr-xr-x   - grid supergroup          0 2013-02-17 14:23 /user/grid/jss

出来了有木有,看到了有木有~~~~

目录结构/权限/用户/时间信息/路径等等看起来都与Linux/Unix环境非常相似,对于具备一定Linux经验的朋友来说会比较容易理解。但是要注意了,这其中的路径和用户,及用户组跟操作系统层的路径没什么关系。

将文件上传至HDFS:-put

先创建两个文本文件:

    [grid@hdnode1 ~]$ echo "Hello Junsansi" > a.txt

    [grid@hdnode1 ~]$ echo "Junsansi says: Hello world" > b.txt

将这两个文件保存到 HDFS的jss目录下:

    [grid@hdnode1 ~]$ hadoop dfs -put *.txt jss

验证一下:

    [grid@hdnode1 ~]$ hadoop dfs -ls jss

    Found 2 items

    -rw-r--r--   3 grid supergroup         15 2013-02-17 16:58 /user/grid/jss/a.txt

    -rw-r--r--   3 grid supergroup         27 2013-02-17 16:58 /user/grid/jss/b.txt

查看文件内容:-cat

HDFS中的文件是否就是我们上传的文件呢,看下内容吧,使用-cat参数:

    [grid@hdnode1 ~]$ hadoop dfs -cat /user/grid/jss/a.txt

    Hello Junsansi

此外还有删除用-rm,下载用-get,复制用-cp等等,咱们演示几条就差不多了,别的有兴趣就自行尝试吧。

1.2 通过API方式操作HDFS

命令行的用法比较简单,不过多数情况下我们操作HDFS时不会在命令行上进行,而是通过应用来读取数据,那在程序中能否读写HDFS中的目录或文件呢,这个必须可以呀。HADOOP API将这些功能都封装好了,直接调用即可。

那么都有哪些API呢?我给个链接,官方白皮书,你想知道的这里都有:http://hadoop.apache.org/docs/r0.23.6/api/index.html

    提示:Eclipse开发环境配置及程序调试可参考三思的其它文章。