HDFS写数据的流程

  • HDFS shell上传文件a.txt,300M

  1. 对文件分块,默认每块128M。

  2. shell向NameNode发送上传文件请求

  3. NameNode检测文件系统目录树,看能否上传

  4. NameNode向shell发送允许上传通知

  5. shell向NameNode发送上传block1,备份为3的通知。

  6. NameNode检测DataNode信息池,查找的3台DataNode的IP,查找的IP有以下机制:

    • 网络拓扑距离最近(经历交换机最少)

    • 如果shell本身就是一个DataNode,本地会备份一份。

    • 相同机架备份一份(关于机架检测,见后文)

    • 不同机架备份一份

  7. NameNode把检测到的IP返回给shell

  8. shell检测最近的IP,比如DataNode1,建立连接请求数据传输,建立pipeline

    • pipeline是Hadoop用来传输数据的对象,类似流水线的传递。

    • DataNode1向DataNode2建立pipeline

    • DataNode2向DataNode3建立pipeline

  9. DataNode3向DataNode2返回pipeline建立成功通知,再逐级返回2-1,1-shell。

  10. shell通过OutputStream,以packet(64K)为单位,向DataNode1发送数据,并逐级下发。

    • 各级DataNode接收到后,存储数据到本地。

  11. DataNode保存数据后,会逆向逐级发送数据校验包,用于验证数据是否传输完成。

  12. 传输完成,关闭pipeline,重复5-11。

机架检测

以下内容是根据该网址内容整理:

https://blog.csdn.net/w182368851/article/details/53729790

https://www.cnblogs.com/zwgblog/p/7096875.html

机架检测的原理其实就是core-site.xml配置文件中配置一个选项:

<property>
<name>topology.script.file.name</name>
<value>/home/bigdata/apps/hadoop-talkyun/etc/hadoop/topology.sh</value>
</property>
  • 这个配置选项的value指定为一个可执行程序,通常为一个脚本.

  • 该脚本接受一个参数,输出一个值。

  • 参数通常为某台DataNode机器的ip地址,而输出的值通常为该ip地址对应的DataNode所在的Rack(机架)。

  • 流程:

    • NameNode启动时,会判断该配置选项是否为空,如果非空,则表示已经启用机架感知的配置。

    • 此时NameNode会根据配置寻找该脚本。

    • 接收到任何DataNode的心跳(heartbeat)时,将该DataNode的ip地址作为参数传给脚本,就能得到每个DataNode的Rack,保存到内存的一个map中,此使就能知道每台机器是否在同一个机架上了。

  • 配置文件简单示例:

#!/usr/bin/python
#-*-coding:UTF- -*-
import sys rack = {"NN01":"rack2",
"NN02":"rack3",
"DN01":"rack4",
"DN02":"rack4",
"DN03":"rack1",
"DN04":"rack3",
"DN05":"rack1",
"DN06":"rack4",
"DN07":"rack1",
"DN08":"rack2",
"DN09":"rack1",
"DN10":"rack2",
"172.16.145.32":"rack2",
"172.16.145.33":"rack3",
"172.16.145.34":"rack4",
"172.16.145.35":"rack4",
"172.16.145.36":"rack1",
"172.16.145.37":"rack3",
"172.16.145.38":"rack1",
"172.16.145.39":"rack4",
"172.16.145.40":"rack1",
"172.16.145.41":"rack2",
"172.16.145.42":"rack1",
"172.16.145.43":"rack2",
} if __name__=="__main__":
print "/" + rack.get(sys.argv[],"rack0")

