hadoop笔记3--hdfs操作

这篇文章先记录一下在java代码中对hdfs的基本操作。

打开eclipse,新建一个Map/Reduce工程。后台运行起hadoop。可以看到我的目录结构如下:

eclipse中的目录

我新建了一个HdfsTest.java的类,我们就在这个类里面来实现对hdfs的基本操作。

1.hdfs上创建新文件

首先来看看利用hadoop的API如何创建新文件,主要代码如下:

public static void createFile(String dst,byte[] contents) throws IOException{
  Configuration conf = new Configuration();
  conf.set("fs.defaultFS","hdfs://localhost:9000");
  FileSystem fs = FileSystem.get(conf);
  Path dstPath = new Path(dst);

  // 打开一个输出流
  FSDataOutputStream outputStream = fs.create(dstPath);
  outputStream.write(contents); 
  outputStream.close();
  
  fs.close();
  System.out.println("创建文件成功");
}

来看看那些对应的类是什么意思?(仅仅是简单描述,具体的可看官网API)

Configuration:配置类,生成配置对象。
FileSystem:文件系统的抽象类。
Path:看名字也就看得出来代表的是路径。
FSDataOutputStream:hadoop提供的输出流。

这里用到的主要的就是上面几个类,其实整个过程就是获取到hdfs上的路径,然后通过输出流的方式将数据给写入到hdfs中。除了类略有不同外,和java操作IO流时基本一样。

2.上传文件到hdfs

接下来是上传文件,同样先看看代码:

public static void uploadFile(String src,String dis) throws IOException{
  Configuration conf = new Configuration();
  conf.set("fs.defaultFS","hdfs://localhost:9000");
  FileSystem fs = FileSystem.get(conf);

  //原路径
  Path srcPath = new Path(src);

  //目标路径
  Path disPath = new Path(dis);

  fs.copyFromLocalFile(srcPath,disPath);
  fs.copyFromLocalFile(true,srcPath,disPath);
  
  //打印文件路径
  System.out.println("上传的路径"+conf.get(fs.defaultFS));
  
  //获取目录信息
  FileStatus[] fileStatus = fs.listStatus(disPath);
  
  for(FileStatus file:fileStatus){
    System.out.println(file.getPath());
  }
}

这代码和创建新文件的代码看上去差不多,其实也差不多。还是那么几个类,甚至还少了输出流,利用FileSystem对象的方法就能实现上传文件到hdfs。多出来的类如下:

FileStatus:该对象封装了文件系统中文件和目录的元数据,包括文件的长度、块大小、备份数、修改时间、所有者以及权限等信息。

3.hdfs上文件的删除

文件的删除操作如下:

public static void deleteFile(String filepath) throws IOException{
  Configuration conf = new Configuration();
  conf.set("fs.defaultFS","hdfs://localhost:9000");
  FileSystem fs = FileSystem.get(conf);

  Path  path = new Path(filepath);
  
  //当文件系统关闭时才真正删除此文件。
  //boolean isok = fs.deleteOnExit(path);
  //删除文件或目录,后面的boolean值是true,如果path是目录,则会递归删除下面的所有文件;如果path是文件,则false或true无所谓
  boolean isok = fs.delete(path,true);


  if(isok){
    System.out.println("文件删除成功");
  }else{
    System.out.println("文件删除失败");
  }

  fs.close();
}

4.hdfs上目录的创建

代码如下:

public static void mkdir(String path) throws IOException{
  Configuration conf = new Configuration();
  conf.set("fs.defaultFS","hdfs://localhost:9000");
  FileSystem fs = FileSystem.get(conf);

  Path = path = new Path(path);

  boolean isok = fs.mkdirs(path);

  if(isok){
    System.out.println("创建文件夹成功");
  }else{
    System.out.println("创建文件夹失败");
  }

  fs.close();
}

5.hdfs文件的读取

代码如下:

public static void readfile(String path) throws IOException{
  Configuration conf = new Configuration();
  conf.set("fs.defaultFS","hdfs://localhost:9000");
  FileSystem fs = FileSystem.get(conf);

  Path = path = new Path(path);

  InputStream in = null;

  try{
    in = fs.open(path);
  
    //读取到标准输出
    IOUtils.copyBytes(in,System.out,4096,false);
  }catch(IOException e){
    e.printStackTrace();
  }finally{
    IOUtils.closeStream(in);
  }

  fs.close();
}

以上仅仅是写了些可能会常用的操作来熟悉用java操作hdfs文件系统。

下一篇记录一下关于hadoop中的mapreduce框架

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 当数据量增大到超出了单个物理计算机存储容量时,有必要把它分开存储在多个不同的计算机中。那些管理存储在多个网络互连的...
    单行线的旋律阅读 1,970评论 0 7
  • 先思考问题 我们处在一个大数据的时代已经是不争的事实,这主要表现在数据源多且大,如互联网数据,人们也认识到数据里往...
    墙角儿的花阅读 7,447评论 0 9
  • 之前的有点忘记了,这里在云笔记拿出来再玩玩.看不懂的可以留言 大家可以尝试下Ambari来配置Hadoop的相关环...
    HT_Jonson阅读 3,064评论 0 50
  • 南方天气凉了,北方天气冷了,名正言顺吃火锅的季节已然来临。但如果吃炭火火锅的话,记得要保持室内通风,要是CO中毒,...
    丘岸阅读 232评论 0 1
  • 最近有个日志收集监控的项目采用的技术栈是ELK+JAVA+Spring,客户端语言使用的是Java,以后有机会的话...
    三劫散仙阅读 4,783评论 1 1