《⼤数据基础——基于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⽂件的过程
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⽂件的过程
客户端调⽤DistributedFileSystem对象的create⽅法创建⼀个⽂件输出流对象==(步骤⼀)==。FSDat
mkdirs方法aOutputStream对象转⽽封装DFSOutputStream对象(负责NameNode和DataNode的通信)
DistributedFileSystem向远程的NameNode发起⼀次RPC调⽤==(步骤⼆)==。NameNode检查该⽂件是否已经存在以及客户端是否有权新建⽂件。如果通过检查,NameNode就会在edits⽇志中新增记录;否则创建⽂件失败,抛出异常。
客户端调⽤FSDataOutputStream.write()⽅法触发数据写⼊操作,(步骤三),数据先被写⼊内部的缓存中,再被切分成⼀个个的数据包。
每个数据包被发送到数据节点(默认为3个/组)的⼀个节点上==(步骤四)==,再这组数据节点组成的管线上依次传输数据包。
管线上的数据节点按反向顺序返回确认信息(ack),最终由管线中的第⼀个数据节点将整条管线的确认信息发送给客户端==(步骤五)==。
完成写⼊操作后,调⽤close⽅法关闭输出流==(步骤六)==。
调⽤DistributedFileSystem的close⽅法关闭⽂件系统,同时通知NameNode⽂件写⼊成功==(步骤七)==
5.举例说明HDFS Java API的⼀般使⽤⽅法
如云盘系统的实现中,⽤户注册同时创建其专属⽬录(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 = (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()修改⽬录或⽂件名

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。