实验2熟悉常用的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中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件

/**
	 * 向HDFS中上传任意文本文件
	 * 如果指定的文件在 HDFS 中已经存在 
	 * 由用户指定是追加到原有文件末尾还是覆盖原有的文件
	 * @param fileSystem
	 * @param srcPath    本地文件地址
	 * @param desPath    HDFS文件地址
	 * @author yangd
	 */
	@Test
	private static void test1(FileSystem fileSystem, Path srcPath, Path desPath) {
		try {
			if (fileSystem.exists(new Path("/a/test.txt"))) {
				System.out.println("文件已存在,是否覆盖原有的文件? ( y 覆盖/n 追加)");
				if (new Scanner(System.in).next().equals("y")) {
					fileSystem.copyFromLocalFile(false, true, srcPath, desPath);
				} else {
					FileInputStream inputStream = new FileInputStream(srcPath.toString());
					FSDataOutputStream outputStream = fileSystem.append(new Path("/test/test.txt"));
					byte[] bytes = new byte[1024];
					int read = -1;
					while ((read = inputStream.read(bytes)) > 0) {
						outputStream.write(bytes, 0, read);
					}
					inputStream.close();
					outputStream.close();
				}
			} else {
				fileSystem.copyFromLocalFile(srcPath, desPath);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

调用方法

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

结果

实验2熟悉常用的HDFS操作_第1张图片

shell

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

实验2熟悉常用的HDFS操作_第2张图片

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

/**

    * 从HDFS中下载指定文件 若本地文件与要下载的文件名称相同

    * 则自动对下载的文件重命名

    * @param fileSystem

    * @param remotePath HDFS文件地址

    * @param localPath  本地文件地址

    * @author yangd

    */

   @Test

   private static void test2(FileSystem fileSystem, Path remotePath, Path localPath) {

      try {

          if (fileSystem.exists(remotePath)) {

             if(!(fileSystem.equals(localPath))){

             fileSystem.copyToLocalFile(remotePath, localPath);

             System.out.println("从HDFS中下载文件成功!");

             }else {

                fileSystem.copyToLocalFile(remotePath, new Path("localPath"+ new Random().nextInt() + ".txt"));

                System.out.println("从HDFS中下载文件并重命名成功!");

             }

          } else {

             System.out.println("在HDFS中找不到此文件!");

          }

      }catch (IOException e) {

          e.printStackTrace();

      }

   }

实验2熟悉常用的HDFS操作_第3张图片

实验2熟悉常用的HDFS操作_第4张图片

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

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

hadoop fs -cat /a/test.txt

实验2熟悉常用的HDFS操作_第5张图片

/**

    * 将HDFS中指定文件的内容输出到终端中

    *

    * @param fileSystem

    * @param remotePath

    * @author yangd

    */

   @Test

   private static void test3(FileSystem fileSystem, Path remotePath) {

      try {

          FSDataInputStream inputStream = fileSystem.open(remotePath);

          BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

          String line;

     System.out.println("HDFS中文件内容为:");

          while ((line = bufferedReader.readLine()) != null) {

             System.out.println(line);

          }



      } catch (IOException e) {

          e.printStackTrace();

      }

   }

实验2熟悉常用的HDFS操作_第6张图片

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

/**

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

    * @param fileSystem

    * @param remotePath HDFS文件地址

    * @author yangd

    */

   private static void test4(FileSystem fileSystem, Path remotePath) {

      try {

          FileStatus[] fileStatus = fileSystem.listStatus(remotePath);

          System.out.println("HDFS中指定的文件的读写权限、大小、创建时间、路径信息如下:");

          for (FileStatus status : fileStatus) {

             System.out.println(status.getPermission());

             System.out.println(status.getBlockSize());

             System.out.println(status.getAccessTime());

             System.out.println(status.getPath());

          }

      } catch (IOException e) {

          e.printStackTrace();

      }

   }

实验2熟悉常用的HDFS操作_第7张图片

实验2熟悉常用的HDFS操作_第8张图片

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

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

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

你可能感兴趣的:(Hadoop,eclipse,hadoop,hdfs)