可以通过命令行接口与HDFS系统进行交互,这样更加简单直观。下面就介绍一些HDFS系统的常用操作命令。
1.ls使用ls命令可以查看HDFS系统中的目录和文件。例如,查看HDFS文件系统根目录下的目录和文件,命令如下:
hadooop fs –ls /
递归列出HDFS文件系统根目录下的所有目录和文件,命令如下:
hadooop fs –ls -R /
将本地文件上传到HDFS系统中。例如,将本地文件a.txt上传到HDFS文件系统的/input文件夹中,命令如下:
hadoop fs –put a.txt /input/
将本地文件移动到HDFS文件系统中,可以一次移动多个文件。与put命令类似,不同的是该命令执行后源文件将被删除。例如,将本地文件a.txt移动到HDFS的/input文件夹中,命令如下:
hadoop fs –moveFromLocal a.txt /input/
将HDFS文件系统中的文件下载到本地,注意下载时的文件名不能与本地文件相同,否则会提示文件已经存在。下载多个文件或目录到本地时,要将本地路径设置为文件夹。例如,将HDFS根目录中的input文件夹中的文件a.txt下载到本地,命令如下:
hadoop fs –get /input/a.txt a.txt
将HDFS根目录中的input文件夹下载到本地,命令如下:
hadoop fs –get /input/ input
注意:如果用户没有root权限,则本地路径要为用户文件夹下的路径,否则会出现权限问题。
删除HDFS系统中的文件或文件夹,每次可以删除多个文件或目录。例如,删除HDFS根目录的input文件夹中的文件a.txt,命令如下:
hadoop fs –rm /input/a.txt
删除HDFS根目录的output文件夹,命令如下:
hadoop fs -rm -r /output
在HDFS系统中创建文件或目录。例如,在HDFS根目录下创建文件夹input,命令如下:
hadoop fs –mkdir /input/
也可使用-p参数创建多级目录,如果父目录不存在,则会自动创建父目录。命令如下:
hadoop fs –mkdir –p /input/file
拷贝文件到另一个文件,相当于给文件重命名并保存,但源文件还存在。例如,将/input/a.txt拷贝到/input/b.txt,并保留a.txt,命令如下:
hadoop fs –cp /input/a.txt /input/b.txt
移动文件到另一个文件,相当于给文件重命名并保存,源文件已不存在。例如,将a.txt移动到b.txt,命令如下:
hadoop fs –mv /input/a.txt /input/b.txt
使用HDFS Java API可以远程对HDFS系统中的文件进行新建、删除、读取等操作。本节主要介绍如何在eclipse中编写HDFS Java API与HDFS文件系统进行交互。
4.2.1 创建Java工程在编写Java API之前,首先需要新建一个Hadoop项目。Hadoop项目的结构与普通的Java项目一样,只是依赖的jar包不同。
在eclipse中新建一个Maven项目hdfs_demo(Maven项目的搭建此处不做过多讲解),然后在该项目的pom.xml文件中添加以下代码,以引入HDFS的Java API依赖包:
配置好pom.xml后,即可进行HDFS Java API的编写。
4.2.2 读取数据FileSystem是HDFS Java API的核心工具类,使用FileSystem API可以很轻松的操作HDFS中的文件。例如,在HDFS文件系统的根目录有一个文件file.txt,可以直接使用FileSystem API读取该文件内容。
1.编写代码在新建的hdfs_demo项目中新建Java类FileSystemCat.java,写入查询显示file.txt文件内容的代码,完整代码如下所示:
import java.io.InputStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; /**查询文件内容并输出**/ public class FileSystemCat { public static void main(String[] args) throws Exception { //文件在HDFS系统中的路径 String uri="hdfs://192.168.170.128:9000/file.txt"; Configuration conf=new Configuration(); FileSystem fs=FileSystem.get(URI.create(uri), conf); //打开文件输入流 InputStream in=fs.open(new Path(uri)); //输出文件内容 IOUtils.copyBytes(in, System.out, 4096,false); //关闭输入流 IOUtils.closeStream(in); } }代码分析:
运行HDFS程序之前,需要先初始化Configuration类,该类的主要作用是读取HDFS的系统配置信息,也就是安装Hadoop时候的配置文件。例如core-site.xml、hdfs-site.xml和mapred-site.xml等文件里的信息。如下代码:
Configuration conf=new Configuration();
FileSystem是一个普通的文件系统API,可以使用静态工厂方法取得FileSystem实例。并传入文件在HDFS系统中的路径与Configuration对象参数。代码如下:
FileSystem fs=FileSystem.get(URI.create(uri), conf);
通过调用FileSystem对象的open方法,取得文件的输入流。如下代码:
InputStream in=fs.open(new Path(uri));
直接在eclipse中右击运行该程序即可,若控制台中能正确输出文件file.txt的内容,说明代码编写正确。
4.2.3 创建目录