黄岛因特网站建设公司,淮安涟水网站建设,微信小程序与wordpress,建设网站需要提前准备的条件HDFS
NameNode
安全模式(safemode) 当NameNode被重启的时候#xff0c;自动进入安全模式 在安全模式中#xff0c;NameNode首先会触发edits_inprogress文件的滚动。滚动完成之后#xff0c;更新fsimage文件 更新完成之后#xff0c;NameNode会将fsimage文件中的元数据加…HDFS
NameNode
安全模式(safemode) 当NameNode被重启的时候自动进入安全模式 在安全模式中NameNode首先会触发edits_inprogress文件的滚动。滚动完成之后更新fsimage文件 更新完成之后NameNode会将fsimage文件中的元数据加载到内存中。加载完成之后NameNode等待DataNode的心跳 如果NameNode没有收到DataNode的心跳那么此时NameNode就会认为这个DataNode已经lost那么此时NameNode会将这个DataNode上的数据备份到其他的节点上来保证副本数量如果NameNode收到了DataNode的心跳那么会对这个DataNode上的Block存储情况进行校验。如果校验成功那么NameNode自动退出安全模式如果校验失败那么NameNode会试图恢复这个DataNode上的数据每个DataNode的全部数据都会在其他DataNode上有备份恢复完成之后会重新校验校验成功之后才会退出安全模式 在安全模式下HDFS只提供读(下载)操作不提供写(上传)操作 如果在合理的时间内HDFS依然没有退出安全模式那么说明数据已经产生了不可逆的损坏或者丢失(这个数据的所有副本都损坏或者丢失) 安全模式的命令 命令解释hdfs dfsadmin -safemode enter进入安全模式hdfs dfsadmin -safemode leave退出安全模式hdfs dfsadmin -safemode get获取安全模式的状态
DataNode
DataNode是HDFS的从进程负责存储数据。DataNode会将数据以Block形式落地到本地的磁盘上Block在磁盘上的存储位置由dfs.datanode.data.dir属性来决定的默认值是file://${hadoop.tmp.dir}/dfs/data由hadoop.tmp.dir属性来决定DataNode会为每一个Block生成一个.meta文件.meta文件实际上是这个Block的校验文件DataNode会通过心跳向NameNode注册信息DataNode的状态预服役、服役、预退役、退役
SecondaryNameNode SecondaryNameNode不是NameNode的备份而是辅助进程用于辅助NameNode完成edits_inprogress文件的滚动和fsimage文件的更新 如果HDFS集群中存在SecondaryNameNode那么fsimage文件的更新是由SecondaryNameNode来完成如果HDFS集群中不存在SecondaryNameNode那么fsimage文件的更新是由NameNode自己来完成 因此SecondaryNameNode不是必须的进程。实际过程中NameNode和SecondaryNameNode不是在同一个节点上 fsimage文件的更新过程 由于HDFS集群的限制HDFS集群支持两种模式 1个NameNode1个SecondayNameNoden个DataNoden个NameNoden个DataNode 考虑到NameNode作为核心节点必须对NameNode来进行备份。所以实际过程中采用上述的第二种结构
机架感知策略 在HDFS集群中机架指的是逻辑机架。默认情况下机架感知策略是不开启的 逻辑机架通过一个映射(map)来定义主机和机架之间的关联。将主机名或者IP作为键将机架作为值只要值相同就表示不同的服务器是位于相同的机架上的 # hadoop01~hadoop03都是属于机架r1hadoop04~05都是属于机架r2
rack {hadoop01:r1,hadoop02:r1,hadoop03:r1,hadoop04:r2,hadoop05:r2
}如果需要开启机架感知策略那么需要在hadoop-site.xml文件中配置 propertynamenet.topology.script.file.name/namevalue脚本的路径/value
/property实际过程中一般是通过shell或者python来定义脚本文件 理论上而言可以将同一个物理机架上的节点配置到不同的逻辑机架上也可以将不同物理机架上的节点配置到同一个逻辑机架上
副本放置策略
HDFS为了保证数据的可靠性默认采用的是多副本策略。默认情况下每一个Block对应了3个副本。副本数量可以通过dfs.replication属性来调节在HDFS中如果不开启机架感知策略副本是放在相对空闲的节点上如果开启了机架感知策略那么对应的会开启副本放置策略 第一个副本如果是集群内部上传谁上传就放在谁身上如果是集群外部上传谁空闲就放在谁身上第二个副本放在和第一个副本相同机架的不同节点上第三个副本放在和第二个副本不同机架的节点上更多副本谁空闲放在谁身上
命令和操作
启动命令
命令解释start-dfs.sh启动HDFSstop-dfs.sh关闭HDFShdfs --daemon start namenode启动NameNodehdfs --daemon start datanode启动DataNodehdfs --daemon start secondarynamenode启动SecondaryNameNodehdfs --daemon stop namenode关闭NameNodehdfs --daemon stop datanode关闭DataNodehdfs --daemon stop secondarynamenode关闭SecondaryNameNode
基本命令
命令解释hadoop fs -put a.txt / 或者hadoop fs -copyFromLocal a.txt / 过时将a.txt上传到HDFS的根目录下hadoop fs -ls / 查看子文件和子目录hadoop fs -ls -R /递归查看hadoop fs -cat /a.txt查看文件内容hadoop fs -appendToFile b.txt /a.txt将本地的b.txt的内容追加到HDFS的a.txt中hadoop fs -checksum /a.txt计算校验和(就是获取这个文件的md5计算结果)hadoop fs -chown tom /a.txt更改文件所属用户hadoop fs -chmod 777 /a.txt更改文件的权限hadoop fs -chgrp test /a.txt更改文件的用户组hadoop fs -copyToLocal /a.txt /opt/test.txt或者hadoop fs -get /a.txt /opt/test.txt下载文件hadoop fs -cp /a.txt /b.txt复制文件hadoop fs -mv /a.txt /test.txt剪切或者重命名文件hadoop fs -df /查看HDFS的容量hadoop fs -du /b.txt查看文件的大小hadoop fs -setrep 3 /b.txt上传文件时指定副本数量这个参数优先级高于默认的副本数量指定副本数量
回收站机制 在HDFS中回收站机制默认是不开启的即删除命令会立即生效无法撤销 如果需要开启回收站机制那么需要在core-site.xml文件中做配置 !-- 指定文件在回收站中临时的存放时间 --
!-- 单位默认是min --
!-- 如果不指定默认情况下值为0即删除要立即生效 --
!-- 如果超过指定时间没有将文件从回收站中移出来那么这个文件就会被清理掉 --
propertynamefs.trash.interval/namevalue1440/value
/property回收站的默认路径是/user/${user.name}/.Trash/Current/ 如果需要将文件从回收站中挪出来那么使用hadoop fs -mv命令即可
流程
删除流程
客户端发起RPC请求到NameNode请求删除指定文件NameNode收到请求之后会进行校验 校验是否有写入权限 - AccessControlException校验是否有指定文件 - FileNotFoundException 如果校验失败那么会报错如果校验成功那么NameNode修改元数据修改完元数据之后NameNode会给客户端返回一个ACK信号表示删除成功注意此时文件并没有真正从HDFS上移除仅仅是修改了元数据NameNode会等待DataNode的心跳收到DataNode的心跳之后会在心跳响应中要求DataNode删除对应的BlockDataNode收到心跳响应之后才回去磁盘上删除这个文件对应的Block。注意此时文件才真正从HDFS上移除
写入(上传)流程 客户端通过DistributedFileSystem向NameNode发送RPC请求请求上传指定文件 NameNode收到请求之后会进行校验 校验是否有写入权限 - AccessControlException校验是否有同名文件 - FileAlreadyExistException 如果校验失败那么直接报错如果校验成功NameNode会给客户端返回一个信号表示允许上传 客户端在收到信号之后会再次给NameNode发送请求请求获取第一个Block的存储地址 NameNode收到请求之后会查询元数据根据副本放置策略将这个Block的存储位置放入队列中返回给客户端。存储位置其实就是DataNode的主机名/IP默认情况下返回的是3个地址(副本数量默认为3) 客户端收到队列之后会从队列中将地址全部取出取出之后会从中选择一个较近(网络拓扑距离的远近)的节点通过FSDataOutputStream来请求建立pipeline(管道)来写入当前Block的第一个副本第一个副本写完之后这个副本所在的节点会通过pipeline将这个Block的第二个副本写入第二个副本写完之后这个副本所在的节点会通过管道来写入下一个节点 当这个Block的最后一个副本写完之后会给上一个副本所在的节点返回一个ACK信号表示成功上一个副本所在的节点收到ACK之后会继续往前返回ACK直到返回给客户端 当客户端收到ACK之后会再次给NameNode发送请求请求获取下一个Block的存储位置重复5.6.7三个步骤直到所有的Block全部写完 当所有的Block全部写完之后客户端会给NameNode发送一个结束信号(关流)。NameNode收到信号之后会关闭文件。文件一旦关闭就不能修改
读取(下载)流程 客户端通过DistributedFileSystem向NameNode发送RPC请求请求读取指定文件 NameNode收到请求之后会进行校验 校验是否有读取权限 - AccessControlException校验是否有指定文件 - FileNotFoundException 如果校验失败则直接报错如果校验成功 那么NameNode会给客户端返回一个信号表示允许读取 客户端收到信号之后会再次给NameNode发送请求请求获取第一个Block的存储位置 NameNode收到请求之后会查询元数据将这个Block的存储位置以及Block的校验信息放入队列中返回给客户端 客户端收到队列之后会将地址从队列中全部取出从中选择一个较近网络拓扑距离较近的节点通过FSDataInputStream来读取这个Block 读取完成之后客户端会对这个Block进行一次checkSum校验。如果校验失败那么客户端会从剩余的地址中重新选取地址重新读取重新校验如果校验成功那么客户端会再次给NameNode发送请求请求获取下一个Block的位置重复5.6.7直到所有的Block全部读取完毕 当所有的Block都读取完之后客户端会给NameNode发送一个结束信号
特点
支持超大文件。HDFS会对文件进行切块处理所以集群规模越大能够存储的文件就越大能够快速的应对和检测故障。HDFS通过心跳来管理DataNode通过心跳可以确定DataNode的状态以及Block的状态高容错性。HDFS对文件进行备份从而保证不会因为一个节点宕机就产生数据丢失可以在相对廉价的机器上来进行横向扩展不支持低延迟数据访问。HDFS的设计初衷就是为了存储超大文件因此考虑的是数据的吞吐量而不是响应速度不建议存储小文件。每一个小文件对应的会产生一条元数据小文件多了就意味着元数据会增多那么会导致内存占用变大同时会导致查询效率降低简化的一致性模型。HDFS支持一次写入多次读取不支持修改但是支持追加写入不支持事务或者支持弱事务。这就意味着在HDFS中即使数据写错也不能修改存储的超大文件允许小部分数据出错。HDFS通常是TB级的日志级别然后对其数据分析。其中几MB的数据出错并不会影响最终的分析结果。
补充
RPC
RPC(Remote Procedure Call)远程过程调用指的是允许程序员在一个节点上远程调用另一个节点上的程序或者功能而不需要显式的实现这个功能RPC是Nelson在1990年的论文中提出的理论现在RPC已经成为了分布式中最重要的通讯方式存储的超大文件允许小部分数据出错。HDFS通常是TB级的日志级别然后对其数据分析。其中几MB的数据出错并不会影响最终的分析结果。
补充
RPC
RPC(Remote Procedure Call)远程过程调用指的是允许程序员在一个节点上远程调用另一个节点上的程序或者功能而不需要显式的实现这个功能RPC是Nelson在1990年的论文中提出的理论现在RPC已经成为了分布式中最重要的通讯方式stub(存根)保证两端能够调用的函数是相同的在Java中通常使用接口来实现