有对应的文件操作的命令,当然,对于开发者而言,HDFS自然有操作文件的API,这里简单讲解一下HDFS的文件操作API,HDFS用作文件操作的类主要位于org.apache.hadooop.fs软件包里。和JAVA IO里有部分类能对应上。这里简单讲解几个。
FSDataInputStream :继承了java.io.DataInputStream,用于读取二进制文件
FSDataOutputStream:继承了java.io.DataOutputStream,用于写入二进制文件
下面就这两个类实现一个简单的功能。
- 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 {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- Configuration conf = new Configuration();
- FileSystem hdfs =FileSystem.get(conf);
- FileSystem local = FileSystem.getLocal(conf);
-
- Path inputDir = new Path(args[0]);
- Path hdfsFile = new Path(args[1]);
- System.out.println(args[0]+" "+args[1]);
-
- try{
- FileStatus[] inputFiles = local.listStatus(inputDir);
- FSDataOutputStream out = hdfs.create(hdfsFile);
-
- for(FileStatus file:inputFiles){
- if(file.isDir())
- continue;
- System.out.println(file.getPath().getName()+"===>"+hdfs.getCanonicalServiceName());
- FSDataInputStream in = local.open(file.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();
- }
- }
- }
这段代码,《Hadoop In Action》上的,说的是把本地的文件合并后放入HDFS的,不过我看貌似没有实现这样的功能,我的理解是,第一个参数是本地文件夹,第二个参数是HDFS的路劲,结果两个貌似传的都是本地路径,而且生成的文件都在本地。我尝试用hdfs开头的路径,结果报错了,这里很不解。 代码比较简单,和JAVA本地的操作差不多,这里就不多说了。
阅读(4455) | 评论(1) | 转发(0) |