《大数据基础——基于Hadoop与Spark》课后习题——第四章部分答案

仅用于我个人的学习。书籍为人民邮电出版社的《大数据技术基础——基于Hadoop与Spark》。课后习题选择是我个人认为有用的。记录下来是为了督促我学习:)
共好

1.比较以下4种不同的HDFS API的区别

libhdfs;HFTP;WebHDFS;JavaAPI

API 功能
libhdfs Hadoop为C语言提供HDFS文件操作和文件系统管理的访问接口
HFTP 提供从远程HDFS集群读数据的能力
WebHDFS 使集群外的客户机不用配置环境就可以对集群内进行访问
JavaAPI 支持打开文件、读写文件、删除文件等操作

2.简述WebHDFS和HttpFS之间的区别

3.简述基于HDFS客户端读取HDFS文件的过程

《大数据基础——基于Hadoop与Spark》课后习题——第四章部分答案_第1张图片

  • HDFS客户端(Client)通过调用FileSystem对象的open方法打开文件,这个对象是分布式文件系统的一个实例==(步骤一)==
  • DistributedFileSystem负责向远程的元数据节点发起RPC调用,得到文件的数据块信息==(步骤二)==

RPC(Remote Procedure Call)远程过程调用,两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

  • NameNode视情况返回文件的部分或全部数据块列表,对于每个数据块,NameNode都会返回该数据块及其副本的数据节点DataNode的地址
  • DistributedFileSystem返回一个FSDataInputStream对象给客户端,用来读取数据。FSDataInputStream对象转而封装DFSInputStream对象(该对象负责NameNode和DataNode的通信)
  • 客户端调用FSDataInputStream对象的read方法开始读取数据==(步骤三)==
  • DFSInputStream对象连接保存此文件第一个数据块的最近的数据节点
  • 通过对数据流反复调用read方法,把数据从数据节点传输到客户端==(步骤四)==。
  • 当此数据块读取完毕时,DFSInputStream关闭连接,然后连接此文件下一个数据块的最近的数据节点==(步骤五)==
  • 当客户端读取完时,调用FSDataInputStream的close方法关闭输入流==(步骤六)==

4.简述基于HDFS客户端写入HDFS文件的过程

《大数据基础——基于Hadoop与Spark》课后习题——第四章部分答案_第2张图片

  • 客户端调用DistributedFileSystem对象的create方法创建一个文件输出流对象==(步骤一)==。FSDataOutputStream对象转而封装DFSOutputStream对象(负责NameNode和DataNode的通信)
  • DistributedFileSystem向远程的NameNode发起一次RPC调用==(步骤二)==。NameNode检查该文件是否已经存在以及客户端是否有权新建文件。如果通过检查,NameNode就会在edits日志中新增记录;否则创建文件失败,抛出异常。
  • 客户端调用FSDataOutputStream.write()方法触发数据写入操作,(步骤三),数据先被写入内部的缓存中,再被切分成一个个的数据包。
  • 每个数据包被发送到数据节点(默认为3个/组)的一个节点上==(步骤四)==,再这组数据节点组成的管线上依次传输数据包。
  • 管线上的数据节点按反向顺序返回确认信息(ack),最终由管线中的第一个数据节点将整条管线的确认信息发送给客户端==(步骤五)==。
  • 完成写入操作后,调用close方法关闭输出流==(步骤六)==。
  • 调用DistributedFileSystem的close方法关闭文件系统,同时通知NameNode文件写入成功==(步骤七)==

5.举例说明HDFS Java API的一般使用方法

A实例化Configuration
B实例化FileSystem
C设置目标路径
D文件或目录操作

如云盘系统的实现中,用户注册同时创建其专属目录(ABCD)

Public boolean register() throws IOException{
	String lastUserid = getLastUserId();//获得在此之前最后一个注册用户的ID
	int id = Interger.parseInt(lastUserid)+1;生成当前注册用户的ID
	this.id = String.valueOf(id);//设置用户id
	
	//A B C
	Configuration conf = new Configuration();
	FileSystem fs = FileSystem.get(conf);
	Path src = new Path(“/clouddisk/user.dat”);
	
	FSDataOutputStream dos = fs.append(arc);//以追加方式打开文件
	
	//D(文件写入操作和创建目录操作)
	
	//写入用户信息
	dos.writeChars(this.id);
	dos.writeChars("," + this.username);
	dos.writeChars("," + this.password);
	dos.flush();
	dos.close();
	//创建用户专属目录
	Path dst = new Path("/clouddisk/" + this.id);
	Boolean isSuccessed = fs.mkdirs(dst);
	fs.close();
	return (isSuccessed) ? ture:falsel
}

6.分别指出FileSystem提供的以下成员方法的功能

append();concat();copyFromLocalFile();copyToLocalFile();create();delete();exist();getBlockSize();getFileStatus();mkdirs();moveFromLocalFile();moveToLocalFile();rename();

成员方法 功能
append() 向已存在的指定文件追加数据
concat() 将srcs中所有文件连接起来
copyFromLocalFile() 从本地磁盘复制文件到HDFS
copyToLocalFile() 从HDFS复制文件到本地磁盘
create() 创建一个文件
delete() 删除指定文件
exist() 检查指定文件是否存在
getBlockSize() 返回指定文件的数据块大小
getFileStatus() 返回指定文件的状态
mkdirs() 创建子目录
moveFromLocalFile 把本地文件迁移到HDFS
moveToLocalFile() 把HDFS文件迁移到本地文件
rename() 修改目录或文件名

你可能感兴趣的:(《大数据基础——基于Hadoop与Spark》课后习题——第四章部分答案)