Hadoop(三)HDFS写数据的基本流程的更多相关文章

  1. Hadoop源码分析之客户端向HDFS写数据

    转自:http://www.tuicool.com/articles/neUrmu 在上一篇博文中分析了客户端从HDFS读取数据的过程,下面来看看客户端是怎么样向HDFS写数据的,下面的代码将本地文件 ...

  2. 大数据:Hadoop(HDFS 读写数据流程及优缺点)

    一.HDFS 写数据流程 写的过程: CLIENT(客户端):用来发起读写请求,并拆分文件成多个 Block: NAMENODE:全局的协调和把控所有的请求,提供 Block 存放在 DataNode ...

  3. HDFS写数据和读数据流程

    HDFS数据存储 HDFS client上传数据到HDFS时,首先,在本地缓存数据,当数据达到一个block大小时.请求NameNode分配一个block. NameNode会把block所在的Dat ...

  4. 图解向hadoop分布式文件系统写文件的工作流程

    网上看到一张关于hadoop分布式文件系统(hdfs)的工作原理的图片,其实主要是介绍了向hdfs写一个文件的流程.图中的流程已经非常清晰,直接上图 好吧,博客园告诉我少于200字的文章不允许发布到网 ...

  5. 【Hadoop】HDFS冗余数据块的自动删除

    HDFS冗余数据块的自动删除 在日常维护hadoop集群的过程中发现这样一种情况: 某个节点由于网络故障或者DataNode进程死亡,被NameNode判定为死亡, HDFS马上自动开始数据块的容错拷 ...

  6. hadoop(三):hdfs 机架感知

    client 向 Active NN 发送写请求时,NN为这些数据分配DN地址,HDFS文件块副本的放置对于系统整体的可靠性和性能有关键性影响.一个简单但非优化的副本放置策略是,把副本分别放在不同机架 ...

  7. Hadoop架构: HDFS中数据块的状态及其切换过程,GS与BGS

    该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 首先,我们要提出HDFS存储特点: 1.高容错 2.一个文件被切成块(新版本默认128MB一个块)在不 ...

  8. HDFS写数据的过程

  9. HDFS 读/写数据流程

    1. HDFS 写数据流程 客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件, NameNode 检查目标文件是否已存在,父目录是否存在: NameNo ...

随机推荐

  1. Ansible-1 基本认识及清单与模块

    ansible 一.常用的自动化运维工具 1.puppet 基于ruby开发,采用c/s架构,扩展性强,基于ssl,远程命令执行相对较弱, 2.saltstack 基于python开发,采用C/S架构 ...

  2. spring多数据源分布式事务的分析与解决方案

    一.概述 1.业务背景 对老系统进行重构合并,导致新系统需要同时对3个数据库进行管理.由于出现跨库业务,需要实现分布式事务. 2.开发环境 spring框架版本  4.3.10.RELEASE 持久层 ...

  3. java网络编程——多线程数据收发并行

    基本介绍与思路 收发并行 前一篇博客中,完成了客户端与服务端的简单TCP交互,但这种交互是触发式的:客户端发送一条消息,服务端收到后再回送一条.没有做到收发并行.收发并行的字面意思很容易理解,即数据的 ...

  4. 关于beforeRouteEnter中的next()

    beforeRouteEnter(to,from, next){ console.log(this)   //undefined next(vm => { console.log(vm)}) } ...

  5. 数据库开发 Oracle与mysql间的批量处理接口 SSIS+存储过程实现

    公司目前不同的业务系统用了不同的数据库,涉及到oracle.mysql.sqlserver.而一些核心的业务在mysql中,所以平时经常要把oracle.sqlserver中的数据插入到mysql中. ...

  6. BJDCTF

    python3的模板注入 非常简单...就是直接执行命令就行..虽然过滤了flag,但是拼接下就好了.... payload: http://fd5883ee-b8e2-4bf1-88af-33936 ...

  7. Python3学习之路~10.2 协程、Greenlet、Gevent

    一 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切 ...

  8. LeetCode#232-Implement Queue using Stacks-用栈实现队列

    一.题目 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列 ...

  9. Mybatis(三)Mybatis映射开发

    4.1 一对一 4.1.1 表对应关系, 一个订单对应一个用户 4.1.2 实体对应关系 public class Order { private int id; private Date order ...

  10. Python-生成器实现简单的"生产者消费者"模型

    一.使用生成器实现简单的生产者消费者模型, 1.效果截屏 代码如下: import time def consumer(name): print('%s 开始买手机' %name) while Tru ...