当前位置:   article > 正文

实验2熟悉常用的HDFS操作_向hdfs中上传任意文本文件,如果指定的文件在hdfs

向hdfs中上传任意文本文件,如果指定的文件在hdfs

1.实验目的

(1)理解HDFS在Hadoop体系结构中的角色;

(2)熟练使用HDFS操作常用的Shell命令;

(3)熟悉HDFS操作常用的Java API。

2. 实验平台

(1)操作系统:Linux;

(2)Hadoop版本:2.7.4 ;

(3)JDK版本1.8;

(4)Java IDE:eclipse  。

3. 实验步骤

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

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

  1. /**
  2. * 向HDFS中上传任意文本文件
  3. * 如果指定的文件在 HDFS 中已经存在
  4. * 由用户指定是追加到原有文件末尾还是覆盖原有的文件
  5. * @param fileSystem
  6. * @param srcPath 本地文件地址
  7. * @param desPath HDFS文件地址
  8. * @author yangd
  9. */
  10. @Test
  11. private static void test1(FileSystem fileSystem, Path srcPath, Path desPath) {
  12. try {
  13. if (fileSystem.exists(new Path("/a/test.txt"))) {
  14. System.out.println("文件已存在,是否覆盖原有的文件? ( y 覆盖/n 追加)");
  15. if (new Scanner(System.in).next().equals("y")) {
  16. fileSystem.copyFromLocalFile(false, true, srcPath, desPath);
  17. } else {
  18. FileInputStream inputStream = new FileInputStream(srcPath.toString());
  19. FSDataOutputStream outputStream = fileSystem.append(new Path("/test/test.txt"));
  20. byte[] bytes = new byte[1024];
  21. int read = -1;
  22. while ((read = inputStream.read(bytes)) > 0) {
  23. outputStream.write(bytes, 0, read);
  24. }
  25. inputStream.close();
  26. outputStream.close();
  27. }
  28. } else {
  29. fileSystem.copyFromLocalFile(srcPath, desPath);
  30. }
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }

调用方法

  1. public static void main(String args[]) throws IOException {
  2. // HDFS路径
  3. Path path1 = new Path("/a/test.txt");
  4. // 本地路径
  5. Path path2 = new Path("D:/test.txt");
  6. System.setProperty("hadoop.home.dir", "D:\\Hadoop2.7.4\\hadoop-2.7.4");
  7. // 构造一个配置参数对象,设置一个参数:要访问的HDFS的URI
  8. Configuration conf = new Configuration();
  9. // 这里指定使用的是HDFS
  10. conf.set("fs.defaultFS", "hdfs://192.168.121.130:9000");
  11. // 通过如下的方式进行客户端身份的设置
  12. System.setProperty("HADOOP_USER_NAME", "root");
  13. // 通过FileSystem的静态方法获取文件系统客户端对象
  14. FileSystem fs = FileSystem.get(conf);
  15. test1(fs, path2, path1);
  16. }

结果

shell

  1. hadoop fs -put /export/data/word.txt /test
  2. hadoop fs -appendToFile /export/data/word.txt /test
  3. hadoop fs -copyFromLocal -f /export/data/word.txt /test

(2)从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;

  1. /**
  2.     * 从HDFS中下载指定文件 若本地文件与要下载的文件名称相同
  3.     * 则自动对下载的文件重命名
  4.     * @param fileSystem
  5.     * @param remotePath HDFS文件地址
  6.     * @param localPath  本地文件地址
  7.     * @author yangd
  8.     */
  9.    @Test
  10.    private static void test2(FileSystem fileSystem, Path remotePath, Path localPath) {
  11.       try {
  12.           if (fileSystem.exists(remotePath)) {
  13.              if(!(fileSystem.equals(localPath))){
  14.              fileSystem.copyToLocalFile(remotePath, localPath);
  15.              System.out.println("从HDFS中下载文件成功!");
  16.              }else {
  17.                 fileSystem.copyToLocalFile(remotePath, new Path("localPath"+ new Random().nextInt() + ".txt"));
  18.                 System.out.println("从HDFS中下载文件并重命名成功!");
  19.              }
  20.           } else {
  21.              System.out.println("在HDFS中找不到此文件!");
  22.           }
  23.       }catch (IOException e) {
  24.           e.printStackTrace();
  25.       }
  26.    }

hadoop fs -copyToLocal /a/test.txt /export/data/test.txt

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

hadoop fs -cat /a/test.txt

  1. /**
  2.     * 将HDFS中指定文件的内容输出到终端中
  3.     *
  4.     * @param fileSystem
  5.     * @param remotePath
  6.     * @author yangd
  7.     */
  8.    @Test
  9.    private static void test3(FileSystem fileSystem, Path remotePath) {
  10.       try {
  11.           FSDataInputStream inputStream = fileSystem.open(remotePath);
  12.           BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
  13.           String line;
  14.      System.out.println("HDFS中文件内容为:");
  15.           while ((line = bufferedReader.readLine()) != null) {
  16.              System.out.println(line);
  17.           }
  18.       } catch (IOException e) {
  19.           e.printStackTrace();
  20.       }
  21.    }

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

  1. /**
  2.     * 显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息
  3.     * @param fileSystem
  4.     * @param remotePath HDFS文件地址
  5.     * @author yangd
  6.     */
  7.    private static void test4(FileSystem fileSystem, Path remotePath) {
  8.       try {
  9.           FileStatus[] fileStatus = fileSystem.listStatus(remotePath);
  10.           System.out.println("HDFS中指定的文件的读写权限、大小、创建时间、路径信息如下:");
  11.           for (FileStatus status : fileStatus) {
  12.              System.out.println(status.getPermission());
  13.              System.out.println(status.getBlockSize());
  14.              System.out.println(status.getAccessTime());
  15.              System.out.println(status.getPath());
  16.           }
  17.       } catch (IOException e) {
  18.           e.printStackTrace();
  19.       }
  20.    }

hadoop fs -ls -h /a/test.txt

完整实验过程及源代码和运行结果截图下载链接:
 

  实验2常用的HDFS操作.doc-Linux文档类资源-CSDN文库

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/510538
推荐阅读
相关标签
  

闽ICP备14008679号