Components of Hadoop
在上一章节我们了解了如何安装及配置Hadoop。我们了解了不同节点的作用以及这些节点是如何工作的,还了解了如何配置这些节点。现在我们可以运行Hadoop了,现在我们从程序的角度了解一下Hadoop框架。
首先我们讲解HDFS,HDFS用来存储你的Hadoop应用的各种数据。之后我们讲解MapReduce框架的细节。第一章时,我们已经看到了MapReduce程序,但是我们只是停留在概念层。在这一章我们将进入Java类和方法层面,当然还包括如何部署。我们还会知道如何使用不同数据格式进行读写操作。
Working with files in HDFS
你可以将100TB的数据集作为一个单独的数据存储在HDFS中,有时仅仅这一点就足以强过其他文件系统。我们在第二章讨论了HDFS的复制机制。HDFS隐藏了这些底层的处理机制,让开发者感觉只是在处理某个单独的文件。
HDFS并不是Unix的原生的文件系统,所以标准的Unix文件工具,比如ls和cp不可用,并且也无法使用标准的Unix文件IO操作。但是,Hadoop提供一系列与Unix非常相似的命令和工具。下一节,我们将讨论这些Hadoop文件操作shell命令。之后,我们将看到Hadoop HDFS Java API
基本的文件操作命令:
hadoop fs -cmd <args>
其中cmd指具体的文件操作命令。args是命令参数。
通常来讲cmd命令与Unix的命令相同。比如说,文件列表命令就是:
hadoop fs -ls
我们看一下常见的文件操作命令包括:
1.新建文件及目录
2.检索文件
3.删除文件
新建文件及目录:
在运行Hadoop程序之前,我们需要将数据先放进HDFS。我们先假设已经格式化好了整个HDFS系统,并且运行了Hadoop程序。
HDFS的默认工作路径是 /usr/$USER,这个$USER就是指的登陆名。但是这个目录并不会自动建立,所以我们需要使用mkdir命令手动建立这个目录。比如我的用户名是chuck。当然各位看官如果想自己试试,那要使用你自己的用户名。
hadoop fs -mkdir /user/chuck
Hadoop's mkdir 命令使用-p参数回自动创建父一级的目录。
使用ls命令可以查看:
hadoop fs -ls /
这是你就会看到刚刚创建的文件目录的了。
使用 hadoop fs -lsr / 还可以看到其子目录下的内容起作用与Unix下的ls -r效果相同。
通过URI精确访问指定的目录
Hadoop 文件命令行可以让HDFS与本地文件系统交互。同时也可以与Amazon S3交互。一个
URI 指向一个确定的文件或者目录。完整的URI格式为:scheme://authority/path。scheme
类似于协议的意思。authority是指NameNode所在的服务器host。path是指文件或者路径的位置。
比如说,一个标准的伪分布式的HDFS运行在本机的9000端口。那么如果想要访问user/chuck目
录下的example.txt文件。其URI就是hdfs://localhost:9000/user/chuck/example.txt。
运行的命令就是 hadoop fs -cat hdfs://localhost:9000/user/chuck/example.txt。
如你所见,大多数的设置下,URI中不需要指定scheme://authority。处理本地文件时,你可能
更愿意使用Unix 命令而不是hadoop file 命令。 所以在本地文件与hdfs的拷贝过程中,
在URI上即便不加file:scheme,put命令与get命令也会使用本地系统作为目的地或者数据源
另外,如果你在Hadoop 的配置中配置了scheme://authority部分。那么在你的命令中就可以省略
这个部分。比如:如果你的conf/hadoop-site.xml中配置如下:
在这个配置下,URI hdfs://localhost:9000/user/chuck/example.txt可以缩写为
/user/chuck/example.txt
此外,HDFS默认使用的目录为:/user/$USER 这个$USER就是你的登录用户名。如果你用chuck登录
,那么如果要访问的URI是 hdfs://localhost:9000/user/chuck/example.txt。你甚至可以缩写为
example.txt。
此时,你在用cat命令时,只用输入:
Hadoop的get命令用来hdfs文件系统中的文件拷贝到本地文件系统。如果我们想将example.txt文件
拷贝到本地目录。使用如下命令:
hadoop fs -get example.txt
另外hadoop的cat命令可以允许我们查看文件中的内容。
我们当然也可以使用Unix shell的管道方式链接另一个命令。
Unix head命令的输入,比如:
目前,Hadoop本身也支持tail命令:
ok,不废话,言简意该:如下