zoukankan      html  css  js  c++  java
  • HDFS Shell命令操作与java代码操作

    (一)编程实现以下功能,并利用 Hadoop 提供的 Shell 命令完成相同任务:

    (1)     向 HDFS 中上传任意文本文件,如果指定的文件在 HDFS 中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件;

    开启Hadoop:

    创建两个文件以供实验使用:
    上传本地文件到hdfs系统的指令:

    hadoop fs -put text.txt

    文件存在,追加到文件末尾的指令:

    hadoop fs -appendToFile local.txt text.txt

    文件存在,覆盖文件的命令:

    hadoop fs -copyFromLocal -f local.txt text.txt

    代码实现:

    package cn.edu.zucc.hdfs;
    
     
    
    import java.io.FileInputStream;
    
    import java.io.IOException;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.FSDataOutputStream;
    
    import org.apache.hadoop.fs.FileSystem;
    
    import org.apache.hadoop.fs.Path;
    
     
    
    public class CopyFromLocalFile {
    
       /**
    
        * 判断路径是否存在
    
        */
    
       public static boolean test(Configuration conf, String path) {
    
           try (FileSystem fs = FileSystem.get(conf)) {
    
               return fs.exists(new Path(path));
    
           } catch (IOException e) {
    
               e.printStackTrace();
    
               return false;
    
           }
    
       }
    
     
    
       /**
    
        * 复制文件到指定路径 若路径已存在,则进行覆盖
    
        */
    
       public static void copyFromLocalFile(Configuration conf,
    
               String localFilePath, String remoteFilePath) {
    
           Path localPath = new Path(localFilePath);
    
           Path remotePath = new Path(remoteFilePath);
    
           try (FileSystem fs = FileSystem.get(conf)) {
    
               /* fs.copyFromLocalFile 第一个参数表示是否删除源文件,第二个参数表示是否覆盖 */
    
               fs.copyFromLocalFile(false, true, localPath, remotePath);
    
           } catch (IOException e) {
    
               e.printStackTrace();
    
           }
    
     
    
       }
    
     
    
       /**
    
        * 追加文件内容
    
        */
    
       public static void appendToFile(Configuration conf, String localFilePath,
    
               String remoteFilePath) {
    
           Path remotePath = new Path(remoteFilePath);
    
           try (FileSystem fs = FileSystem.get(conf);
    
                   FileInputStream in = new FileInputStream(localFilePath);) {
    
               FSDataOutputStream out = fs.append(remotePath);
    
               byte[] data = new byte[1024];
    
               int read = -1;
    
               while ((read = in.read(data)) > 0) {
    
                   out.write(data, 0, read);
    
               }
    
               out.close();
    
           } catch (IOException e) {
    
               e.printStackTrace();
    
           }
    
       }
    
     
    
       /**
    
        * 主函数
    
        */
    
       public static void main(String[] args) {
    
           Configuration conf = new Configuration();
    
           conf.set("fs.defaultFS", "hdfs://localhost:9000");
    
           String localFilePath = "/usr/local/hadoop/text.txt"; // 本地路径
    
           String remoteFilePath = "/user/tiny/text.txt"; // HDFS路径
    
           // String choice = "append"; // 若文件存在则追加到文件末尾
    
           String choice = "overwrite"; // 若文件存在则覆盖
    
     
    
           try {
    
               /* 判断文件是否存在 */
    
               boolean fileExists = false;
    
               if (CopyFromLocalFile.test(conf, remoteFilePath)) {
    
                   fileExists = true;
    
                   System.out.println(remoteFilePath + " 已存在.");
    
               } else {
    
                   System.out.println(remoteFilePath + " 不存在.");
    
               }
    
               /* 进行处理 */
    
               if (!fileExists) { // 文件不存在,则上传
    
                   CopyFromLocalFile.copyFromLocalFile(conf, localFilePath,
    
                           remoteFilePath);
    
                   System.out.println(localFilePath + " 已上传至 " + remoteFilePath);
    
               } else if (choice.equals("overwrite")) { // 选择覆盖
    
                   CopyFromLocalFile.copyFromLocalFile(conf, localFilePath,
    
                           remoteFilePath);
    
                   System.out.println(localFilePath + " 已覆盖 " + remoteFilePath);
    
               } else if (choice.equals("append")) { // 选择追加
    
                   CopyFromLocalFile.appendToFile(conf, localFilePath,
    
                           remoteFilePath);
    
                   System.out.println(localFilePath + " 已追加至 " + remoteFilePath);
    
               }
    
           } catch (Exception e) {
    
               e.printStackTrace();
    
           }
    
       }
    
    }
    
     
    
     
    
     
    
    (2)     从 HDFS 中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
    
    Shell命令:
    
                    if $(hadoop fs -test -e /usr/local/hadoop/text.txt);
    
                    then $(hadoop fs -copyToLocal text.txt ./text.txt); 
                    else $(hadoop fs -copyToLocal text.txt ./text2.txt); 
                    fi
     
                    代码实现:
    
          package cn.edu.zucc.hdfs;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.*;
    
    import org.apache.hadoop.fs.FileSystem;
    
     
    
    import java.io.*;
    
     
    
    public class CopyToLocal {
    
        /**
    
         * 下载文件到本地 判断本地路径是否已存在,若已存在,则自动进行重命名
    
         */
    
        public static void copyToLocal(Configuration conf, String remoteFilePath,
    
                String localFilePath) {
    
            Path remotePath = new Path(remoteFilePath);
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                File f = new File(localFilePath);
    
                /* 如果文件名存在,自动重命名(在文件名后面加上 _0, _1 ...) */
    
                if (f.exists()) {
    
                    System.out.println(localFilePath + " 已存在.");
    
                    Integer i = Integer.valueOf(0);
    
                    while (true) {
    
                        f = new File(localFilePath + "_" + i.toString());
    
                        if (!f.exists()) {
    
                            localFilePath = localFilePath + "_" + i.toString();
    
                            break;
    
                        } else {
    
                            i++;
    
                            continue;
    
                        }
    
                    }
    
                    System.out.println("将重新命名为: " + localFilePath);
    
                }
    
                // 下载文件到本地
    
                Path localPath = new Path(localFilePath);
    
                fs.copyToLocalFile(remotePath, localPath);
    
            } catch (IOException e) {
    
                // TODO Auto-generated catch block
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 主函数
    
         */
    
        public static void main(String[] args) {
    
            Configuration conf = new Configuration();
    
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
    
            String localFilePath = "/usr/local/hadoop/text.txt"; // 本地路径
    
            String remoteFilePath = "/user/tiny/text.txt"; // HDFS路径
    
     
    
            try {
    
                CopyToLocal.copyToLocal(conf, remoteFilePath, localFilePath);
    
                System.out.println("下载完成");
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }

    (3)     将 HDFS 中指定文件的内容输出到终端中;

    Shell命令:

    hadoop fs -cat text.txt

    代码实现:

    package cn.edu.zucc.hdfs;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.*;
    
    import org.apache.hadoop.fs.FileSystem;
    
     
    
    import java.io.*;
    
     
    
    public class Cat {
    
        /**
    
         * 读取文件内容
    
         */
    
        public static void cat(Configuration conf, String remoteFilePath) {
    
            Path remotePath = new Path(remoteFilePath);
    
            try (FileSystem fs = FileSystem.get(conf);
    
                    FSDataInputStream in = fs.open(remotePath);
    
                    BufferedReader d = new BufferedReader(new InputStreamReader(in));) {
    
                String line;
    
                while ((line = d.readLine()) != null) {
    
                    System.out.println(line);
    
                }
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 主函数
    
         */
    
        public static void main(String[] args) {
    
            Configuration conf = new Configuration();
    
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
    
            String remoteFilePath = "/user/tiny/input/text.txt"; // HDFS路径
    
     
    
            try {
    
                System.out.println("读取文件: " + remoteFilePath);
    
                Cat.cat(conf, remoteFilePath);
    
                System.out.println("
    读取完成");
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }

    (4)     显示 HDFS 中指定的文件的读写权限、大小、创建时间、路径等信息;

    Shell命令:

    hadoop fs -ls -h text.txt

    代码实现:

    package cn.edu.zucc.hdfs;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.*;
    
    import org.apache.hadoop.fs.FileSystem;
    
     
    
    import java.io.*;
    
    import java.text.SimpleDateFormat;
    
     
    
    public class List {
    
        /**
    
         * 显示指定文件的信息
    
         */
    
        public static void ls(Configuration conf, String remoteFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path remotePath = new Path(remoteFilePath);
    
                FileStatus[] fileStatuses = fs.listStatus(remotePath);
    
                for (FileStatus s : fileStatuses) {
    
                    System.out.println("路径: " + s.getPath().toString());
    
                    System.out.println("权限: " + s.getPermission().toString());
    
                    System.out.println("大小: " + s.getLen());
    
                    /* 返回的是时间戳,转化为时间日期格式 */
    
                    long timeStamp = s.getModificationTime();
    
                    SimpleDateFormat format = new SimpleDateFormat(
    
                            "yyyy-MM-dd HH:mm:ss");
    
                    String date = format.format(timeStamp);
    
                    System.out.println("时间: " + date);
    
                }
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 主函数
    
         */
    
        public static void main(String[] args) {
    
            Configuration conf = new Configuration();
    
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
    
            String remoteFilePath = "/user/tiny/text.txt"; // HDFS路径
    
     
    
            try {
    
                System.out.println("读取文件信息: " + remoteFilePath);
    
                List.ls(conf, remoteFilePath);
    
                System.out.println("
    读取完成");
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }
    
     

    (5)     给定 HDFS 中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;

    Shell命令:hadoop fs -ls -R -h /user/tiny

    代码实现:

    package cn.edu.zucc.hdfs;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.*;
    
    import org.apache.hadoop.fs.FileSystem;
    
     
    
    import java.io.*;
    
    import java.text.SimpleDateFormat;
    
     
    
    public class ListDir {
    
        /**
    
         * 显示指定文件夹下所有文件的信息(递归)
    
         */
    
        public static void lsDir(Configuration conf, String remoteDir) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path dirPath = new Path(remoteDir);
    
                /* 递归获取目录下的所有文件 */
    
                RemoteIterator<LocatedFileStatus> remoteIterator = fs.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 timeStamp = s.getModificationTime();
    
                    SimpleDateFormat format = new SimpleDateFormat(
    
                            "yyyy-MM-dd HH:mm:ss");
    
                    String date = format.format(timeStamp);
    
                    System.out.println("时间: " + date);
    
                    System.out.println();
    
                }
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 主函数
    
         */
    
        public static void main(String[] args) {
    
            Configuration conf = new Configuration();
    
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
    
            String remoteDir = "/user/tiny"; // HDFS路径
    
     
    
            try {
    
                System.out.println("(递归)读取目录下所有文件的信息: " + remoteDir);
    
                ListDir.lsDir(conf, remoteDir);
    
                System.out.println("读取完成");
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }

     

    (6)     提供一个 HDFS 内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;

     Shell命令:

    if $(hadoop fs -test -d dir1/dir2);

    then $(hadoop fs -touchz dir1/dir2/filename);

    else $(hadoop fs -mkdir -p dir1/dir2 && hdfs dfs -touchz dir1/dir2/filename);

    fi




    代码:

    package cn.edu.zucc.hdfs;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.*;
    
    import java.io.*;
    
     
    
    public class RemoveOrMake {
    
        /**
    
         * 判断路径是否存在
    
         */
    
        public static boolean test(Configuration conf, String path) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                return fs.exists(new Path(path));
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
                return false;
    
            }
    
        }
    
     
    
        /**
    
         * 创建目录
    
         */
    
        public static boolean mkdir(Configuration conf, String remoteDir) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path dirPath = new Path(remoteDir);
    
                return fs.mkdirs(dirPath);
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
                return false;
    
            }
    
        }
    
     
    
        /**
    
         * 创建文件
    
         */
    
        public static void touchz(Configuration conf, String remoteFilePath) {
    
            Path remotePath = new Path(remoteFilePath);
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                FSDataOutputStream outputStream = fs.create(remotePath);
    
                outputStream.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 删除文件
    
         */
    
        public static boolean rm(Configuration conf, String remoteFilePath) {
    
            Path remotePath = new Path(remoteFilePath);
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                return fs.delete(remotePath, false);
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
                return false;
    
            }
    
        }
    
     
    
        /**
    
         * 主函数
    
         */
    
        public static void main(String[] args) {
    
            Configuration conf = new Configuration();
    
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
    
            String remoteFilePath = "/user/tiny/input/text.txt"; // HDFS路径
    
            String remoteDir = "/user/tiny/input"; // HDFS路径对应的目录
    
     
    
            try {
    
                /* 判断路径是否存在,存在则删除,否则进行创建 */
    
                if (RemoveOrMake.test(conf, remoteFilePath)) {
    
                    RemoveOrMake.rm(conf, remoteFilePath); // 删除
    
                    System.out.println("删除文件: " + remoteFilePath);
    
                } else {
    
                    if (!RemoveOrMake.test(conf, remoteDir)) { // 若目录不存在,则进行创建
    
                        RemoveOrMake.mkdir(conf, remoteDir);
    
                        System.out.println("创建文件夹: " + remoteDir);
    
                    }
    
                    RemoveOrMake.touchz(conf, remoteFilePath);
    
                    System.out.println("创建文件: " + remoteFilePath);
    
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }
    
     

    (7)     提供一个 HDFS 的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在,则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;

    Shell命令:

    if $(hadoop fs -test -d dir1/dir2);

    then $(hadoop fs -touchz dir1/dir2/filename);

    else $(hadoop fs -mkdir -p dir1/dir2 && hdfs dfs -touchz dir1/dir2/filename);

    fi

    代码:

    package cn.edu.zucc.hdfs;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.*;
    
    import org.apache.hadoop.fs.FileSystem;
    
     
    
    import java.io.*;
    
     
    
    public class AppendToFile {
    
        /**
    
         * 判断路径是否存在
    
         */
    
        public static boolean test(Configuration conf, String path) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                return fs.exists(new Path(path));
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
                return false;
    
            }
    
        }
    
     
    
        /**
    
         * 追加文本内容
    
         */
    
        public static void appendContentToFile(Configuration conf, String content,
    
                String remoteFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path remotePath = new Path(remoteFilePath);
    
                /* 创建一个文件输出流,输出的内容将追加到文件末尾 */
    
                FSDataOutputStream out = fs.append(remotePath);
    
                out.write(content.getBytes());
    
                out.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
     
    
        }
    
     
    
        /**
    
         * 追加文件内容
    
         */
    
        public static void appendToFile(Configuration conf, String localFilePath,
    
                String remoteFilePath) {
    
            Path remotePath = new Path(remoteFilePath);
    
            try (FileSystem fs = FileSystem.get(conf);
    
                    FileInputStream in = new FileInputStream(localFilePath);) {
    
                FSDataOutputStream out = fs.append(remotePath);
    
                byte[] data = new byte[1024];
    
                int read = -1;
    
                while ((read = in.read(data)) > 0) {
    
                    out.write(data, 0, read);
    
                }
    
                out.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 移动文件到本地 移动后,删除源文件
    
         */
    
        public static void moveToLocalFile(Configuration conf,
    
                String remoteFilePath, String localFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path remotePath = new Path(remoteFilePath);
    
                Path localPath = new Path(localFilePath);
    
                fs.moveToLocalFile(remotePath, localPath);
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 创建文件
    
         */
    
        public static void touchz(Configuration conf, String remoteFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path remotePath = new Path(remoteFilePath);
    
                FSDataOutputStream outputStream = fs.create(remotePath);
    
                outputStream.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 主函数
    
         */
    
        public static void main(String[] args) {
    
            Configuration conf = new Configuration();
    
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
    
            String remoteFilePath = "/user/tiny/text.txt"; // HDFS文件
    
            String content = "新追加的内容
    ";
    
            String choice = "after"; // 追加到文件末尾
    
            // String choice = "before"; // 追加到文件开头
    
     
    
            try {
    
                /* 判断文件是否存在 */
    
                if (!AppendToFile.test(conf, remoteFilePath)) {
    
                    System.out.println("文件不存在: " + remoteFilePath);
    
                } else {
    
                    if (choice.equals("after")) { // 追加在文件末尾
    
                        AppendToFile.appendContentToFile(conf, content,
    
                                remoteFilePath);
    
                        System.out.println("已追加内容到文件末尾" + remoteFilePath);
    
                    } else if (choice.equals("before")) { // 追加到文件开头
    
                        /* 没有相应的api可以直接操作,因此先把文件移动到本地,创建一个新的HDFS,再按顺序追加内容 */
    
                        String localTmpPath = "/user/hadoop/tmp.txt";
    
                        AppendToFile.moveToLocalFile(conf, remoteFilePath,
    
                                localTmpPath); // 移动到本地
    
                        AppendToFile.touchz(conf, remoteFilePath); // 创建一个新文件
    
                        AppendToFile.appendContentToFile(conf, content,
    
                                remoteFilePath); // 先写入新内容
    
                        AppendToFile.appendToFile(conf, localTmpPath,
    
                                remoteFilePath); // 再写入原来内容
    
                        System.out.println("已追加内容到文件开头: " + remoteFilePath);
    
                    }
    
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }

     

    (8)     向 HDFS 中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;

    Shell命令:

    追加带文件末尾:

    hadoop fs -appendToFile local.txt text.txt

    追加到文件开头:

    hadoop fs -get text.txt
    cat text.txt >> local.txt
    hadoop fs -copyFromLocal -f text.txt text.txt

    代码:

     

     

    package cn.edu.zucc.hdfs;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.*;
    
    import org.apache.hadoop.fs.FileSystem;
    
     
    
    import java.io.*;
    
     
    
    public class AppendToFile {
    
        /**
    
         * 判断路径是否存在
    
         */
    
        public static boolean test(Configuration conf, String path) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                return fs.exists(new Path(path));
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
                return false;
    
            }
    
        }
    
     
    
        /**
    
         * 追加文本内容
    
         */
    
        public static void appendContentToFile(Configuration conf, String content,
    
                String remoteFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path remotePath = new Path(remoteFilePath);
    
                /* 创建一个文件输出流,输出的内容将追加到文件末尾 */
    
                FSDataOutputStream out = fs.append(remotePath);
    
                out.write(content.getBytes());
    
                out.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
     
    
        }
    
     
    
        /**
    
         * 追加文件内容
    
         */
    
        public static void appendToFile(Configuration conf, String localFilePath,
    
                String remoteFilePath) {
    
            Path remotePath = new Path(remoteFilePath);
    
            try (FileSystem fs = FileSystem.get(conf);
    
                    FileInputStream in = new FileInputStream(localFilePath);) {
    
                FSDataOutputStream out = fs.append(remotePath);
    
                byte[] data = new byte[1024];
    
                int read = -1;
    
                while ((read = in.read(data)) > 0) {
    
                    out.write(data, 0, read);
    
                }
    
                out.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 移动文件到本地 移动后,删除源文件
    
         */
    
        public static void moveToLocalFile(Configuration conf,
    
                String remoteFilePath, String localFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path remotePath = new Path(remoteFilePath);
    
                Path localPath = new Path(localFilePath);
    
                fs.moveToLocalFile(remotePath, localPath);
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 创建文件
    
         */
    
        public static void touchz(Configuration conf, String remoteFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path remotePath = new Path(remoteFilePath);
    
                FSDataOutputStream outputStream = fs.create(remotePath);
    
                outputStream.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 主函数
    
         */
    
        public static void main(String[] args) {
    
            Configuration conf = new Configuration();
    
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
    
            String remoteFilePath = "/user/tiny/text.txt"; // HDFS文件
    
            String content = "新追加的内容
    ";
    
            String choice = "after"; // 追加到文件末尾
    
            // String choice = "before"; // 追加到文件开头
    
     
    
            try {
    
                /* 判断文件是否存在 */
    
                if (!AppendToFile.test(conf, remoteFilePath)) {
    
                    System.out.println("文件不存在: " + remoteFilePath);
    
                } else {
    
                    if (choice.equals("after")) { // 追加在文件末尾
    
                        AppendToFile.appendContentToFile(conf, content,
    
                                remoteFilePath);
    
                        System.out.println("已追加内容到文件末尾" + remoteFilePath);
    
                    } else if (choice.equals("before")) { // 追加到文件开头
    
                        /* 没有相应的api可以直接操作,因此先把文件移动到本地,创建一个新的HDFS,再按顺序追加内容 */
    
                        String localTmpPath = "/user/hadoop/tmp.txt";
    
                        AppendToFile.moveToLocalFile(conf, remoteFilePath,
    
                                localTmpPath); // 移动到本地
    
                        AppendToFile.touchz(conf, remoteFilePath); // 创建一个新文件
    
                        AppendToFile.appendContentToFile(conf, content,
    
                                remoteFilePath); // 先写入新内容
    
                        AppendToFile.appendToFile(conf, localTmpPath,
    
                                remoteFilePath); // 再写入原来内容
    
                        System.out.println("已追加内容到文件开头: " + remoteFilePath);
    
                    }
    
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }

     

    (9)     删除 HDFS 中指定的文件;

    Shell命令:Hadoop fs -rmr test

    (10)   在 HDFS 中,将文件从源路径移动到目的路径。

    Shell命令:hadoop fs -mv text.txt input

    代码:

    package cn.edu.zucc.hdfs;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.*;
    
    import org.apache.hadoop.fs.FileSystem;
    
     
    
    import java.io.*;
    
     
    
    public class MoveFile {
    
        /**
    
         * 移动文件
    
         */
    
        public static boolean mv(Configuration conf, String remoteFilePath,
    
                String remoteToFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path srcPath = new Path(remoteFilePath);
    
                Path dstPath = new Path(remoteToFilePath);
    
                return fs.rename(srcPath, dstPath);
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
                return false;
    
            }
    
        }
    
     
    
        /**
    
         * 主函数
    
         */
    
        public static void main(String[] args) {
    
            Configuration conf = new Configuration();
    
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
    
            String remoteFilePath = "hdfs:///user/tiny/text.txt"; // 源文件HDFS路径
    
            String remoteToFilePath = "hdfs:///user/tiny/input"; // 目的HDFS路径
    
     
    
            try {
    
                if (MoveFile.mv(conf, remoteFilePath, remoteToFilePath)) {
    
                    System.out.println("将文件 " + remoteFilePath + " 移动到 "
    
                            + remoteToFilePath);
    
                } else {
    
                    System.out.println("操作失败(源文件不存在或移动失败)");
    
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }

     

    (二)编程实现一个类“MyFSDataInputStream”,该类继承“org.apache.hadoop.fs.FSDataInputSt ream”,要求如下:实现按行读取 HDFS 中指定文件的方法“readLine()”,如果读到文件末尾,则返回空,否则返回文件一行的文本。

    代码:

    package cn.edu.zucc.hdfs;
    
     
    
    import java.io.BufferedReader;
    
    import java.io.IOException;
    
    import java.io.InputStream;
    
    import java.io.InputStreamReader;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.*;
    
     
    
    public class MyFSDataInputStream extends FSDataInputStream {
    
     
    
       public MyFSDataInputStream(InputStream in) {
    
           super(in);
    
       }
    
     
    
       public static String readline(Configuration conf, String remoteFilePath) {
    
           try (FileSystem fs = FileSystem.get(conf)) {
    
               Path remotePath = new Path(remoteFilePath);
    
               FSDataInputStream in = fs.open(remotePath);
    
               BufferedReader d = new BufferedReader(new InputStreamReader(in));
    
               String line = null;
    
               if ((line = d.readLine()) != null) {
    
                   d.close();
    
                   in.close();
    
                   return line;
    
               }
    
               return null;
    
           } catch (IOException e) {
    
               // TODO Auto-generated catch block
    
               e.printStackTrace();
    
               return null;
    
           }
    
     
    
       }
    
     
    
       public static void main(String[] args) {
    
           Configuration conf = new Configuration();
    
           conf.set("fs.default.name", "hdfs://localhost:9000");
    
           String remoteFilePath = "/user/tiny/text.txt"; // HDFS路径
    
     
    
           System.out.println("读取文件: " + remoteFilePath);
    
           System.out.println(MyFSDataInputStream.readline(conf, remoteFilePath));
    
           System.out.println("
    读取完成");
    
     
    
       }
    
    }

    (三)查看 Java 帮助手册或其它资料,用“java.net.URL”和“org.apache.hadoop.fs.FsURLStrea mHandlerFactory”编程完成输出 HDFS 中指定文件的文本到终端中。

    代码:

    package cn.edu.zucc.hdfs;
    
     
    
    import java.io.IOException;
    
    import java.io.InputStream;
    
    import java.net.URL;
    
    import org.apache.hadoop.fs.*;
    
    import org.apache.hadoop.io.IOUtils;
    
     
    
    public class FsUrl {
    
        static {
    
            URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    
        }
    
     
    
        public static void cat(String remoteFilePath) {
    
            try (InputStream in = new URL("hdfs", "localhost", 9000, remoteFilePath)
    
                    .openStream()) {
    
                IOUtils.copyBytes(in, System.out, 4096, false);
    
                IOUtils.closeStream(in);
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 主函数
    
         */
    
        public static void main(String[] args) {
    
            String remoteFilePath = "/user/tiny/text.txt"; // HDFS路径
    
     
    
            try {
    
                System.out.println("读取文件: " + remoteFilePath);
    
                FsUrl.cat(remoteFilePath);
    
                System.out.println("
    读取完成");
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }
    package cn.edu.zucc.hdfs;
    
     
    
    import org.apache.hadoop.conf.Configuration;
    
    import org.apache.hadoop.fs.*;
    
    import org.apache.hadoop.fs.FileSystem;
    
     
    
    import java.io.*;
    
     
    
    public class AppendToFile {
    
        /**
    
         * 判断路径是否存在
    
         */
    
        public static boolean test(Configuration conf, String path) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                return fs.exists(new Path(path));
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
                return false;
    
            }
    
        }
    
     
    
        /**
    
         * 追加文本内容
    
         */
    
        public static void appendContentToFile(Configuration conf, String content,
    
                String remoteFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path remotePath = new Path(remoteFilePath);
    
                /* 创建一个文件输出流,输出的内容将追加到文件末尾 */
    
                FSDataOutputStream out = fs.append(remotePath);
    
                out.write(content.getBytes());
    
                out.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
     
    
        }
    
     
    
        /**
    
         * 追加文件内容
    
         */
    
        public static void appendToFile(Configuration conf, String localFilePath,
    
                String remoteFilePath) {
    
            Path remotePath = new Path(remoteFilePath);
    
            try (FileSystem fs = FileSystem.get(conf);
    
                    FileInputStream in = new FileInputStream(localFilePath);) {
    
                FSDataOutputStream out = fs.append(remotePath);
    
                byte[] data = new byte[1024];
    
                int read = -1;
    
                while ((read = in.read(data)) > 0) {
    
                    out.write(data, 0, read);
    
                }
    
                out.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 移动文件到本地 移动后,删除源文件
    
         */
    
        public static void moveToLocalFile(Configuration conf,
    
                String remoteFilePath, String localFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path remotePath = new Path(remoteFilePath);
    
                Path localPath = new Path(localFilePath);
    
                fs.moveToLocalFile(remotePath, localPath);
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 创建文件
    
         */
    
        public static void touchz(Configuration conf, String remoteFilePath) {
    
            try (FileSystem fs = FileSystem.get(conf)) {
    
                Path remotePath = new Path(remoteFilePath);
    
                FSDataOutputStream outputStream = fs.create(remotePath);
    
                outputStream.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
     
    
        /**
    
         * 主函数
    
         */
    
        public static void main(String[] args) {
    
            Configuration conf = new Configuration();
    
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
    
            String remoteFilePath = "/user/tiny/text.txt"; // HDFS文件
    
            String content = "新追加的内容
    ";
    
            String choice = "after"; // 追加到文件末尾
    
            // String choice = "before"; // 追加到文件开头
    
     
    
            try {
    
                /* 判断文件是否存在 */
    
                if (!AppendToFile.test(conf, remoteFilePath)) {
    
                    System.out.println("文件不存在: " + remoteFilePath);
    
                } else {
    
                    if (choice.equals("after")) { // 追加在文件末尾
    
                        AppendToFile.appendContentToFile(conf, content,
    
                                remoteFilePath);
    
                        System.out.println("已追加内容到文件末尾" + remoteFilePath);
    
                    } else if (choice.equals("before")) { // 追加到文件开头
    
                        /* 没有相应的api可以直接操作,因此先把文件移动到本地,创建一个新的HDFS,再按顺序追加内容 */
    
                        String localTmpPath = "/user/hadoop/tmp.txt";
    
                        AppendToFile.moveToLocalFile(conf, remoteFilePath,
    
                                localTmpPath); // 移动到本地
    
                        AppendToFile.touchz(conf, remoteFilePath); // 创建一个新文件
    
                        AppendToFile.appendContentToFile(conf, content,
    
                                remoteFilePath); // 先写入新内容
    
                        AppendToFile.appendToFile(conf, localTmpPath,
    
                                remoteFilePath); // 再写入原来内容
    
                        System.out.println("已追加内容到文件开头: " + remoteFilePath);
    
                    }
    
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }
  • 相关阅读:
    thinkphp5 tp5 命名空间 报错 Namespace declaration statement has to be the very first statement in the script
    开启 php 错误 提示 php-fpm 重启 nginx 500错误 解决办法 wdlinux lnmp 一键包 php脚本无法解析执行
    js 设置 cookie 定时 弹出层 提示层 下次访问 不再显示 弹窗 getCookie setCookie setTimeout
    php 二维数组 转字符串 implode 方便 mysql in 查询
    nginx 重启 ps -ef|grep nginx kill -HUP 主进程号
    jquery bootstrap help-block input 表单 提示 帮助 信息
    jquery 倒计时 60秒 短信 验证码 js ajax 获取
    jQuery如何获取同一个类标签的所有的值 遍历
    linux下C语言文件操作相关函数
    gcc,gdb用法
  • 原文地址:https://www.cnblogs.com/1605-3QYL/p/9786338.html
Copyright © 2011-2022 走看看