当前位置:   article > 正文

Hadoop实验——熟悉常用的HDFS操作_hdfs的基本操作实验报告

hdfs的基本操作实验报告

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

 

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

Shell命令实现:1.先到Hadoop主文件夹cd /usr/local/hadoop2.启动Hadoop服务

  1. sbin/start-dfs.sh
  2. sbin/start-yarn.sh

3.创建两个任意文本文件用于实验

  1. echo "hello world" > local.txt
  2. echo "hello hadoop" >text.txt

4.创建用户工作目录(HDFS默认工作目录格式为/user/当前用户)

  1. hadoop fs -mkdir -p /user/当前用户名

5.检查文件是否存在

  1. hadoop fs -test -e text.txt
  2. echo $?

6.上传本地文件到HDFS系统
hadoop fs -put text.txt


7.追加到文件末尾的指令
hadoop fs -appendToFile local.txt text.txt


8.查看HDFS文件的内容
hadoop fs -cat text.txt


9.覆盖原有文件的指令(覆盖之后再执行一遍上一步)
hadoop fs -copyFromLocal -f local.txt text.txt


10.以上步骤也可以用如下命令实现

  1. if $(hadoop fs -test -e text.txt);
  2. then $(hadoop fs -appendToFile local.txt text.txt);
  3. else $(hadoop fs -copyFromLocal -f local.txt text.txt);
  4. fi
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));
  1. } catch (IOException e) {
  2. e.printStackTrace();
  3. return false;
  4. }
  5. }
  6. /**
  7. * 复制文件到指定路径 若路径已存在,则进行覆盖
  8. */
  9. public static void copyFromLocalFile(Configuration conf,
  10. String localFilePath, String remoteFilePath) {
  11. Path localPath = new Path(localFilePath);
  12. Path remotePath = new Path(remoteFilePath);
  13. try (FileSystem fs = FileSystem.get(conf)) {
  14. /* fs.copyFromLocalFile 第一个参数表示是否删除源文件,第二个参数表示是否覆盖 */
  15. fs.copyFromLocalFile(false, true, localPath, remotePath);
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. /**
  21. * 追加文件内容
  22. */
  23. public static void appendToFile(Configuration conf, String localFilePath,
  24. String remoteFilePath) {
  25. Path remotePath = new Path(remoteFilePath);
  26. try (FileSystem fs = FileSystem.get(conf);
  27. FileInputStream in = new FileInputStream(localFilePath);) {
  28. FSDataOutputStream out = fs.append(remotePath);
  29. byte[] data = new byte[1024];
  30. int read = -1;
  31. while ((read = in.read(data)) > 0) {
  32. out.write(data, 0, read);
  33. }
  34. out.close();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. /**
  40. * 主函数
  41. */
  42. public static void main(String[] args) {
  43. Configuration conf = new Configuration();
  44. conf.set("fs.defaultFS", "hdfs://localhost:9000");
  45. String localFilePath = "/usr/local/hadoop/text.txt"; // 本地路径
  46. String remoteFilePath = "/user/tiny/text.txt"; // HDFS路径
  47. // String choice = "append"; // 若文件存在则追加到文件末尾
  48. String choice = "overwrite"; // 若文件存在则覆盖
  49. try {
  50. /* 判断文件是否存在 */
  51. boolean fileExists = false;
  52. if (CopyFromLocalFile.test(conf, remoteFilePath)) {
  53. fileExists = true;
  54. System.out.println(remoteFilePath + " 已存在.");
  55. } else {
  56. System.out.println(remoteFilePath + " 不存在.");
  57. }
  58. /* 进行处理 */
  59. if (!fileExists) { // 文件不存在,则上传
  60. CopyFromLocalFile.copyFromLocalFile(conf, localFilePath,
  61. remoteFilePath);
  62. System.out.println(localFilePath + " 已上传至 " + remoteFilePath);
  63. } else if (choice.equals("overwrite")) { // 选择覆盖
  64. CopyFromLocalFile.copyFromLocalFile(conf, localFilePath,
  65. remoteFilePath);
  66. System.out.println(localFilePath + " 已覆盖 " + remoteFilePath);
  67. } else if (choice.equals("append")) { // 选择追加
  68. CopyFromLocalFile.appendToFile(conf, localFilePath,
  69. remoteFilePath);
  70. System.out.println(localFilePath + " 已追加至 " + remoteFilePath);
  71. }
  72. } catch (Exception e) {
  73. e.printStackTrace();
  74. }
  75. }
  76. }
 
 
从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名。
Shell命令实现:
 
 
  1. if $(hadoop fs -test -e /usr/local/hadoop/text.txt);
  2. then $(hadoop fs -copyToLocal text.txt ./text.txt);
  3. else $(hadoop fs -copyToLocal text.txt ./text2.txt);
  4. fi
  1. package cn.edu.zucc.hdfs;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.*;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import java.io.*;
  6. public class CopyToLocal {
  7. /**
  8. * 下载文件到本地 判断本地路径是否已存在,若已存在,则自动进行重命名
  9. */
  10. public static void copyToLocal(Configuration conf, String remoteFilePath,
  11. String localFilePath) {
  12. Path remotePath = new Path(remoteFilePath);
  13. try (FileSystem fs = FileSystem.get(conf)) {
  14. File f = new File(localFilePath);
  15. /* 如果文件名存在,自动重命名(在文件名后面加上 _0, _1 ...) */
  16. if (f.exists()) {
  17. System.out.println(localFilePath + " 已存在.");
  18. Integer i = Integer.valueOf(0);
  19. while (true) {
  20. f = new File(localFilePath + "_" + i.toString());
  21. if (!f.exists()) {
  22. localFilePath = localFilePath + "_" + i.toString();
  23. break;
  24. } else {
  25. i++;
  26. continue;
  27. }
  28. }
  29. System.out.println("将重新命名为: " + localFilePath);
  30. }
  31. // 下载文件到本地
 
 

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

Shell命令实现:1.先到Hadoop主文件夹cd /usr/local/hadoop

2.启动Hadoop服务

  1. sbin/start-dfs.sh
  2. sbin/start-yarn.sh

3.创建两个任意文本文件用于实验

  1. echo "hello world" > local.txt
  2. echo "hello hadoop" >text.txt

4.创建用户工作目录(HDFS默认工作目录格式为/user/当前用户)

hadoop fs -mkdir -p /user/当前用户名

5.检查文件是否存在

  1. hadoop fs -test -e text.txt
  2. echo $?

6.上传本地文件到HDFS系统
hadoop fs -put text.txt


7.追加到文件末尾的指令
hadoop fs -appendToFile local.txt text.txt


8.查看HDFS文件的内容
hadoop fs -cat text.txt


9.覆盖原有文件的指令(覆盖之后再执行一遍上一步)
hadoop fs -copyFromLocal -f local.txt text.txt


10.以上步骤也可以用如下命令实现

  1. if $(hadoop fs -test -e text.txt);
  2. then $(hadoop fs -appendToFile local.txt text.txt);
  3. else $(hadoop fs -copyFromLocal -f local.txt text.txt);
  4. fi

 
  
  1.  package cn.edu.zucc.hdfs;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.fs.FSDataOutputStream;
  6. import org.apache.hadoop.fs.FileSystem;
  7. import org.apache.hadoop.fs.Path;
  8. public class CopyFromLocalFile {
  9. /**
  10. * 判断路径是否存在
  11. */
  12. public static boolean test(Configuration conf, String path) {
  13. try (FileSystem fs = FileSystem.get(conf)) {
  14. return fs.exists(new Path(path));
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. return false;
  18. }
  19. }
  20. /**
  21. * 复制文件到指定路径 若路径已存在,则进行覆盖
  22. */
  23. public static void copyFromLocalFile(Configuration conf,
  24. String localFilePath, String remoteFilePath) {
  25. Path localPath = new Path(localFilePath);
  26. Path remotePath = new Path(remoteFilePath);
  27. try (FileSystem fs = FileSystem.get(conf)) {
  28. /* fs.copyFromLocalFile 第一个参数表示是否删除源文件,第二个参数表示是否覆盖 */
  29. fs.copyFromLocalFile(false, true, localPath, remotePath);
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. /**
  35. * 追加文件内容
  36. */
  37. public static void appendToFile(Configuration conf, String localFilePath,
  38. String remoteFilePath) {
  39. Path remotePath = new Path(remoteFilePath);
  40. try (FileSystem fs = FileSystem.get(conf);
  41. FileInputStream in = new FileInputStream(localFilePath);) {
  42. FSDataOutputStream out = fs.append(remotePath);
  43. byte[] data = new byte[1024];
  44. int read = -1;
  45. while ((read = in.read(data)) > 0) {
  46. out.write(data, 0, read);
  47. }
  48. out.close();
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. /**
  54. * 主函数
  55. */
  56. public static void main(String[] args) {
  57. Configuration conf = new Configuration();
  58. conf.set("fs.defaultFS", "hdfs://localhost:9000");
  59. String localFilePath = "/usr/local/hadoop/text.txt"; // 本地路径
  60. String remoteFilePath = "/user/tiny/text.txt"; // HDFS路径
  61. // String choice = "append"; // 若文件存在则追加到文件末尾
  62. String choice = "overwrite"; // 若文件存在则覆盖
  63. try {
  64. /* 判断文件是否存在 */
  65. boolean fileExists = false;
  66. if (CopyFromLocalFile.test(conf, remoteFilePath)) {
  67. fileExists = true;
  68. System.out.println(remoteFilePath + " 已存在.");
  69. } else {
  70. System.out.println(remoteFilePath + " 不存在.");
  71. }
  72. /* 进行处理 */
  73. if (!fileExists) { // 文件不存在,则上传
  74. CopyFromLocalFile.copyFromLocalFile(conf, localFilePath,
  75. remoteFilePath);
  76. System.out.println(localFilePath + " 已上传至 " + remoteFilePath);
  77. } else if (choice.equals("overwrite")) { // 选择覆盖
  78. CopyFromLocalFile.copyFromLocalFile(conf, localFilePath,
  79. remoteFilePath);
  80. System.out.println(localFilePath + " 已覆盖 " + remoteFilePath);
  81. } else if (choice.equals("append")) { // 选择追加
  82. CopyFromLocalFile.appendToFile(conf, localFilePath,
  83. remoteFilePath);
  84. System.out.println(localFilePath + " 已追加至 " + remoteFilePath);
  85. }
  86. } catch (Exception e) {
  87. e.printStackTrace();
  88. }
  89. }
  90. }

 
  
从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名。
Shell命令实现:
 
  
  1. if $(hadoop fs -test -e /usr/local/hadoop/text.txt);
  2. then $(hadoop fs -copyToLocal text.txt ./text.txt);
  3. else $(hadoop fs -copyToLocal text.txt ./text2.txt);
  4. fi
  1. package cn.edu.zucc.hdfs;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.*;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import java.io.*;
  6. public class CopyToLocal {
  7. /**
  8. * 下载文件到本地 判断本地路径是否已存在,若已存在,则自动进行重命名
  9. */
  10. public static void copyToLocal(Configuration conf, String remoteFilePath,
  11. String localFilePath) {
  12. Path remotePath = new Path(remoteFilePath);
  13. try (FileSystem fs = FileSystem.get(conf)) {
  14. File f = new File(localFilePath);
  15. /* 如果文件名存在,自动重命名(在文件名后面加上 _0, _1 ...) */
  16. if (f.exists()) {
  17. System.out.println(localFilePath + " 已存在.");
  18. Integer i = Integer.valueOf(0);
  19. while (true) {
  20. f = new File(localFilePath + "_" + i.toString());
  21. if (!f.exists()) {
  22. localFilePath = localFilePath + "_" + i.toString();
  23. break;
  24. } else {
  25. i++;
  26. continue;
  27. }
  28. }
  29. System.out.println("将重新命名为: " + localFilePath);
  30. }
  31. // 下载文件到本地
  32. Path localPath = new Path(localFilePath);
  33. fs.copyToLocalFile(remotePath, localPath);
  34. } catch (IOException e) {
  35. // TODO Auto-generated catch block
  36. e.printStackTrace();
  37. }
  38. }
  39. /**
  40. * 主函数
  41. */
  42. public static void main(String[] args) {
  43. Configuration conf = new Configuration();
  44. conf.set("fs.defaultFS", "hdfs://localhost:9000");
  45. String localFilePath = "/usr/local/hadoop/text.txt"; // 本地路径
  46. String remoteFilePath = "/user/tiny/text.txt"; // HDFS路径
  47. try {
  48. CopyToLocal.copyToLocal(conf, remoteFilePath, localFilePath);
  49. System.out.println("下载完成");
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. }


http://www.jianshu.com/p/0663d74b79b5


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(); } }}
 
 
 
 
       
  http://www.jianshu.com/p/0663d74b79b5 
 
 

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

闽ICP备14008679号