章
目
录
1.基于 Shell 的操作
以下介绍一些我们在 Shell 中操作 HDFS 时经常用到的命令。
HDFS 创建目录的命令是 mkdir,命令格式如下:
hdfs dfs -mkdir 文件夹名
例如,在 user 目录下创建 wen 目录。代码如下:
hdfs dfs -mkdir hdfs://192.168.217.100:9820/wen
可以简写为:
hdfs dfs -mkdir /user/wen
HDFS 上传文件时,文件首先复制到 DataNode 上,只有所有的 DataNode 都成功接收完数据,文件上传才是成功的。命令格式如下:
hdfs dfs -put filename newfilename
例如,通过「-put 文件 1 文件 2」命令将 test1 文件上传到 HDFS 上并重命名为 test2。代码如下:
hdfs dfs -put test1 test2
采用-ls 命令列出 HDFS 上的文件,需要注意的是,在 HDFS 中没有「当前工作目录」这个概念。命令格式如下:
hdfs dfs -ls
例如,列出 HDFS 特定目录下的所有文件。代码如下:
hdfs dfs –ls /wen
通过「-cat 文件名」命令查看 HDFS 下某个文件的内容。命令格式如下:
hdfs dfs -cat 文件名
例如,查看 HDFS 上 wen 目录下 test.txt 中的内容。代码如下:
hdfs dfs -cat /wen/test.txt
通过「-get 文件 1 文件 2」命令将 HDFS 中某目录下的文件复制到本地系统的某文件中,并对该文件重新命名。命令格式如下:
hdfs dfs -get 文件名 新文件名
例如,将 HDFS 中的 in 文件复制到本地系统并重命名为 IN1。代码如下:
hdfs dfs -get in IN1
-get 命令与-put 命令一样,既可以操作目录,也可以操作文件。
通过「-rmr 文件」命令删除 HDFS 下的文件。命令格式如下:
hdfs dfs -rmr 文件
例如,删除 HDFS 下的 out 文档。代码如下:
hdfs dfs -rmr out -rmr
删除文档命令相当于 delete 的递归版本。
通过-format 命令实现 HDFS 格式化。命令格式如下:
hdfs namenode -format
通过运行 start-dfs.sh,就可以启动 HDFS 了。命令格式如下:
start-dfs.sh
当需要退出 HDFS 时,通过 stop-dfs.sh 就可以关闭 HDFS。命令格式如下:
stop-dfs.sh
2.基于 Java API 的操作
本节将介绍通过 Java API 来访问 HDFS,首先介绍 HDFS 中的文件操作主要涉及的几个类。 ·Configuration 类:该类的对象封装了客户端或者服务器的配置。
·FileSystem 类:该类的对象是一个文件系统对象,可以用该对象的一些方法对文件进行操作。FileSystem fs=FileSystem.get(conf);通过 FileSystem 的静态方法 get 获得该对象。
·FSDataInputStream 和 FSDataOutputStream:这两个类是 HDFS 中的输入/输出流,分别通过 FileSystem 的 open 方法和 create 方法获得。
接下来通过实例介绍如何利用 Java API 进行文件夹的创建、文件列表显示、文件上传和文件下载操作,为了使读者对实例具有完整性的理解,我们把主函数也列了出来。实例代码如下:
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HdfsDemo { public static void main(String[] args) { createFolder(); //uploadFile(); //downloadFile(); //listFile(new Path("/")); } }
在主函数中,分别调用了 createFolder()、uploadFile()、downloadFile()和 listFile(new Path(「/」)函数来实现文件夹的创建、文件上传、文件下载和递归显示文件夹功能。
如果想要将文件放入不同的文件夹中,则可以有针对性地动态创建文件夹。关于文件夹的创建比较简单。代码如下:
public static void createFolder() { // 定义一个配置对象 Configuration conf = new Configuration(); try { // 通过配置信息得到文件系统的对象 FileSystem fs = FileSystem.get(conf); //在指定的路径下创建文件夹 Path path = new Path(「/yunpan」); fs.mkdirs(path); } catch (IOException e) { e.printStackTrace(); } }
如果要显示文件夹中的文件,需要用到递归算法,因为文件夹中可能有文件,也可能有文件夹。代码如下:
public static void listFile(Path path) { Configuration conf = new Configuration(); try { FileSystem fs = FileSystem.get(conf); //传入路径,表示显示某个路径下的文件夹列表 //将给定路径下所有的文件元数据放到一个 FileStatus 的数组中 //FileStatus 对象封装了文件和目录的元数据,包括文件长度、块大小、权限等信息 FileStatus[] fileStatusArray = fs.listStatus(path); for (int i = 0; i < fileStatusArray.length; i++) { FileStatus fileStatus = fileStatusArray[i]; //首先检测当前是否是文件夹,如果「是」则进行递归 if (fileStatus.isDirectory()) { System.out.println("「当前路径是:」" + fileStatus.getPath()); listFile(fileStatus.getPath()); } else { System.out.println("「当前路径是:」" + fileStatus.getPath()); } } } catch (IOException e) { e.printStackTrace(); } }
前面创建了文件夹及文件的递归显示,接着来看一下文件的上传。关于文件上传的代码如下:
public static void uploadFile() { Configuration conf = new Configuration(); try { FileSystem fs = FileSystem.get(conf); //定义文件的路径和上传的路径 Path src = new Path(「e://upload.doc」); Path dest = new Path(「/yunpan/upload.doc 」); //从本地上传文件到服务器上 fs.copyFromLocalFile(src, dest); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
关于文件的上传,首先需要定义上传源 src,这里的 src 是指本地文件路径,即将要上传的目的地路径是 dest,也就是 HDFS 上的路径。一旦设定了文件上传的数据源和目的路径之后,就可以调用 FileSystem 的 copyFromLocalFile()方法来实现文件的上传了。
与文件上传所对应的就是文件下载。文件下载代码和文件上传类似,只是函数略有区别。代码如下:
public static void downloadFile() { Configuration conf = new Configuration(); try { FileSystem fs = FileSystem.get(conf); //定义下载文件的路径和本地下载路径 Path src = new Path( 「/yunpan/download.doc」); Path dest = new Path(「e://download.doc」); //从服务器下载文件到本地 fs.copyToLocalFile(src, dest); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
关于文件的下载,首先需要定义下载源 src,这里的 src 是指 HDFS 上的路径,将要下载的目的地为 dest,也就是本地系统的路径。设定了文件下载的数据源和目的路径之后,就可以调用 FileSystem 的 copyToLocalFile()方法实现文件的下载了。