第1关:HDFS的基本操作

知识点

1.HDFS的构建思路:一次写入多次读取不可修改

2.HDFS有两类节点用来管理集群的数据,即一个namenode(管理节点)和多个datanode(工作节点)。

(1)namenode:管理文件系统的命名空间,维护系统数及整棵树内所有的文件和目录,这些信息以命名空间镜像文件编辑日志文件形式永久保存在本地磁盘上。同时也记录着每个文件中各个块所在的数据节点信息,但并不永久保存块的位置信息。

(2)datanode:根据需要存储并检索数据块blocks),并且定期向namenode发送所存储的数据块的列表。

3.常用命令

(1)新建目录:mkdir(本地创建)、hadoop fs mkdir(hadoop创建目录)

(2)上传文件至dfs:hadoop fs -put <要上传的文件> <hdfs目录>

(3)移动与删除:hadoop fs -mv,hadoop fs -rm(只能删除文件或者空文件夹),hadoop fs -rm -r(-rmr)(删除非空文件夹)

  1. |-lsr |-lsr <路径> | 递归查看指定路径的目录结构|
  2. |-du |-du <路径> | 统计目录下个文件大小|
  3. |-dus |-dus <路径> | 汇总统计目录下文件(夹)大小|
  4. |-count| -count [-q] <路径> | 统计文件(夹)数量|
  5. |-mv |-mv <源路径> <目的路径> | 移动|
  6. |-cp |-cp <源路径> <目的路径> | 复制|
  7. |-rm |-rm [-skipTrash] <路径> | 删除文件/空白文件夹|
  8. |-rmr |-rmr [-skipTrash] <路径> | 递归删除|
  9. |-put |-put <多个 linux 上的文件> <hdfs 路径> | 上传文件|
  10. |-copyFromLocal| -copyFromLocal <多个 linux 上的文件><hdfs 路径> | 从本地复制|
  11. |-moveFromLocal |-moveFromLocal <多个 linux 上的文件><hdfs 路径> | 从本地移动|
  12. |-getmerge |-getmerge <源路径> <linux 路径> | 合并到本地|
  13. |-cat |-cat <hdfs 路径> | 查看文件内容|
  14. |-text |-text <hdfs 路径> | 查看文件内容|
  15. |-copyToLocal |-copyToLocal [-ignoreCrc] [-crc] [hdfs 源路径] [linux 目的路径] | 从HDFS复制到本地|
  16. |-moveToLocal |-moveToLocal [-crc] <hdfs 源路径> <linux目的路径> | 从HDFS移动到本地|
  17. |-mkdir |-mkdir <hdfs 路径> | 创建空白文件夹|
  18. |-setrep | -setrep [-R] [-w] <副本数> <路径> | 修改副本数量|
  19. |-touchz | -touchz <文件路径> | 创建空白文件|

编程要求

在右侧命令行中启动Hadoop,进行如下操作。

  • HDFS中创建/usr/output/文件夹;
  • 在本地创建hello.txt文件并添加内容:“HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。”;
  • hello.txt上传至HDFS/usr/output/目录下;
  • 删除HDFS/user/hadoop目录;
  • Hadoop上的文件hello.txtHDFS复制到本地/usr/local目录。
#创建文件夹
hadoop fs -mkdir /usr
hadoop fs -mkdir /usr/output
#也可这样写
hadoop fs -mkdir -p /usr/output
#创建文件并添加内容
touch hello.txt
vim hello.txt
#将本地文件上传至HDFS
hadoop fs -put hello.txt /usr/output
#查看是否上传成功
hadoop fs -ls /usr/output
#删除目录
hadoop fs -rmdir /user/hadoop
#上传文件至本地
hadoop fs -copyToLocal /usr/output/hello.txt /usr/local

第2关:HDFS-JAVA接口之读取文件

知识点

1.FileSystem构造对象的静态工厂方法

(1)public static FileSystem get(Configuration conf)throws IOException:默认文件系统是在core-site.xml中指定的,如果没有指定,就使用默认的文件系统。

