HDFS-客户端操作(二)通过API操作HDFS

Posted on 2020-04-14 11:25  MissRong  阅读(387)  评论(0)    收藏  举报

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

下面上传一个204MB的文件

 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     }

上传成功后点击上传好的hadoop-2.7.2.rar文件--》查看Block information里面有两个Block(0和1)-->分别点进去并将里面信息的Size项相加再连除两次1024得到的就是204MB这个文件的大小。也就是说它是用两个块来储存的。

三、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     }

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3