目录
一. 【实验准备】
1.创建工作目录
本实验的工作目录为~/course/hadoop/hdfs_pro
,使用以下命令创建和初始化工作目录:
$ mkdir -p ~/course/hadoop/hdfs_pro
$ cd ~/course/hadoop/hdfs_pro
2.安装部署Hadoop集群
参考《Hadoop安装部署》实验,安装有三个数据节点的Hadoop集群
3.创建eclipse工程
接下来创建eclipse工程:
在终端输入eclipse&
命令从后台启动Eclipse IDE环境。
依次点击:File->New->Project->Map/Reduce Project->Next
。
在项目名称(Project Name)处填入hdfs_pro
,将工程位置选择为本实验的工作目录,再点击Finish
。
如下图所示:
如果需要设置hadoop路径,点击Configure Hadoop install directory...
,选择hadoop路径为/headless/dev/hadoop-2.7.1
,如下所示:
二、创建目录
1、相关接口说明
创建目录可以使用FileSystem
的mkdirs
方法,该方法的含义如下:
-
函数原型:
public boolean mkdirs(Path f) throws IOException
-
函数功能:调用该方法,根据f指定的路径创建目录。目录的权限为默认权限。
-
参数说明:
f
,Path
对象。表示要创建的目录的路径。 -
返回值:如果目录成功创建,返回
true
。 -
异常:如果遇到IO故障,抛出
IOException
异常。
mkdirs还有一个带有目录权限参数的版本,其原型为:
public abstract boolean mkdirs(Path f, FsPermission permission) throws IOException
2、完整实验代码
将 hdfs_pro
项目下 src
目录新建名为 CreateDir
的类
(选中src
文件夹->File->new->Class->
在name
选项中填入 CreateDir->Finish
)
该实验的完整实验代码如下:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CreateDir {
public static void main(String[] args) {
try {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
String dirPath = args[0]; // 新建目录的路径由外部传入
Path hdfsPath = new Path(dirPath);
if(fs.mkdirs(hdfsPath)){
System.out.println("Directory "+ dirPath +" has been created successfully!");
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
将该代码拷贝到CreateDir.java
文件中。如下图所示:
以上代码中主要调用fs
的mkdirs
方法来创建目录,如果目录创建成功,会输出相应提示信息。
3、运行结果分析
在CreateDir.java
上,点击右键,选择Export
,导出 Jar 包。
注意选择导出的路径为本实验的工作目录。
最后设置MainClass
新建一个终端,切换到jar包所在的目录,然后将导出的jar包传到master节点上。
cd ~/course/hadoop/hdfs_pro
cp CreateDir.jar /cgsrc
进入master节点,查看hdfs文件系统上当前目录下的内容,然后输入如下hadoop jar命令创建目录,最后再查看是否创建成功:
docker exec -it --privileged master /bin/bash
hadoop fs -ls .
hadoop jar /cgsrc/CreateDir.jar newdir
hadoop fs -ls .
运行结果的截图如下:
如图所示,目录newdir
已经被成功创建。
三、目录存在性判断
1、相关接口说明
判断文件是否存在需要使用FileSystem
的exists
方法,该方法的详细含义如下:
方法名:exists
方法原型:public boolean exists(Path f) throws IOException
接口功能:检查某个路径所指的目录是否存在。
接口说明:参数f
的含义为源路径。如果目录存在,返回值为true
。如果IO故障会抛出IOException
异常。
2、完整实验代码
将 hdfs_pro
项目下src
目录新建名为DirExist
的类
(选中src
文件夹->File->new->Class->
在name
选项中填入 DirExist->Finish
)
该实验的完整代码如下所示:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class DirExist {
public static void main(String[] args) {
try {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
String dirName = args[0];
if(fs.exists(new Path(dirName ))) {
System.out.println("Directory Exists!");
} else {
System.out.println("Directory not Exists!");
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
3、运行结果分析
使用和上一节相同的方法导出 DirExist.jar
,并导出到master节点上,并在master节点上使用如下hadoop jar命令提交运行。
hadoop jar /cgsrc/DirExist.jar newdir
结果如下:
如图所示,程序判断无误。
四、列出目录中的内容
1、相关接口说明
在HDFS文件系统上浏览某个目录中子文件和子目录时,需要使用FileSystem
类提供的listStatus
方法,该方法将返回该目录下所有子文件和子目录的详细信息,包括文件的长度、块大小、备份数、修改时间、所有者以及权限等信息,这些信息都被封装在FileStatus
对象中。调用listStatus
方法时需要提供目录的路径,listStatus
方法的详细说明如下:
函数原型:public abstract FileStatus[] listStatus(Path f) throws FileN