菜鸟笔记
提升您的技术认知

hdfs文件操作-ag真人游戏

hdfs是一种文件系统,存储着hadoop应用将要处理的数据,类似于普通的unix和linux文件系统,不同的是他是实现了google的gfs文件系统的思想,是适用于大规模分布式数据处理相关应用的、可扩展的分布式文件系统。它有以下优点:

1、在分布式存储中,经常会出现节点失效的情况,hdfs可以持续监视,错误检查,容错处理,自动恢复;

2、分布式存储的文件都是非常巨大的,hdfs重新规定了每次i/o的块的大小;

3、对于搜索引擎的业务,大部分都只会在文件尾添加新数据,很少修改已有数据。hdfs做了优化;

4、与应用一起设计的文件系统api对整个系统的弹性和适用性有很大好处;

5、有效的支持多个客户端并行添加同一个文件。

虽然hdfs实现了这么多的功能,但是因为它已经实现为一个开源框架,所以对于程序开发者来说,并不需要了解其底层的文件操作,我们可以通过其提供的一套与linux文件命令类似的命令行工具来进行文件操作。

基本文件命令:

格式为:hadoop fs -cmd

cmd的命名通常与unix对应的命令名相同。例如,文件列表命令: hadoop fs -ls

1、添加目录和文件

hdfs有一个默认的工作目录 /user/$user,其中$user是你的登录用户名。不过目录不会自动建立,我们现在用mkdir建立它,我使用的是chen作为用户名。

hadoop fs -mkdir /user/chen

(hadoop的mkdir命令会自动创建父目录,类似于带-p的unix命令)

我们现在放本地文件系统的一个文件进去。

hadoop fs -put example.txt .

最后一个参数是句点,相当于放入了默认的工作目录,等价于 hadoop fs -put example.txt /user/chen

当你把文件放入hdfs上后,你就可以运行hadoop程序来处理它。

2、检索文件

get命令与put命令相反,它从hdfs复制文件回到本地文件系统。

hadoop fs -get example.txt .

复制到本地的当前工作目录中。

另一种是显示数据,用cat

hadoop fs -cat example.txt

3、删除文件

rm命令

hadoop fs -rm example.txt

也可以用来删除空目录

编程读写hdfs

利用hdfs给我们提供的api,我们同样可以访问它。

在hadoop中用作文件操作的主类位于org.apache.hadoop.fs软件包中。包括常见的open、read、write、close。hadoop文件的api起点是filesystem类,这是一个与文件系统交互的抽象类,我们通过调用factory的方法filesystem.get(configuration conf)来取得所需的filesystem实例,如下我们可以获得与hdfs接口的filesystem对象:

configuration conf = new configuration();

filesystem hdfs = filesystem.get(conf);//获得hdfs的filesystem对象

如果我们要实现hdfs与本地文件系统的交互,我们还需要获取本地文件系统的filesystem对象

filesystem local = filesystem.getlocal(conf);//获得本地文件系统的filesystem对象

以下代码讲解了一个例子,我们开发一个putmerge程序,用于合并本地文件后放入hdfs,因为大文件hdfs处理起来比较容易,所以这个程序经常会在以后的开发中用到

import java.io.ioexception;
import org.apache.hadoop.conf.configuration;
import org.apache.hadoop.fs.fsdatainputstream;
import org.apache.hadoop.fs.fsdataoutputstream;
import org.apache.hadoop.fs.filestatus;
import org.apache.hadoop.fs.filesystem;
import org.apache.hadoop.fs.path;
public class putmerge {
    public static void main(string[] args) throws ioexception {
  
	configuration conf = new configuration();
	filesystem hdfs =filesystem.get(conf); //获得hdfs文件系统的对象
	filesystem local = filesystem.getlocal(conf);//获得本地文件系统的对象
	path inputdir = new path(args[0]);//设定输入目录
	path hdfsfile = new path(args[1]);//设定输出目录
	try{
	   filestatus[] inputfiles = local.liststatus(inputdir);//filestatus的liststatus()方法获得一个目录中的文件列表
             fsdataoutputstream out = hdfs.create(hdfsfile);//生成hdfs输出流
             for(int i = 0; i < inputfiles.length; i   ){
	       system.out.println(inputfiles[i].getpath().getname());
	       fsdatainputstream in = local.open(inputfiles[i].getpath());//打开本地输入流
	       byte[] buffer = new byte[256];
	       int bytesread = 0;
	       while((bytesread = in.read(buffer))>0){
	           out.write(buffer,0,bytesread);//通过一个循环来写入
	       }
	       in.close();
            }
            out.close();
        }catch (ioexception e) {
	  e.printstacktrace();
        }
    }
}

 

网站地图