前面我们已经配置了一套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的数据节点存储路径哟,比如这段:
同学,这段配置指定的是数据节点的存储路径不假,但并不是HDFS文件系统哟,这里所指定的是本节点HDFS映射文件的路径。怎么理解呢,简单讲,如果您在这个路径下创建文件,HDFS里是看不到的;同理,在HDFS中创建的文件,操作系统的文件系统中也看不到(也许能够看到一堆64M大小的映射文件)。
我们想要对HDFS文件系统进行读写操作,只有采用前面说的两种方式。
1.1 命令行方式操作HDFS
命令行方式就是通过hadoop命令附加dfs选项。我们可以直接执行该命令并附加dfs选项,不指定任何参数的情况下,会输出一些简要的帮助信息,如下:
[grid@hdnode1 ~]$ hadoop dfs
Usage: java FsShell
[-ls ]
[-lsr ]
[-du ]
[-dus ]
[-count[-q] ]
[-mv ]
[-cp ]
[-rm [-skipTrash] ]
[-rmr [-skipTrash] ]
[-expunge]
[-put ... ]
[-copyFromLocal ... ]
[-moveFromLocal ... ]
[-get [-ignoreCrc] [-crc] ]
[-getmerge [addnl]]
[-cat ]
[-text ]
[-copyToLocal [-ignoreCrc] [-crc] ]
[-moveToLocal [-crc] ]
[-mkdir ]
[-setrep [-R] [-w] ]
[-touchz ]
[-test -[ezd] ]
[-stat [format] ]
[-tail [-f] ]
[-chmod [-R] PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-chgrp [-R] GROUP PATH...]
[-help [cmd]]
Generic options supported are
-conf specify an application configuration file
-D use value for given property
-fs | specify a namenode
-jt | specify a job tracker
-files specify comma separated files to be copied to the map reduce cluster
-libjars specify comma separated jar files to include in the classpath.
-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开发环境配置及程序调试可参考三思的其它文章。