hdfs数据流读取

RPC实现流程

RPC(远程过程调用协议)一种通过网络从远程计算机程序上请求服务,而不用了解底层的网络技术协议,RPC协议假定某种传输协议存在,比如TCP ,UDP等;

在OSI中RPC跨越了传输层和应用层,使得包括网络分布式多程序在内的应用程序的开发更加容易;

RPC采用的是客户机/服务器模式,hadoop RPC=动态代理+定制二进制流;

远程的对象有固定接口,这个接口用户课件,但是真实的实现实在服务端,用户想使用哪个实现,调用过程是先根据哪个接口动态代理生成一个代理对象,调用这个代理对象时,被RPC捕捉,然后包装成调用请求,序列化成数据流发送的服务端,服务单从中解析请求,然后根据用户希望调用接口,真正的实现对象,然后讲调用结果返回给客户端;

RPC在服务端的模型由一系列的实体实现,Listener监听,转连接;Reader从客户端读取数据流,转化为调用对象;Handler真正做事的实体,获取调用信息,反射真正的对象,得到结果;Responder返回调用结果;

文件的读取

使用hdfs提供的客户端开发库来调用DistributedFileSystem对象的open()方法来打开希望读取的文件,并连接输入流FSDataInputStream,客户端开发库向namenode请求元数据,得到要读取的文件的快列表和每个block的映射地址,然后客户端开发库对这个输入流调用read()方法来读取数据,开发库选取离客户端最近的datanode来读取block,每读取一个块都会检查完整性,读取完毕关闭流;

文件的写入

客户端开发库通过对DistributedFileSystem对象的调用create()函数来创建文件,并确定路径,连接输出流;

客户端开发库向namenode发出创建新文件的请求,namenode检查文件是否可以创建,(检查客户端权限和是否已经存在该文件了),失败抛出异常,成果,则调用wirte()方法写入数据,,讲数据分成一个个replicas,并写入队列,然后向namenode申请新的block来进行存储,

然后以管道的心事讲packet写入所有的replicas中,开发库讲packet以流的形式写入第一个datanode,该datanode将packet存储后,将packet传递给管道中的下一个datanode;

每次写入都进行确认并进行信息回执,所有都写入完成之后关闭流;

文件的一致性描述了对文件读写的数据可见性。在写入文件时其他的reader是无法看到正在写入的块,需要对FSDataOutputStream调用sync()方法来强制hdfs中的缓存和所有数据节点同步,调用成功返回结果后还保持数据可见一致性之外还防止数据丢失;这个类似于POSIX的fsycn()系统的调用,该调用提交了一个文件描述符的缓冲数据;hdfs中关闭流文件时还执行一个隐秘的sycn()方法;

若不调用此方法可能会丢失一个数据块;但此方法有一定开销;


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值