HDFS文件的基本操作

Posted 123456www

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS文件的基本操作相关的知识,希望对你有一定的参考价值。

HDFS文件的基本操作:

package wjn;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Scanner;

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.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.io.IOUtils;
import org.apache.log4j.BasicConfigurator;

public class ww 

    public static Scanner sc = new Scanner(System.in); 
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException 
        // TODO Auto-generated method stub
        
        main9();
    

    public static void main10() throws IOException
        String p1 = "/user/hadoop/text/text1";
        String p2 = "/user/hadoop";
        if(mv(p1,p2))
            System.out.println("文件移动成功");
        else
            System.out.println("文件移动失败");
        
    
    
    public static void main9() throws IOException
        String hdfspath = "/user/hadoop/text2";
        
        if(deleteFileFromHDFS(hdfspath))
        System.out.println("已删除文件"+hdfspath);
        else
            System.out.println("删除文件失败");
        
    
    
    public static void main7() throws IOException
        
        String hdfspath1 = "/user/hadoop";
        boolean forcedelete = false;
        if(!ifex(hdfspath1))
            mkdir(hdfspath1);
            System.out.println("创建目录"+hdfspath1);
        else
            if(isempty(hdfspath1)||forcedelete)
                rmDir(hdfspath1);
                System.out.println("删除目录"+hdfspath1);
            else
                System.out.println("目录不为空,不删除");
            
        
        
    
    
    
public static void main6() throws IOException
        
    String hdfspath = "/user/hadoop/text2";
    String hdfspath1 = "/user/hadoop";
    if(ifex(hdfspath))
        deleteFileFromHDFS(hdfspath);
        System.out.println("该路径存在,删除路径"+hdfspath);
    else
        if(!ifex(hdfspath1))
            mkdir(hdfspath1);
            System.out.println("创建文件夹"+hdfspath1);
        
        touchz(hdfspath);
        System.out.println("创建路径"+hdfspath);
    
    
    
    
    public static void main5() throws IOException
        
        String hdfspath = "/user/hadoop";
        System.out.println("所有文件信息如下");
        lsDir(hdfspath);
    
    
    public static void main4() throws IOException
        String hdfspath = "/user/hadoop/text2";
        System.out.println("文件信息如下");
        ls(hdfspath);
    
    
    
    public static void main3() throws IOException
        String hdfspath = "/user/hadoop/text2";
        cat(hdfspath);
        System.out.println("读取完成");
    
    
    public static void main2() throws IOException
        String localpath = "/home/hadoop/1234.txt";
        String hdfspath = "/user/hadoop/text2";
        download(hdfspath,localpath);
        System.out.println("文件下载成功");
    
    
    
    public static void main1() throws IOException
        String localpath = "/home/hadoop/123.txt";
        String hdfspath = "/user/hadoop/text2";
        if(ifex(hdfspath))
            System.out.println("文件存在,请选择追加(1)还是覆盖(2)");
            int i = sc.nextInt();
            if(i==1)
                appendFileToHDFS(hdfspath,localpath);
                System.out.println("文件追加成功");
            else if(i==2)
                deleteFileFromHDFS(hdfspath);
                update(localpath,hdfspath);
                System.out.println("文件覆盖成功");
            else
                System.out.println("输入有误");
            
                
        else
            update(localpath,hdfspath);
            System.out.println("文件不存在,上传成功");
        
    
    
    
    public static void update(String localpath , String hdfspath) throws IOException
        
        InputStream in = new BufferedInputStream(new FileInputStream(localpath));
        FileSystem fileSystem = FileSystem.get(URI.create(hdfspath), new Configuration());
        OutputStream out = fileSystem.create(new Path(hdfspath));

        IOUtils.copyBytes(in, out, 4096, true);
        fileSystem.close();
        
    
    
    //判断hdfs中文件是否存在
    public static boolean  ifex(String hdfspath) throws IOException
         
        Configuration conf = new Configuration(); 
        conf.set("fs.defaultFS","hdfs://localhost:9000"); 
        conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); 
        FileSystem fs = FileSystem.get(conf); 
        if (fs.exists(new Path(hdfspath))) 
            fs.close();
            return true;
            else 
                fs.close();
                return false;
             
    
    
    //创建目录
    public static void mkdir(String hdfspath) throws IOException
        
        FileSystem fileSystem = FileSystem.get(URI.create(hdfspath), new Configuration());
        Path dirPath = new Path(hdfspath);
        fileSystem.mkdirs(dirPath);
        fileSystem.close();
    
    
    //创建文件
