大数据开源框架之HDFS编程实践

HDFS完全分布式安装请看:

(27条消息) 大数据开源框架环境搭建(四)——HDFS的完全分布式安装部署_木子一个Lee的博客-CSDN博客

目录

任务1:编写一个Java程序,向HDFS中上传任意文本文件

基本思路:

参考代码:

实验结果:

任务2:编写一个Java程序,打开一个HDFS中的文件,并读取其中的数据,输出到标准输出

基本思路:

参考代码:

实验结果:

任务3:编写一个Java程序,从HDFS中下载指定文件

基本思路:

参考代码:

实验结果:

任务4:编写一个Java程序,新建一个HDFS文件,并向其中写入你的名字

基本思路:

参考代码:

实验结果:

任务5:编写一个Java程序,判断HDFS上是否存在某个文件

基本思路:

参考代码:

实验结果:

任务6:给定HDFS中某一个目录,编写一个Java程序输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息

基本思路:

参考代码:

实验结果:


任务1:编写一个Java程序,向HDFS中上传任意文本文件

基本思路:

首先使用start-dfs.shstart-yarn.sh启动集群,利用shell生成hdfs目标目录(不生成也行,代码执行后会自动创建):

然后打开eclipse,导入hadoop相关jar包:

函数uploadFile(String src,String dst)中:

src为源路径,dst为目标路径

新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:

新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统

封装源路径与目标路径,调用copyFromLocalFile上传文件,上传完成后关闭文件系统

主函数传参并调用uploadFile(String src,String dst)

参考代码:

//将本地/home/lee/files/lab1.txt上传到hdfs的/user/lee/input/lab1.txt:
package lab1;

import java.net.URI;
import java.io.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class UploadUtil {
    public static void main(String[] args) throws IOException, InterruptedException {
        UploadUtil uploadUtil=new UploadUtil();
        String src = "/home/lee/files/lab1.txt";
        String dst = "/user/lee/input/lab1.txt";
        uploadUtil.uploadFile(src,dst);
    }
    //本地文件上传到Hdfs
    public void uploadFile(String src,String dst) throws IOException, InterruptedException {
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://master:9000");
        configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
//        FileSystem hdfsfileSystem = FileSystem.get(URI.create("hdfs://master:9000"), conf, "root");//root用户
        FileSystem hdfsfileSystem = FileSystem.get(URI.create(dst), configuration, "root");//root用户
        Path srcPath = new Path(src);//原路径
        Path dstPath = new Path(dst);//目标路径
        hdfsfileSystem.copyFromLocalFile(false, srcPath, dstPath);//(false不删除本地文件;true删除本地文件,原路径,目标路径)
        System.out.println("上传成功!");
        hdfsfileSystem.close();
    }
}

实验结果:

执行前:

执行后:

任务2:编写一个Java程序,打开一个HDFS中的文件,并读取其中的数据,输出到标准输出

基本思路:

首先导入jar包,任务1已经做了。

在函数readfile(String src)中:

新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:

新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统

使用Path类封装路径src

使用BufferedReader类封装输入流,按行读取数据。读取完关闭所有文件系统

主函数传参并调用readfile(String src)

lab1.txt文件内容:

参考代码:

//读取hdfs系统下/user/lee/input/lab1.txt
package lab1;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;

public class ReadoutUtil {
    public static void main(String[] args) throws IOException, InterruptedException {
       String src = "/user/lee/input/lab1.txt";
        ReadoutUtil readoutUtil=new ReadoutUtil();
        readoutUtil.readfile(src);
    }
    @SuppressWarnings("deprecation")
   public void readfile(String src) throws IOException, InterruptedException {
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://master:9000");
        configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        
//        FileSystem hdfsfileSystem = FileSystem.get(URI.create("hdfs://master:9000"), configuration, "root");
        FileSystem hdfsfileSystem = FileSystem.get(URI.create(src), configuration, "root");
        Path path = new Path(src);
        FSDataInputStream in = new FSDataInputStream(hdfsfileSystem.open(path));
//        BufferedReader d = new BufferedReader(new InputStreamReader(in));
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FSDataInputStream(hdfsfileSystem.open(path))));
        String line = bufferedReader.readLine();
        while (line != null) {
            System.out.println(line.toString());
            line = bufferedReader.readLine();
        }
        in.close();//关闭文件
        hdfsfileSystem.close();//关闭hdfs
    }


}

实验结果:

任务3:编写一个Java程序,从HDFS中下载指定文件

基本思路:

首先导入jar包,任务1已经完成

在函数downfile(String src,String src1,String name)中:

src为源路径,src1为目标路径,name为文件名(即可以重命名)

新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:

新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统

使用Path类封装路径

使用hdfs文件系统对象调用函数copyToLocalFile,下载文件,然后关闭文件系统

主类传参并调用downfile(String src,String src1,String name)

参考代码:

//将hdfs系统下的/user/lee/input/lab1.txt文件下载到本地/home/lee/files/aaa,并重命名为222.txt
package lab1;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FilterFileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;

public class DownloadUtil {
    public static void main(String[] args) throws IOException, InterruptedException {
        DownloadUtil downloadUtil=new DownloadUtil();
        String src="/user/lee/input/lab1.txt";
        String src1="/home/lee/files/aaa";
        String name="/222.txt";
        downloadUtil.downfile(src,src1,name);
    }
    public void downfile(String src,String src1,String name) throws IOException, InterruptedException {
        Configuration configuration=new Configuration();
        configuration.set("fs.defaultFS", "hdfs://master:9000");
        configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        FileSystem hdfsfileSystem=FileSystem.get(URI.create(src),configuration,"root");
        Path localpath=new Path(src1+name);
        Path hdfspath=new Path(src);
        hdfsfileSystem.copyToLocalFile(false,hdfspath,localpath);
        System.out.println("成功下载"+src.split("/")[src.split("/").length-1]+",重命名为"+name.replace("/", ""));
        System.out.println("文件已保存至"+src1);
        hdfsfileSystem.close();
    }
}

