Hadoop基础-HDFS的API常见操作
Hadoop基础-HDFS的API常见操作
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
本文主要是记录一写我在学习HDFS时的一些琐碎的学习笔记, 方便自己以后查看。在调用API的时候,可能会需要maven依赖,添加依赖的包如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>HADOOP</artifactId> 7 <groupId>yinzhengjie.org.cn</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>HDFS</artifactId> 13 14 15 16 <dependencies> 17 <dependency> 18 <groupId>org.apache.hadoop</groupId> 19 <artifactId>hadoop-common</artifactId> 20 <version>2.6.0</version> 21 </dependency> 22 23 <dependency> 24 <groupId>org.apache.hadoop</groupId> 25 <artifactId>hadoop-client</artifactId> 26 <version>2.6.0</version> 27 </dependency> 28 29 <dependency> 30 <groupId>junit</groupId> 31 <artifactId>junit</artifactId> 32 <version>4.11</version> 33 <scope>test</scope> 34 </dependency> 35 36 </dependencies> 37 38 </project>
一.HDFS获取文件系统
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/ EMAIL:y1053419035@qq.com */ package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import java.io.IOException; public class HdfsClient { public static void main(String[] args) throws IOException { initHDFS(); } //获取文件系统 public static void initHDFS() throws IOException{ //创建Configuration对象 Configuration conf = new Configuration(); //获取文件系统 FileSystem fs = FileSystem.get(conf); //打印文件系统到控制台 System.out.println(fs); } }
二.HDFS文件上传
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/ EMAIL:y1053419035@qq.com */ package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; public class HdfsClient { public static void main(String[] args) throws Exception { putFileToHDFSinitHDFS(); } //文件上传 public static void putFileToHDFSinitHDFS() throws Exception { //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3"); //创建Configuration对象 Configuration conf = new Configuration(); //在代码中配置副本数,优先级最高,其次是配置文件的优先级,最后才是hdfs集群默认的副本数 conf.set("dfs.replication","2"); //获取文件系统,注意传入的三个参数对应的是hdfs的链接地址(需要将集群的客户端配置文件放在RESOURCES目录下!),配置对象,以及提交权限的用户名称。 FileSystem fs = FileSystem.get(new URI("hdfs://yinzhengjie-hdfs-ha"),conf,"hdfs"); /** * 当然,传入hdfs的url也可以指定主机名,当然你得在操作系统的hosts文件中指定对应的IP地址信息! * FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs"); */ //上传文件到hdfs路径中 fs.copyFromLocalFile(new Path("D:\\yinzhengjie\\data\\yinzhengjie.txt"),new Path("/yinzhengjie/yinzhengjie.blog")); } }
三.HDFS文件下载
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/ EMAIL:y1053419035@qq.com */ package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; public class HdfsClient { public static void main(String[] args) throws Exception { getFileFromHDFS(); } //下载文件 public static void getFileFromHDFS() throws Exception { //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3"); //创建Configuration对象 Configuration conf = new Configuration(); //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名 FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs"); /** * 指定下载操作,下面是对该copyToLocalFile的参数说明 * 第一个参数:boolean delSrc -------> 指是否将源文件删除 * 第二个参数:Path src -------> 指定下载的文件路径 * 第三个参数:Path dst -------> 指定文件下载到的路径 * 第四个参数: boolean useRawLocalFileSystem -------> 指是否开启文件校验 */ fs.copyToLocalFile(false,new Path("/yinzhengjie/yinzhengjie.blog"),new Path("D:\\yinzhengjie\\data"),true); //关闭链接,释放资源 fs.close(); } }
四.HDFS目录创建
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/ EMAIL:y1053419035@qq.com */ package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; public class HdfsClient { public static void main(String[] args) throws Exception { mkdirAtHDFS(); } //在hdfs中创建文件夹 public static void mkdirAtHDFS() throws Exception{ //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3"); //创建Configuration对象 Configuration conf = new Configuration(); //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名 FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs"); //创建目录 fs.mkdirs(new Path("/yinzhengjie/2018/11/04")); //释放资源 fs.close(); } }
五.HDFS文件夹删除
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/ EMAIL:y1053419035@qq.com */ package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; public class HdfsClient { public static void main(String[] args) throws Exception { deleteAtHDFS(); } //删除文件或者文件夹 public static void deleteAtHDFS() throws Exception{ //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3"); //创建Configuration对象 Configuration conf = new Configuration(); //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名 FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs"); //执行删除操作,第一个参数指定的是删除路径,第二个参数表示是否递归删除。要注意的是,如果是目录的必须设置为true,否则会抛异常! fs.delete(new Path("/yinzhengjie/2018"),true); //关闭资源 fs.close(); } }
六.HDFS文件名更改
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/ EMAIL:y1053419035@qq.com */ package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; public class HdfsClient { public static void main(String[] args) throws Exception { renameAtHDFS(); } //给文件或者目录进行重命名操作 public static void renameAtHDFS() throws Exception{ //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3"); //创建Configuration对象 Configuration conf = new Configuration(); //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名 FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs"); //修改文件名称 fs.rename(new Path("/yinzhengjie/yinzhengjie.blog2"),new Path("/yinzhengjie/yinzhengjie.blog-2018-11-04")); //关闭资源 fs.close(); } }
七.HDFS文件详情查看
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/ EMAIL:y1053419035@qq.com */ package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java.net.URI; public class HdfsClient { public static void main(String[] args) throws Exception { readListFiles(); } public static void readListFiles() throws Exception { //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3"); //创建配置信息对象 Configuration conf = new Configuration(); //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名 FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs"); //获取文件详情(注意:返回的是迭代器,而不是List之类的容器。),第一个参数指定的想要在hdfs获取的路径,第二个参数是否递归获取,改参数一般针对目录有效! RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true); while (listFiles.hasNext()) { //调用迭代器listFiles的next()方法获取文件详细信息 LocatedFileStatus fileStatus = listFiles.next(); //输出文件名称 System.out.println(fileStatus.getPath().getName()); //输出块大小的信息 System.out.println(fileStatus.getBlockSize()); //输出权限信息 System.out.println(fileStatus.getPermission()); //输出长度信息 System.out.println(fileStatus.getLen()); //输出组的信息 System.out.println(fileStatus.getGroup()); //获取到块的位置信息 BlockLocation[] blockLocations = fileStatus.getBlockLocations(); for (BlockLocation bl : blockLocations) { System.out.println("block-offset:" + bl.getOffset()); //获取该快在哪个节点上 String[] hosts = bl.getHosts(); for (String host : hosts) { //打印获取到的主机信息 System.out.println(host); } } System.out.println("<--------------尹正杰的分割线------------->"); } } } 8>.HDFS文件和文件夹 /* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/ EMAIL:y1053419035@qq.com */ package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java.net.URI; public class HdfsClient { public static void main(String[] args) throws Exception { findAtFiles(); } public static void findAtFiles() throws Exception { //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3"); //创建配置信息对象 Configuration conf = new Configuration(); //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名 FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs"); //获取查询路径下的文件状态信息 FileStatus[] listStatus = fs.listStatus(new Path("/")); //便利所有的文件状态 for (FileStatus status : listStatus) { //判断是文件还是文件夹 if (status.isFile()){ //如果是文件就在打印的时候加上指定的字符串前添加"file ------->" System.out.println("file ------->" + status.getPath().getName()); }else { //如果是文件夹就在打印的时候加上特定的字符串前添加"directories ------->" System.out.println("directories ------->"+ status.getPath().getName()); } } } }
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
欢迎交流学习技术交流,个人微信: "JasonYin2020"(添加时请备注来源及意图备注)
作者: 尹正杰, 博客: https://www.cnblogs.com/yinzhengjie/p/9906192.html