HDFS的总结---通俗易懂

本文详细介绍了HDFS的架构,包括其优点和缺点,以及NameNode、SecondaryNameNode和DataNode的功能。深入探讨了Block的基本存储单位,元数据的存储方式,以及如何通过SecondaryNameNode合并元数据。此外,还讲解了读、写、删除流程和启动流程。
部署运行你感兴趣的模型镜像

HDFS: 上传的数据经过切块分布式存储 并且每个块都有多个备份 保证性能和可靠性

            优点:
                支持超大文件
                检测和快速应对硬件故障
                流式数据访问
                简化的一致性模型
                高容错性
                可构建在廉价机器上

            缺点:
                低延迟数据访问
                大量的小文件
                多用户写入文件、修改文件
                不支持超强的事务

            组成结构
                NameNode
                    元数据的存储
                SecondaryNameNode
                    帮助NameNode实现元数据的合并
                DataNode
                    存储数据块(Block) 
                               
            !!!!!!!技术细节


                Block
                    最基本的存储单位。
                    128MB(64MB)
                    3个副本
                    如果某个块不足128MB 切出的块该是多大就是多大 128MB是块的最大大小
                NameNode
                    存储的是元数据
                    元数据存储在NameNode的内存和磁盘(FsImage、Edits、FsTime)中
                    元数据信息包括:
                        内存中的元数据:
                            文件名及目录结构信息 副本数量 Block的编号 Block和DataNode的映射关系
                        文件中的元数据:
                            文件名及目录结构信息 副本数量 Block的编号

                SecondaryNameNode
                    不是NameNode的热备 而是一个帮助者 帮助NameNode合并元数据
                    触发元数据合并的条件:
                        时间间隔达到:3600秒 距离上次合并的时间间隔
                        edits文件大小达到:64MB
                    不是NameNode的热备 但是其实具有一定的备份能力,因为在SNN里保存着上一次合并的元数据信息 当NN崩溃,元数据信息丢失时,
                    可以从SNN中找到上一次合并时的元数据 恢复出部分数据。
                    但是很有可能丢失部分最新的元数据。只能作为极端工具下无奈的选择。

                DataNode
                    存储Block的节点
                    定时向NN发送心跳报告(3秒一次) 保持存活 向NN报告自己持有Block信息 接受NN的命令
                    如果连续10分钟NN都没有收到某个DataNode心跳信息 则NN会认为DataNode已经失去连接 

                合并元数据流程
                    当达到合并元数据的条件时,先产生新的edits.new文件,之后所有的更新写入此文件
                    SNN此时来复制NN中的fsimage和edits文件 复制完成后开始进行合并,合并为fsimage.ckpt
                    将此文件传送回NN,NN删除旧的fsimage将此文件更名为新的fsimage 再将edits.new更名为edits完成 元数据合并
                    这个过程中NN并不需要停止服务,可以持续工作,利用SNN减轻了NN的合并数据的工作压力。
                    

                读流程
                    使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
                    Namenode会视情况返回文件的部分或者全部block列表,对于每个block,Namenode都会返回有该block拷贝的DataNode地址;
                    客户端开发库Client会选取离客户端最接近的DataNode来读取block;如果客户端本身就是DataNode,那么将从本地直接获取数据.
                    读取完当前block的数据后,关闭与当前的DataNode连接,并为读取下一个block寻找最佳的DataNode;
                    当读完列表的block后,且文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表。
                    读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。
                    当文件最后一个块也都读取完成后,datanode会连接namenode告知关闭文件。

                写流程
                    使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
                    Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
                    当客户端开始写入文件的时候,client开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,
                    并向Namenode申请新的blocks。,获取用来存储replicas的合适的datanodes列表, 列表的大小根据在Namenode中对replication的设置而定
                    开始以pipeline(管道)的形式将packet写入所 有的replicas中。开发库把packet以流的方式写入第一个datanode,
            该datanode把该packet存储之后,再将其传递给在此 pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。
                    最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",
                成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet。
                    如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除, 
                剩余的block会继续在剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持 replicas设定的数量。
                    重复如上过程将所有package都上传完成 之后 向NameNode报告成功 关闭文件

                    **副本存放策略(机架感知策略):
                        一个Block有3个副本,这3个副本应该如何保存?
                        客户端将第一个副本写入离自己最近的节点 如果客户端所在的节点就是个DataNode 则直接上传本地 如果不是 则找到最近的DataNode节点上传
                        要通过管道流来复制Block
                        此时第二个副本选择 和第一个副本不同机架的另一个DataNode节点
                        第三个副本选择和第二个副本相同机架的DataNode节点

                删流程
                    客户端发起请求连接NameNode表示要删除文件
                    NameNode执行元数据的删除。
                    当NameNode执行delete方法时,它只标记操作涉及的需要被删除的数据块,而不会主动联系这些数据块所在的DataNode节点。
                    当保存着这些数据块的DataNode节点向NameNode节点发送心跳时,在心跳响应中,NameNode节点会向DataNode发出指令,要求删除这些block。
                    DataNode收到指令后删除对应的Block
                    所以在执行完delete方法后的一段时间内,数据块才能被真正的删除掉。

                启动流程
                    NameNode启动,进入安全模式,只能查看目录结构无法进行其他操作(读写操作)
                    namenode开始合并元数据,注意这次合并由NameNode自己来进行,合并完成后 生成新的fsimage和新的空的edits文件
                    再将fsimage中的数据恢复到内存中
                    接着等待 等待DataNode的心跳报告 DataNode在心跳报告中除了告知NameNode当前DataNode存活以外,还会在心跳中 带着其所持有的Block信息
                    NameNode根据DataNode心跳中的信息 在内存中构建出 Block对应的DataNode信息
                    当NameNode获取到足够数量的Block信息后 解除安全模式 开始对外提供服务

                    **安全模式----注意安全模式最后不要强制退出。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮用户解决关于Hadoop平台搭建的问题。用户希望得到详细的步骤解释,用通俗易懂的语言,还要一个流程图。首先,我应该先回忆Hadoop搭建的基本流程,然后结合用户提供的引用内容来组织信息。 首先,用户引用了几个关于Hadoop运行模式、配置文件和启动过程的内容。比如引用[1]提到了本地模式、伪分布式和完全分布式,用户可能需要区分这些模式的不同。引用[3]和[4]涉及环境变量和配置文件设置,这些是搭建的关键步骤。用户还提到需要流程图,可能需要用文字描述流程结构,因为无法直接画图。 接下来,我需要确定搭建Hadoop的步骤。通常包括环境准备、安装Java、配置SSH免密登录、Hadoop安装与配置、环境变量设置、初始化与测试等。每一步的作用需要解释清楚,比如为什么需要SSH免密,或者配置文件各个部分的作用。 然后,要确保语言简单易懂。比如,解释Hadoop配置文件时,可以比喻为“告诉Hadoop去哪里找资源和如何工作”。用户可能需要知道每个配置项的意义,比如core-site.xml中的fs.defaultFS是指定文件系统的地址。 流程图部分,可能需要分阶段描述:环境准备→软件安装→配置→启动→验证。每个阶段下分步骤,比如环境准备包括创建用户、安装Java,配置包括修改XML文件等。虽然用户要求流程图,但用文字描述结构可能更实际,同时建议使用工具生成图形。 还需要注意用户提到的引用内容,比如引用[3]中的hadoop-env.sh配置JAVA_HOME,引用[4]中的环境变量设置。这些需要整合到步骤中,并解释每个设置的作用,比如JAVA_HOME是告诉系统Java的位置,PATH是为了方便执行命令。 此外,用户可能需要知道不同模式的区别,比如完全分布式需要多台服务器,而伪分布式是单机模拟。在步骤中应说明适用于哪种模式,可能用户需要的是完全分布式的步骤,但需要确认。不过根据问题描述,用户希望详细的平台搭建,可能是指完全分布式,但引用中提到了本地和伪分布式的例子,可能需要涵盖主要的模式,但重点在完全分布式。 最后,生成相关问题,考虑用户可能进一步询问如何验证集群是否正常工作,或者常见问题解决,比如启动失败怎么办,配置文件错误如何排查等。确保问题与搭建步骤相关,帮助用户深入理解。 总结下来,回答的结构应该是分步骤详细解释,每个步骤的作用,结合引用中的配置示例,最后给出流程图的结构和相关问题。</think>### Hadoop平台搭建步骤详解(完全分布式模式) #### 一、环境准备阶段 1. **服务器集群规划** 准备3台及以上Linux服务器(1个NameNode + 2个DataNode),通过虚拟机或物理机实现[^3]。 2. **创建专用用户** 执行命令`useradd hadoop`创建独立用户,避免使用root账户操作,提高系统安全性[^1]。 3. **配置SSH免密登录** ```bash ssh-keygen -t rsa # 生成密钥 ssh-copy-id hadoop@node1 # 将公钥复制到其他节点 ``` 作用:实现节点间无密码通信,Hadoop启动脚本依赖此功能[^2]。 --- #### 二、软件安装阶段 1. **JDK安装** 上传JDK到`/usr/local/src/java`,配置环境变量: ```bash export JAVA_HOME=/usr/local/jdk # 指定Java路径[^4] export PATH=$JAVA_HOME/bin:$PATH # 全局调用Java命令 ``` *作用:Hadoop依赖Java运行环境* 2. **Hadoop安装** 解压安装包到`/usr/local/hadoop`,配置环境变量: ```bash export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/sbin # 添加Hadoop脚本路径[^4] ``` --- #### 三、核心配置阶段(配置文件路径:`$HADOOP_HOME/etc/hadoop`) 1. **hadoop-env.sh** ```bash export JAVA_HOME=/usr/local/jdk # 指定Java安装位置[^3] ``` 2. **core-site.xml** ```xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://namenode:9000</value> <!-- 定义HDFS访问地址 --> </property> </configuration> ``` 3. **hdfs-site.xml** ```xml <property> <name>dfs.replication</name> <value>3</value> <!-- 设置数据块副本数量 --> </property> ``` --- #### 四、集群启动与验证 1. **格式化HDFS** ```bash hdfs namenode -format # 首次启动必须执行 ``` *作用:创建元数据存储结构[^2]* 2. **启动HDFS服务** ```bash start-dfs.sh # 启动NameNode和DataNode[^2] ``` 3. **验证集群状态** ```bash hdfs dfsadmin -report # 查看节点在线状态 jps # 检查Java进程(NameNode/DataNode) ``` --- ### 流程图说明 ```mermaid graph TD A[环境准备] --> B[服务器集群规划] A --> C[创建专用用户] A --> D[SSH免密配置] B --> E[安装JDK] B --> F[安装Hadoop] E --> G[配置环境变量] F --> G G --> H[修改核心配置文件] H --> I[格式化HDFS] I --> J[启动集群服务] J --> K[运行验证命令] ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值