Chinaunix首页 | 论坛 | 博客
  • 博客访问: 621799
  • 博文数量: 69
  • 博客积分: 1891
  • 博客等级: 上尉
  • 技术积分: 1359
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-20 23:38
文章分类

全部博文(69)

文章存档

2012年(46)

2011年(23)

分类: LINUX

2012-03-18 21:28:44

      有对应的文件操作的命令,当然,对于开发者而言,HDFS自然有操作文件的API,这里简单讲解一下HDFS的文件操作API,HDFS用作文件操作的类主要位于org.apache.hadooop.fs软件包里。和JAVA IO里有部分类能对应上。这里简单讲解几个。
FSDataInputStream :继承了java.io.DataInputStream,用于读取二进制文件
FSDataOutputStream:继承了java.io.DataOutputStream,用于写入二进制文件
     下面就这两个类实现一个简单的功能。


点击(此处)折叠或打开

  1. import java.io.IOException;

  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FSDataInputStream;
  4. import org.apache.hadoop.fs.FSDataOutputStream;
  5. import org.apache.hadoop.fs.FileStatus;
  6. import org.apache.hadoop.fs.FileSystem;
  7. import org.apache.hadoop.fs.Path;


  8. public class PutMerge {

  9.     /**
  10.      * @param args
  11.      * @throws IOException
  12.      */
  13.     public static void main(String[] args) throws IOException {
  14.         Configuration conf = new Configuration();
  15.         FileSystem hdfs =FileSystem.get(conf);
  16.         FileSystem local = FileSystem.getLocal(conf);
  17.         
  18.         Path inputDir = new Path(args[0]);
  19.         Path hdfsFile = new Path(args[1]);
  20.         System.out.println(args[0]+" "+args[1]);
  21.         
  22.         try{
  23.             FileStatus[] inputFiles = local.listStatus(inputDir);
  24.             FSDataOutputStream out = hdfs.create(hdfsFile);
  25.             
  26.             for(FileStatus file:inputFiles){
  27.                 if(file.isDir())
  28.                     continue;
  29.                 System.out.println(file.getPath().getName()+"===>"+hdfs.getCanonicalServiceName());
  30.                 FSDataInputStream in = local.open(file.getPath());
  31.                 byte[] buffer = new byte[256];
  32.                 int bytesRead = 0;
  33.                 while((bytesRead = in.read(buffer))>0){
  34.                     out.write(buffer,0,bytesRead);
  35.                 }
  36.                 in.close();
  37.             }
  38.             out.close();
  39.         }catch (IOException e) {
  40.             e.printStackTrace();
  41.         }

  42.     }

  43. }
这段代码,《Hadoop In Action》上的,说的是把本地的文件合并后放入HDFS的,不过我看貌似没有实现这样的功能,我的理解是,第一个参数是本地文件夹,第二个参数是HDFS的路劲,结果两个貌似传的都是本地路径,而且生成的文件都在本地。我尝试用hdfs开头的路径,结果报错了,这里很不解。
    代码比较简单,和JAVA本地的操作差不多,这里就不多说了。


阅读(4455) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

asouxuning2013-08-28 12:03:50

博主你好,我也试了这个程序,很疑惑为什么目标文件只能放在本地。用hdfs://开头的路径会抛出异常。不知博主找到原因了没有?
我搭建的环境是单机模式,会不会跟这个有关?