HDFS-客户端操作(二)通过API操作HDFS
一、HDFS获取文件系统
详细代码
1 package Day01; 2 3 import org.apache.hadoop.conf.Configuration; 4 import org.apache.hadoop.fs.FileSystem; 5 import org.junit.Test; 6 7 import java.io.IOException; 8 9 public class HDFSAPI { 10 11 /** 12 * IO的方式写代码 13 * 打印本地Hadoop地址值 14 * @throws IOException 15 */ 16 @Test 17 public void intiHDFS() throws IOException { 18 //下面的这些方法参数都是关于:org,apache,hadoop,fs 19 //1.创建配置信息对象 后推前自动补全:ctrl+alt+v 20 Configuration conf = new Configuration(); 21 22 //2.获取文件系统 23 //f2:快速定位错误 alt+enter:自动找错误 24 FileSystem fs = FileSystem.get(conf); //选第一个---抛出异常 25 26 //3.打印文件系统 27 System.out.println(fs.toString()); 28 29 } 30 }
二、HDFS文件上传
1 /** 2 * 本地上传文件到HDFS 3 * @throws Exception 4 */ 5 @Test 6 public void putFileToHDFS() throws Exception { 7 //1.创建配置信息对象 8 Configuration conf = new Configuration(); 9 10 //2.设置部分参数 ctrl+p:给予参数提示 11 //1)set()的name看: 12 // # cd /opt/module/hadoop-2.8.4/etc/hadoop/ 13 // # vi hdfs-site.xml 中的数据冗余数<name>:dfs.replication 14 //2)set()的value-备份数,设为2 15 conf.set("dfs.replication","2"); 16 17 //3.找到HDFS的地址 18 //new URI(java.net--集群的地址) ,配置 ,用户名 19 FileSystem fs = FileSystem.get(new URI("hdfs://bigdata111:9000/"),conf,"root"); 20 21 //4.上传本地文件的路径 22 Path src = new Path("D:/tunshu2.jpg"); 23 24 //5.要上传到HDFS的路径 25 Path dst = new Path("hdfs://bigdata111:9000/"); 26 27 //6.以拷贝的方式上传 从src-->dst 28 fs.copyFromLocalFile(src,dst); 29 30 //7.关闭 31 fs.close(); //抛异常,并将IO去掉 32 System.out.println("OK!"); 33 }
一个数据库块默认是128MB
1 /** 2 * 本地上传文件到HDFS 3 * 注意:如果上传的内容大于128MB则为两个数据块 4 */ 5 @Test 6 public void putFileToHDFS() throws Exception { 7 //1.创建配置信息对象 8 Configuration conf = new Configuration(); 9 10 //2.设置部分参数 ctrl+p:给予参数提示 11 //1)set()的name看: 12 // # cd /opt/module/hadoop-2.8.4/etc/hadoop/ 13 // # vi hdfs-site.xml 中的数据冗余数<name>:dfs.replication 14 //2)set()的value-备份数,设为2 15 conf.set("dfs.replication","2"); 16 17 //3.找到HDFS的地址 18 //new URI(java.net--集群的地址) ,配置 ,用户名 19 FileSystem fs = FileSystem.get(new URI("hdfs://bigdata111:9000/"),conf,"root"); 20 21 //4.上传本地文件的路径 22 Path src = new Path("D:\\idealC\\Hadoop\\hadoop-2.7.2.rar"); 23 24 //5.要上传到HDFS的路径 25 Path dst = new Path("hdfs://bigdata111:9000/A"); 26 27 //6.以拷贝的方式上传 从src-->dst 28 fs.copyFromLocalFile(src,dst); 29 30 //7.关闭 31 fs.close(); //抛异常,并将IO去掉 32 System.out.println("OK!"); 33 }
三、HDFS文件下载
1 /** 2 * 从HDFS下载文件到本地Windows上 3 */ 4 @Test 5 public void getFileFromHDFS() throws Exception { 6 //1.创建配置信息对象 Configuration:配置 7 Configuration conf = new Configuration(); 8 9 //2.找到文件系统 10 //final URI uri :HDFS地址 11 // final Configuration conf:配置信息 12 // String user:Linux用户名 13 FileSystem fs = FileSystem.get(new URI("hdfs://bigdata111:9000/"), conf, "root"); 14 15 //3.下载文件 16 //boolean delSrc :是否将源文件删除 17 //Path src:下载的路径 18 //Path dst:要下载到哪 19 //boolean useRawLocalFileSystem:是否校验文件 20 fs.copyToLocalFile(false,new Path("hdfs://bigdata111:9000/README.txt"), 21 new Path("D:/HDFS/README.txt"),true); 22 23 //4.关闭fs alt+enter:找错 24 fs.close(); //抛异常-去掉IO 25 //ctrl+alt+o:可以去除没有用的导包 26 27 System.out.println("OK!"); 28 29 }
四、HDFS目录创建
1 /** 2 * 四、创建文件夹 3 */ 4 @Test 5 public void mkdirHDFS() throws Exception { 6 //1.创建配置信息对象 7 Configuration conf = new Configuration(); 8 9 //2.连接文件系统 10 //final URI uri :HDFS地址 11 // final Configuration conf:配置信息 12 // String user:Linux用户名 13 FileSystem fs = FileSystem.get(new URI("hdfs://bigdata111:9000/"), conf, "root"); 14 15 //3.创建目录 16 fs.mkdirs(new Path("hdfs://bigdata111:9000/Good")); 17 18 //4.关闭 19 fs.close(); //抛异常--去掉IO,因为Exception是最高级别异常,避免反复修改 20 }
五、HDFS文件夹删除
1 /** 2 * 五、HDFSAPI 删除文件 3 */ 4 @Test 5 public void deleteFromHDFS() throws Exception { 6 //1.创建配置信息对象 7 Configuration conf = new Configuration(); 8 9 //2.连接文件系统 10 FileSystem fs = FileSystem.get(new URI("hdfs://bigdata111:9000/"), conf, "root"); 11 12 //3.删除文件 13 //Path var1 :地址 14 //boolean var2:是否递归删除 15 fs.delete(new Path("hdfs://bigdata111:9000/Good"),true); 16 17 //4.关闭 18 fs.close(); 19 20 System.out.println("OK!"); 21 }
六、HDFS文件名更改
|
@Test public void renameAtHDFS() throws Exception{ // 1 创建配置信息对象 Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://bigdata111:9000"),configuration, "itstar");
//2 重命名文件或文件夹 fs.rename(new Path("hdfs://bigdata111:9000/user/itstar/hello.txt"),new Path("hdfs://bigdata111:9000/user/itstar/hellonihao.txt")); fs.close(); } |
七、HDFS文件详情查看
查看文件名称、权限、长度、块信息
1 /** 2 *七、查看【文件】名称、权限等 3 */ 4 @Test 5 public void readListFiles() throws Exception { 6 //1.创建配置信息对象 7 Configuration conf = new Configuration(); 8 9 //2.连接文件系统 10 FileSystem fs = FileSystem.get(new URI("hdfs://bigdata111:9000/"), conf, "root"); 11 12 //3.迭代器-列出所有文件 13 //final Path f:路径 14 //final boolean recursive: 是否迭代 15 RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true); 16 17 //4.遍历迭代器 18 while (listFiles.hasNext()){ 19 //一个一个地出 20 LocatedFileStatus fileStatus = listFiles.next(); 21 //名字 22 System.out.println("文件名:"+fileStatus.getPath().getName()); 23 //块大小 24 System.out.println("块容量:"+fileStatus.getBlockSize()); 25 //权限 26 System.out.println("权限:"+fileStatus.getPermission()); 27 //长度 28 System.out.println("文件大小:"+fileStatus.getLen()); 29 30 //针对每一个文件,得到块地址 31 BlockLocation[] locations = fileStatus.getBlockLocations(); 32 //打印出每一块 33 for(BlockLocation bl:locations){ 34 //块所处的位置--.getOffget()偏移量 35 System.out.println("-----块的分割线-----"); 36 System.out.println("块偏移量: "+bl.getOffset()); 37 System.out.println("此块大小:"+bl.getLength()); 38 //对于每一块,得到主机名 39 String [] hosts=bl.getHosts(); 40 for(String host:hosts) { 41 System.out.println("主机名:"+host); 42 } 43 } 44 System.out.println("**********文件的分割线**********"); 45 } 46 }
八、HDFS文件和文件夹判断
1 /** 2 * 八、判断是否是一个文件夹 3 */ 4 @Test 5 public void judge() throws Exception { 6 //1.创建配置文件信息对象 7 Configuration conf = new Configuration(); 8 9 //2.获取文件系统 10 FileSystem fs = FileSystem.get(new URI("hdfs://bigdata111:9000/"), conf, "root"); 11 12 //3.遍历所有内容(文件、非文件) 13 //listStatus()不支持迭代 14 FileStatus[] listStatus = fs.listStatus(new Path("/")); 15 for(FileStatus status:listStatus){ 16 //判断是否是文件 17 if(status.isFile()){ 18 //ctrl+d:复制一行 19 //ctrl+s:剪切一行,也可以用来删除一行 20 System.out.println(status.getPath().getName()+"是文件"); 21 }else{ 22 System.out.println(status.getPath().getName()+"是目录"); 23 } 24 } 25 }
浙公网安备 33010602011771号