public static void touchz(String hdfspath) throws IOException
        
        FileSystem fileSystem = FileSystem.get(URI.create(hdfspath), new Configuration());
        Path dirPath = new Path(hdfspath);
        FSDataOutputStream outputStream = fileSystem.create(dirPath);
        outputStream.close();
        fileSystem.close();
    
    
    
    
    public static void appendFileToHDFS(String hdfsPath, String localFilePath) throws IOException 
        Configuration config = new Configuration();
        config.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");
        config.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true");

        FileSystem fileSystem = FileSystem.get(URI.create(hdfsPath), config);

        InputStream in = new BufferedInputStream(new FileInputStream(localFilePath));
        FSDataOutputStream out = fileSystem.append(new Path(hdfsPath));

        IOUtils.copyBytes(in, out, 4096, true);
        fileSystem.close();
    
    
    //删除文件
    public static boolean deleteFileFromHDFS(String hdfsPath) throws IOException 
        FileSystem fileSystem = FileSystem.get(URI.create(hdfsPath), new Configuration());
        boolean result = fileSystem.deleteOnExit(new Path(hdfsPath));
        fileSystem.close();
        return result;
    
    
    //删除目录
    public static void rmDir(String hdfspath) throws IOException
    
        FileSystem fileSystem = FileSystem.get(URI.create(hdfspath), new Configuration());
        fileSystem.delete(new Path(hdfspath),true);
        fileSystem.close();
    
    
    //判断目录是否为空
    public static boolean isempty(String hdfspath) throws IOException
        
        FileSystem fileSystem = FileSystem.get(URI.create(hdfspath), new Configuration());
        RemoteIterator<LocatedFileStatus> remoteIterator = fileSystem.listFiles(new Path(hdfspath), true);
        return !remoteIterator.hasNext();
    
    
    
    public static void download (String hdfsPath, String localPath) throws IOException 
        FileSystem fileSystem = FileSystem.get(URI.create(hdfsPath), new Configuration());

        FSDataInputStream in = fileSystem.open(new Path(hdfsPath));
        OutputStream out = new FileOutputStream(localPath);

        IOUtils.copyBytes(in, out, 4096, true);
        fileSystem.close();
    
    
    //根据hdfs路径输出其内容到终端
    public static void cat(String hdfspath) throws IOException
        
           FileSystem fileSystem = FileSystem.get(URI.create(hdfspath), new Configuration());

            FSDataInputStream in = fileSystem.open(new Path(hdfspath));
        
            BufferedReader d = new BufferedReader(new InputStreamReader(in));
            String line = null;
            while((line = d.readLine())!=null)
                System.out.println(line);
            
            d.close();
            in.close();
    
    
    //显示hdfs中指定文件的信息
    public static void ls(String hdfspath) throws IOException
        
        FileSystem fileSystem = FileSystem.get(URI.create(hdfspath), new Configuration());
        Path path = new Path(hdfspath);
        FileStatus[] fileStatus = fileSystem.listStatus(path);
        for (FileStatus s : fileStatus)
            System.out.println("路径:"+s.getPath().toString());
            System.out.println("权限:"+s.getPermission().toString());
            System.out.println("大小:"+s.getLen());
            Long time = s.getModificationTime();
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String date = format.format(time);
            System.out.println("时间:"+date);
        
    
    
    
    //显示文件夹下所有文件的信息
    public static void lsDir(String hdfspath) throws IOException
        
        FileSystem fileSystem = FileSystem.get(URI.create(hdfspath), new Configuration());
        Path dirPath = new Path(hdfspath);
        RemoteIterator<LocatedFileStatus> remoteIterator = fileSystem.listFiles(dirPath, true);
        while(remoteIterator.hasNext())
            
            FileStatus s = remoteIterator.next();
            System.out.println("路径:"+s.getPath().toString());
            System.out.println("权限:"+s.getPermission().toString());
            System.out.println("大小:"+s.getLen());
            Long time = s.getModificationTime();
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String date = format.format(time);
            System.out.println("时间:"+date);
            System.out.println();
        
        fileSystem.close();
    
    
    //移动文件
    public static boolean mv(String path1,String path2) throws IOException
        
        FileSystem fileSystem = FileSystem.get(URI.create(path1), new Configuration());
        
        Path p1 = new Path(path1);
        Path p2 = new Path(path2);
        boolean result = fileSystem.rename(p1, p2);
        fileSystem.close();
        return result;
    
    

 

以上是关于HDFS文件的基本操作的主要内容,如果未能解决你的问题,请参考以下文章

HDFS文件MetaData操作

HDFS中的shell操作

HDFS常用文件操作命令及注意事项

Java API操作HDFS

HDFS文件的基本操作

实验二 HDFS的Shell命令操作,和HDFS的API操作