hadoop系列(9)---如何在JAVA中使用HDFS

398 阅读2分钟

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

使用HDFS只需要引入特定的依赖就行了

  • 依赖

    				
    <!--hdfs 连接端依赖-->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>2.6.5</version>
    </dependency>
    
  • 代码(初始化配置 链接)

    
    1.直接将hdfs配置文件夹中的配置copy到工程目录的**resouces**文件夹下
    2.直接使用hadoop的Configration set方法 配置参数set(参数名,参数值)
    		//配置类
        public Configuration conf = null;
    		//文件系统
        public FileSystem fs = null;
       @Before
        public void conn() throws Exception {
    				//默认为:true 会加载resouces 下的关于hdfs 的配置文件 例如:hdfs-site.xml
            conf = new Configuration(true);
            URI uri = FileSystem.getDefaultUri(conf);
    				//实例化文件系统链接
            fs = FileSystem.get(uri, conf);
        }
    
  • 使用API(application programming interface)

    		/**
         *创建文件夹
         */
        @Test
        public void mkdir() throws Exception {
    				//配置文件夹创建的路径
            Path dir = new Path("/jacqueshuang");
    				//判断文件夹是否存在
            if (fs.exists(dir)) {
    						//删除文件夹   **→ 第二参数配置 是否循环递归文件夹下的所有文件 也执行删除**
                fs.delete(dir, true);
            }
    				//创建文件夹 同linux shell mkdir
            fs.mkdirs(dir);
        }
    
    		/**
         * 上传文件
         */
        @Test
        public void upload() throws Exception {
    				//上传的文件资源
            Resource resource = new Resource("data/data.txt");
    			  //资源文件转为流
            InputStream input = ResourceUtils
                    .getResourceAsStream(this, Objects.requireNonNull(resource));
    				//输出路径配置
            Path outfile = new Path("/jacqueshuang/data.txt");
    				//路径转化为流
            FSDataOutputStream output = fs
    												.create(outfile, true, 1048576, (short) 2, 1048576L);
    				//使用io工具进行流的copy
            IOUtils.copyBytes(input, output, conf, true);
        }
    
        /**
         *查询块信息
         */
        @Test
        public void blocks() throws Exception {
    
            Path file = new Path("/jacqueshuang/data.txt");
            FileStatus fss = fs.getFileStatus(file);
            //遍历块信息
            BlockLocation[] blks = fs.getFileBlockLocations(fss, 0, fss.getLen());
            for (BlockLocation b : blks) {
                System.out.println(b);
         //0,1048576,hadoop2,hadoop3
    	//1048576,840319,hadoop4,hadoop3
    	//打印出了块信息和块分布
            }
    
            //计算向数据移动~!
            //其实用户和程序读取的是文件这个级别~!并不知道有块的概念~!
            FSDataInputStream in = fs.open(file);
            //面向文件打开的输入流  无论怎么读都是从文件开始读起~!
    
            //先偏移1M位置
            in.seek(1048576);
            /*计算向数据移动后,期望的是分治,只读取自己关心(通过seek实现),
    	同时,具备距离的概念(优先和本地的DN获取数据--框架的默认机制)*/
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.print((char) in.readByte());
            System.out.println();
        }