前言
在熟悉了HDFS的概念后,下面我们使用客户端对HDFS进行一些基本操作,例如读取文件、新建目录、移动文件、删除数据、列出目录等等。本章我们会使用hadoop自带的命令行工具以及Java客户端两种方式与HDFS进行交互。
命令行接口
我们首先使用命令行接口将本地文件上传到HDFS。
1 | $ bin/hadoop fs -copyFromLocal README.txt hdfs://hadoop01:9000/README.txt |
该命令调用了hadoop文件系统的shell命令fs,后者提供了一系列子命令,在这个例子中,我们使用的是copyFromLocal。本地文件README.txt被上传到了HDFS集群的根目录下。实际上,我们可以简化命令格式,省略NameNode的URI,并使用默认设置,因为该值在core-site.xml
中已经设置了。
1 | $ bin/hadoop fs -copyFromLocal README.txt /README.txt |
我们也可以使用相对路径,相对路径是指当前操作用户在HDFS上的home路径,例如/user/hadoop
、/user/work
等。
1 | $ bin/hadoop fs -copyFromLocal README.txt README.txt |
现在我们将上传的README.txt
文件下载到本地,并检查是否一致。
1 | $ bin/hadoop fs -copyToLocal /README.txt README.copy.txt |
MD5值一样,说明该文件在经历了HDFS存储后并没有任何损坏。
注意,我们除了使用hadoop fs
之外,还可以使用hdfs dfs
命令,二者是一样的。
如果不指定任何子命令,就会列出所支持所有子命令,如下所示。
1 | $ bin/hadoop fs |
Java接口
下面我们通过HDFS的Java接口来操作HDFS。
首先需要引入相关的依赖:
1 | <dependency> |
首先,我们将本地的文件上传至HDFS,再下载到本地。
1 | public class Demo01 { |
除了以文件的形式直接操作外,我们还可以通过数据流(InputStream/OutputStream)的方式进行操作。
1 | public class Demo02 { |
小结
本章主要使用了HDFS的命令行接口与Java接口两种方式对HDFS进行了操作。操作实际上非常简单,但是底层的交互非常复杂,后续我们会对底层的交互进行详细剖析,从根本上掌握运行原理。