HDFS的Java API 操作

HDFS的JavaAPI操作

1.Windows 下 eclipse 远程连接 Hadoop 集群
(1)下载 eclipse 开发工具,解压并安装。
下载网址:https://www.eclipse.org/downloads/
(2)下载Hadoop Eclipse 插件 hadoop-eclipse-plugin-2.6.5.jar,将其放入 eclipse 安装目录 plugins 文件夹中。
HDFS的Java API 操作
(3)解压安装windows平台编译hadoop2.6.5安装包windows-hadoop-2.6.5.zip,解压路径最好不要带中文。

(4)在Windows系统中配置Hadoop环境变量。
HADOOP_HOME:windows-hadoop-2.6.5.zip的解压路径
PATH:%HADOOP_HOME%\bin;%HADOOP_HOME%\sbin;
HDFS的Java API 操作
(5)启动eclipse,在 eclipse 的左侧“Project Explorer”下会看到“DFS Locations”。

(6)“Window”->“Preferences” -> “Hadoop Map/Reduce”,配置hadoop2.6.5 解压的路径,配置完成,点击“Apply”->“OK”。

HDFS的Java API 操作
注:如果不行把步骤2安装目录改为dropins下的plugin,没有的话新建一个plugin放入

(7)“Window”->“Show View”->“Other”-> “Map/Reduce Locations”-> “OK”。
HDFS的Java API 操作
(8)在 eclipse 的下端出现一个显示框,点击图中蓝色的小象图标。
HDFS的Java API 操作
(9)根据对话框的提示修改相应的信息,如图所示。
HDFS的Java API 操作
(10)修改完成,点击“Finish”。在 eclipse 的下端会出现如图信息。
HDFS的Java API 操作
(11)在 eclipse 的左侧“Project Explorer”的“DFS Locations”下会看到如图信息。
HDFS的Java API 操作

2.搭建开发环境(建立普通 Java 工程,加入操作 HDFS 的 jar 包)

先创建一个工程:
HDFS的Java API 操作
(1) 在项目名称上右键单击“Build Path”,然后单击右边出现的“Configure Build Path”,选择“Libraries”,单击“Add Library…”,如图所示:
HDFS的Java API 操作
(2) 选择“User Library”->“Next”,如图所示:
HDFS的Java API 操作
(3) 之后单击“User Libraries…”,如图所示:
HDFS的Java API 操作
(4) 点击“New…”,如图所示:
HDFS的Java API 操作
(5) 在弹出的对话框中输入 User library name,这里我输入的是“HDFSLib”,之后点击“OK”,如图所示
HDFS的Java API 操作

(6) 选择“HDFSLib”,点击“Add External JARs…”,如图所示:
HDFS的Java API 操作

(7) 将“hadoop-2.6.5.tar.gz”解压到一个文件夹下,我这里解压的目录是D:\software\hadoop-2.6.5。在弹出的对话框中选择D:\software\hadoop-2.6.5\share\hadoop\common下的3个jar包和lib下所有的jar包,如图所示:
HDFS的Java API 操作

(8) 再继续添加D:\software\hadoop-2.6.5\share\hadoop\hdfs下的3个jar包和lib下所有的jar包,如图所示:
HDFS的Java API 操作
(9) 添加完毕之后,点击“OK”,再点击“Finish”,再点击“OK” ,看到 eclipse 左侧“Project Explorer”项目名称下出现我们添加的依赖库,如图所示:
HDFS的Java API 操作

3.FileSystem 实例获取讲解

1.引入

在Java中操作HDFS,首先要获取一个客户端实例:
Configuration conf=new Configuration();
FileSystem fs=FileSystem.get(conf);
get 方法是从何处判断具体实例化哪种客户端类呢?
从 conf 中的一个参数 fs.defaultFS 的配置值判断。

2.获取fs对象
第一种:通过配置获取fs对象

代码中没有设置“fs.defaultFS”参数;工程 classpath 下没有相应的配置文件
读取hadoop jar包core-default.xml的默认值 file:///,获取的是本地文件系统的实例
配置信息:

第二种:直接获取fs对象

Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI(“hdfs://hadoop01:9000”), conf, “shiny”);
不需要配置“fs.defaultFS”参数,直接传入URI和用户身份

4.利用Java API操作HDFS文件

配置信息:

Configuration conf = null;
FileSystem fs = null;
@Before
public void setup() throws IOException, InterruptedException, URISyntaxException {
//获取配置信息类
conf = new Configuration();
//获取fs对象
fs = FileSystem.get(new URI("hdfs://master:9000"), conf, "theone");
}

创建目录:

fs.mkfirs(Path f)
示例: boolean mkdirs=fs.mkdirs(new Path("/1213"));
	  System.out.println(mkdirs);

上传文件:

src:源路径;dst:目标路径
fs.copyFromLocalFile(path src, path dst) //默认不删除本地源文件,覆盖HDFS同名文件
示例:Path src=new Path("D:/software/hadoop-2.6.1/README.txt");
	 Path dst=new Path("/");
	 fs.copyFromLocalFile(src, dst);

下载文件:

fs.copyTpLocalFile(Path src,Path dst)
示例:
Path src=new Path("/hi.txt");
Path dst=new Path("D:/");
fs.copyToLocalFile(src, dst);

重命名文件或者文件夹

 //重命名文件
fs.rename(new Path("/hi.txt"), new Path("/hello.txt"));

//重命名文件夹
fs.rename(new Path("/123"), new Path("/456"));

删除文件或者文件夹

	fs.delete(Path f, boolean recursive); 
	 recursive:是否递归,若是文件或空文件夹则为false,非空文件夹则为true

//删除文件夹

fs.delete(new Path("/456"), true);

查看指定路径中文件状态和块信息
文件信息

文件路径:.getPath();
文件名称:.getPath().getName();
文件父目录:.getPath().getParent();
文件拥有者:.getOwner();
文件所属组:.getGroup();
文件块的大小:.getBlockSize();
文件长度:.getLen();
文件权限:.getPermission();
文件副本个数:.getReplication();

块信息

//数据块信息
BlockLocation[] blockLocations = next.getBlockLocations();
//遍历数组
for (BlockLocation block : blockLocations) {
    System.out.println("数据块的大小:" + block.getLength() + "\t偏移量" + block.getOffset());
    //获取数据块所在的DataNode信息
String[] hosts = block.getHosts();
System.out.println("所在DataNode信息");
for (String datanode : hosts){
    System.out.println(datanode + "");
}

查看指定路径中文件/目录的状态
 fs.listStatus(Path f);
 是否是目录:.isDirectory();