(2)public static FileSystem get(URI uri,Configuration conf)throws IOException:使用给定的URI方案和权限来确定要使用的文件系统,如果给定URI中没有指定方案,则返回默认文件系统。

(3)public static FileSystem get(URI uri,Configuration conf,String user)throws IOException:作为给定用户来返回文件系统。

编程要求

使用FSDataInputStream获取HDFS/user/hadoop/目录下的task.txt的文件内容,并输出,其中urihdfs://localhost:9000/user/hadoop/task.txt。

package step2;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;


public class FileSystemCat {
	
	public static void main(String[] args) throws IOException {
		//请在Begin-End之间添加你的代码,完成任务要求。
        /********* Begin *********/
        URI uri=URI.create("hdfs://localhost:9000/user/hadoop/task.txt");
        Configuration config=new Configuration();
        FileSystem fs=FileSystem.get(uri,config);   //通过URI和Configuration对象构建对象
        InputStream in=null;
        try{
            in=fs.open(new Path(uri));   //通过open方法获取FSDataInputStream对象
            IOUtils.copyBytes(in,System.out,2048,false);   //使用IOutils输出数据
        }catch(Exception e){
            IOUtils.closeStream(in);
        }
	
		/********* End *********/
	}
}

第3关:HDFS-JAVA接口之上传文件

编程要求

  • /develop/input/目录下创建hello.txt文件,并输入如下数据: 迢迢牵牛星,皎皎河汉女。 纤纤擢素手,札札弄机杼。 终日不成章,泣涕零如雨。 河汉清且浅,相去复几许? 盈盈一水间,脉脉不得语。 《迢迢牵牛星》

  • 使用FSDataOutputStream对象将文件上传至HDFS/user/tmp/目录下,并打印进度。

package step3;


import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.io.File;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;


public class FileSystemUpload {
	
	public static void main(String[] args) throws IOException {
		//请在 Begin-End 之间添加代码,完成任务要求。
        /********* Begin *********/
		File localPath=new File("/develop/input/hello.txt");
        String hdfsPath="hdfs://localhost:9000/user/tmp/hello.txt";
		InputStream in=new BufferedInputStream(new FileInputStream(localPath));
        Configuration config=new Configuration();
        FileSystem fs=FileSystem.get(URI.create(hdfsPath),config);
        long fileSize=localPath.length() > 65536 ? localPath.length() / 65536 : 1;
        FSDataOutputStream out=fs.create(new Path(hdfsPath),new Progressable(){
            long fileCount=0;
            public void progress(){
                System.out.println("总进度"+(fileCount/fileSize)*100+"%");
                fileCount++;
            }
        });
        IOUtils.copyBytes(in,out,2048,true);
		
		
		/********* End *********/
	}
}

第4关:HDFS-JAVA接口之删除文件

编程要求

  • 删除HDFS/user/hadoop/目录(空目录);
  • 删除HDFS/tmp/test/目录(非空目录);
  • 列出HDFS根目录下所有的文件和文件夹;
  • 列出HDFS/tmp/的所有文件和文件夹。
package step4;


import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;



public class FileSystemDelete {
	
	public static void main(String[] args) throws IOException {
		//请在 Begin-End 之间添加代码,完成本关任务。
        /********* Begin *********/
		String uri="hdfs://localhost:9000/";
        String path1="hdfs://localhost:9000/user/hadoop";
        String path2="hdfs://localhost:9000/tmp/test";
        String path3="hdfs://localhost:9000/tmp";
        Configuration config=new Configuration();
        FileSystem fs=FileSystem.get(URI.create(uri),config);
        fs.delete(new Path(path2),true);
        fs.delete(new Path(path1));
        Path[] paths={new Path(uri),new Path(path3)};  
        FileStatus[] status=fs.listStatus(paths);
        Path[] listPaths=FileUtil.stat2Paths(status);
        for (Path path:listPaths)
        {
            System.out.println(path);
        }

		/********* End *********/
	}
}

Logo

更多推荐