HDFS中的读写数据流

1.文件的读取:

    首先、客户端铜鼓调用FileSystem对象中的open()函数读取它需要的数据。FileSystem是HDFS中DistributeFileSystem的一个实例。DistributeFileSystem会通过RPC协议调用NameNode来确定请求文件所在的位置,对于每个返回的块都包换块所在的DataNode地址,随后这些返回的DataNode会按照Hadoop定义的集群拓扑结构得出客户端的距离。然后再进行排序,如果客户端本身就是一个DataNode那么它将从本地读取文件。这里要关注的一个设计要点是,客户端通过NameNode引导获取最合适的DataNode地址,然后直接连接DataNode读取数据。这种设计的好处,这可以使HDFS扩展到更大规模的客户端并行处理。这是因为数据的流动所有的DataNode之间分散进行的,同时NameNode的压力也变小。

2.文件写入

①客户端通过调用DistributeFileSystem对象中的Create()创建一个文件,通过RPC()调用在NameNode的文件系统命名空间中创建一个新文件。

②NaneNode会通过多种验证保证新的文件不存在文件系统中,并且确保请求客户端有创建按文件的权限。如果成功distributeFileSystem返回一个FSDataOutputStream给客户端写人数据

③当客户端写入数据时,DFSoutputStream会将文件分割成包,然后放入内部队列,DataStreamer,作用是请求NameNode为新的文件包分配合适的DataNode存放副本。

④DFSoutputStream同时也会保存在一个包的内部队列,用来等待管道中的DataNode返回确认信息。

《hadoop实战第二版》… 机械工业出版社 ….. 陆嘉恒著;

转载于:https://my.oschina.net/u/782865/blog/126504

### HDFS 数据读写流程详解 #### HDFS数据流程 当客户端要向 HDFS写入文件时,会先与 NameNode 进行交互来获取目标 DataNodes 的位置信息。NameNode 根据机架感知算法选择最优的 DataNodes 集合[^1]。 一旦确定了 DataNodes 后,客户端将按照流水线的方式传输数据给这些节点。具体来说: - 客户端把接收到的数据分割成多个包,并通过 socket 流发送到第一个 DataNode。 - 第一个 DataNode 接收到来自客户端的数据之后再转发至下一个指定的 DataNode,以此类推直到最后一个DataNode完成整个过程中的复制操作[^2]。 为了优化网络流量并减少延迟,在选择存储副本的目标机器时考虑到了它们之间的物理距离——即所谓的“节点距离”。这种机制被称为机架感知,它有助于提升系统的整体性能以及应对潜在单点故障的能力[^3]。 ```python # Python伪代码展示HDFS写入逻辑简化版 def write_data_to_hdfs(file_content, file_path): # 获取namenode分配datanodes列表 datanodes = namenode.get_datanodes_for_write() # 创建pipeline连接用于流式上传block pipeline = create_pipeline(datanodes) try: while there_is_more_data_in_file_content(): chunk = get_next_chunk_from_file_content() # 将chunk依次传递给每一个datanode形成链路传播 send_chunk_through_pipeline(pipeline, chunk) finalize_block_writing_on_all_datanodes(pipeline) finally: close_pipeline_connection(pipeline) ``` #### HDFS数据流程 对于从 HDFS 读取文件的情况,则是由客户端联系 NameNode 来定位所 Block 所处的具体 DataNodes 地址。随后直接同最接近自己的那个 DataNode 建立通信链接来进行实际的数据读取工作。 考虑到可能存在的部分节点失效情况,如果当前尝试访问的 DataNode 出现问题无法提供服务的话,将会自动切换到其他保存有相同 Block 复制件的地方继续请求直至成功为止。 ```python # Python伪代码展示HDFS读取逻辑简化版 def read_data_from_hdfs(file_path): block_locations = namenode.get_block_locations(file_path) data_chunks = [] for location in block_locations: closest_datanode = choose_closest_datanode(location.datanodes) try: connection = establish_connection_with_datanode(closest_datanode) chunk = download_chunk(connection) data_chunks.append(chunk) except IOError as e: handle_io_error(e) # 可能转向另一个拥有该Block副本的Datanode return combine_chunks_into_original_file(data_chunks) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值