实验结果:

任务4:编写一个Java程序,新建一个HDFS文件,并向其中写入你的名字

基本思路:

首先导入jar包,任务1已经完成

在函数writefile(String src)中:

src目标路径

新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:

新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统

使用Path类封装路径

使用BufferedReader类封装输出流,然后写入名字,最后关闭文件系统

 主类传参并调用writefile(String src)

参考代码:

//将名字写入hdfs系统的/user/lee/output/myname.txt(执行程序会自动创建)
package lab1;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class WriteInUtil {

   public static void main(String[] args) throws IOException, InterruptedException {
      String src="/user/lee/output/myname.txt";
      WriteInUtil writeInUtil=new WriteInUtil();
      writeInUtil.writefile(src);
   }
   public void writefile(String src) throws IOException, InterruptedException {
      Configuration configuration=new Configuration();
      configuration.set("fs.defaultFS", "hdfs://master:9000");
        configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        FileSystem hdfsfileSystem=FileSystem.get(URI.create(src), configuration, "root");
        Path hdfsPath=new Path(src);
        FSDataOutputStream out=hdfsfileSystem.create(hdfsPath);
       BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));
        //out.writeUTF("lee");
       writer.write("lee");
        System.out.println("成功写入!");
       writer.close();
        hdfsfileSystem.close();
   }

}

实验结果:

任务5:编写一个Java程序,判断HDFS上是否存在某个文件

基本思路:

首先导入jar包,任务1已经完成

在函数judge(String src)中:

src目标文件路径

新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:

新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统

使用Path类封装路径,调用函数exists(Path)判断文件是否已存在,完成后关闭文件系统

主类传参并调用judge(String src)

参考代码:

//判断/user/lee/input/lab1.txt是否存在,应该是已存在,因为任务二中已经上传了
//判断/user/lee/input/lab0.txt是否存在,应该是不存在
package lab1;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;

public class IsExistUtil {
    public static void main(String[] args) throws IOException, InterruptedException {
        IsExistUtil isExistUtil=new IsExistUtil();
        String src="/user/lee/input/lab1.txt";
        String src2="/user/lee/input/lab0.txt";
        isExistUtil.judge(src);
        isExistUtil.judge(src2);
    }
    public void judge(String src) throws IOException, InterruptedException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://master:9000");
        conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
//        FileSystem hdfsfileSystem = FileSystem.get(URI.create("hdfs://master:9000"),conf,"root");//root用户
        FileSystem hdfsfileSystem = FileSystem.get(URI.create(src),conf,"root");//root用户
        Path srcPath = new Path(src);//原路径
        //判断是否存在相同名称的文件
        if(!hdfsfileSystem.exists(srcPath))//不存在,直接复制
        {
            System.out.println("文件"+src.split("/")[src.split("/").length-1]+"不存在");
        }
        else
            System.out.println("文件"+src.split("/")[src.split("/").length-1]+"已存在");
        hdfsfileSystem.close();
    }
}

实验结果:

任务6:给定HDFS中某一个目录,编写一个Java程序输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息

基本思路:

首先导入jar包,任务1中已经完成

在函数getInfo(String src)中:

src目标路径

新建一个访问配置项对象configuration,并对其设置hdfs相关配置,如hdfs的地址和端口号:

新建一个文件系统对象,利用静态方法get,得到路径和访问配置项对象获得对应文件系统

使用Path类封装路径,利用列表RemoteIterator<LocatedFileStatus>

递归获取目录下的所有文件。调用Get函数获得文件信息

关闭文件系统:

主类传参并调用getInfo(String src)

参考代码:

//获取/user目录下所有文件信息
package lab1;

import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.checkerframework.checker.units.qual.h;

public class FileInfoUtil {

   public static void main(String[] args) throws IOException, InterruptedException {
      String src="/user";
      FileInfoUtil fileInfoUtil=new FileInfoUtil();
      fileInfoUtil.getInfo(src);

   }
   public void getInfo(String src) throws IOException, InterruptedException {
      Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://master:9000");
        configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        FileSystem hdfsfileSystem = FileSystem.get(URI.create(src), configuration, "root");
        Path path = new Path(src);
        RemoteIterator<LocatedFileStatus> filelist=hdfsfileSystem.listFiles(path, true);
        while (filelist.hasNext()) {
         LocatedFileStatus status = filelist.next();
         System.out.println("路径:"+(status.getPath()).toString().replace("hdfs://master:9000", ""));
         System.out.println("文件名:"+status.getPath().getName());
         System.out.println("文件块大小:"+status.getBlockSize());
         System.out.println("文件权限:"+status.getPermission());
         System.out.println("文件内容长度:"+status.getLen());
         //获取该文件块的信息(长度/数据块/Datanode信息)
         BlockLocation[]blockLocations=status.getBlockLocations();
         for(BlockLocation blockLocation:blockLocations) {
            System.out.println("block-length:"+blockLocation.getLength());
            System.out.println("block-offset:"+blockLocation.getOffset());
            //获取datanode主机名
            String[]hosts=blockLocation.getHosts();
            System.out.println("Datanodes:");
            for(String host:hosts) {
               System.out.println(host);
            }
         }
         System.out.println("--------------------------我是分割线---------------------------------");
         
      }
        hdfsfileSystem.close();
   }

}

实验结果:

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值