HDFS

来源:互联网 发布:mysql ibtmp1 删除 编辑:程序博客网 时间:2024/06/11 16:49

NameNode负责管理整个文件系统的原数据
DataNode负责管理用户的文件数据块
文件会按照固定的大小blocksize切成若干块后分布式存储在若干台DataNode上的
每一个文件块可以有多个副本,并存放在不同的DataNode上的
DataNode会定期向NameNode汇报自身保存的block信息,而NameNode则会负责保持文件的副本数量
HDFS的内部工作机制对客户端保持透明,客户端按照请求访问HDFS都是通过NameNode进行申请的,

HDFS的特性

HDFS中的文件在物理上是分块存储的Block,块的大小可以通过设置配置参数dfs.blocksize来规定的
HDFS文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件
目录结构以及文件分块信息元数据的管理由NameNode节点承担的
NameNode是HDFS集群主节点,负责维护整个HDFS文件系统目录树以及每一个文件路径对应的block信息
文件的各个block的存储管理由DataNode来承担的
DataNode是HDFS集群从节点,每一个block都可以在多余DataNode上存储多个副本
副本参数也可以通过参数设置dfs.replication
HDFS适合一次写入多次读取的场景,且不支持文件的修改
注意:适合用来做数据分析,并不适合用来做网盘应用
原因:不方便进行修改,延迟大,网络开销大,成本太高

工作机制

NameNode工作机制

NameNode职责负责客户端请求的响应,元数据的管理,查询修改

元数据管理

NameNode对数据的管理采用了三种存储形式:
1.内存元数据NameSystem
2.磁盘元数据镜像文件
3.数据操作日志文件(可以通过日志算出元数据)

元数据存储机制

内存中有一份完整的元数据,内存meta data

磁盘有一个准完整的原数据镜像 fsimage文件,在NameNode的工作目录中用于衔接内存metadata和持久化数据镜像fsimage之间的操作日志,edits文件

注意:
当客户端对HDFS中的文件进行新增或修改操作,操作记录首先被记入edits日志文件中
当客户端操作成功后,相应的元数据会更新到内存metadata中的

使用命令查看元数据

使用oiv和oev查看NameNode的镜像文件和编辑日志文件
oiv和oev为离线工具,不需要启动集群

$>hdfs  oiv  -p  XML  -i  xxx  -o  ~/xxx.xml      //fsimage$>hdfs  oev  -p  XML  -i  xxx  -o  ~/xxx.xml      //edit   log

元数据的checkpoint

每隔一段时间,会由SecondaryNameNode将NameNode上积累的所有edits和一个fsimage下载到本地上
并加载到内存中进行merge(这个过程被称为checkpoint)

checkpoint操作的触发条件,相关参数设置dfs.namenode.checkpoint.check.period=60   // 检查触发条件是否满足的频率   60秒的dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary以上俩个参数进行checkpoint操作时候,SecondaryNameNode本地目录的配置dfs.namenode.checkpoint.edits=${dfs.namenode.checkpoint.dir}dfs.namenode.checkpoint.max-retries=3       //最大重试次数dfs.namenode.checkpoint.period=3600       //俩次checkpoint之间的间隔时间3600秒dfs.namenode.checkpoint.txns=1000000      //俩次  checkpoint之间的最大的操作记录

checkpoint的作用

NameNode和SecondaryNameNode的工作目录存储结构相同,所以,当NameNode故障退出需要重新恢复时候,可以从SecondaryNameNode工作目录中将fsimage拷贝到NameNode工作目录下的,以恢复NameNode元数据

checkpoint的作用

NameNode每次更新内存,都会将相关操作,操作日志不断 进行追加记录在edits中的
每一段时间,SecondaryNameNode请求是否需要checkpoint
SecondaryNameNode发出checkpoint请求
NameNode会滚动一下当前正在写的编辑日志
滚动日志:滚动一下,生成更多不变的edits
目的是为了更多的进行备份元数据
NameNode将edits与fsimage一起下载到 SecondaryNameNode
fsimage与NameNode加载到内存中,进行合并操作
合并更新后的元数据,dump一下生成新的image文件fsimage.checkpoint序列化,反序列化操作
将内存中的文件弄到磁盘上的上传
与NameNode中已经有的fsimage进行重新合成,形成新的fsimage文件,并进行覆盖

注意:
下载之后的edits会进行定期清除的,不会全部删完
//这点不是确定,还有待验证fsimage只会下载一次,之后只下载edits
hadoop中,editslog中的一个操作记录可以通过形成元数据的算法,进行更新元数据

DataNode的工作机制

DataNode的工作机制是负责存储管理用户的文件块数据,定期向NameNode汇报自身持有的block信息,通过心跳机制进行上报
当集群中某些block副本失效时候,集群如何恢复block初始副本数量的问题

HDFS多余数据删除的设置

<property>    <name>dfs.blockreport.intervalMsec</name>    <value>36000000</value>     <description> Determines  block  reporting  interval  in  milliseconds</description></property>

DataNode宕机判断时限参数

DataNode进程死亡或者网络故障造成DataNode无法与NameNode通信,NameNode不会立即把该节点判定为死亡,要经过一段时间,这段时间称为超时时长。HDFS默认的超时时长为10分钟+30秒,如果定义超时时间为timeout,则超时时长的计算公式为:
timeout=2*heartbeart.recheck.interval +10*dfs.heartbeat.interval
而默认的heartbeat.recheck.interval大小为5分钟,dfs.heartbeat.interval默认为3秒
需要注意的是hdfs-site.xml配置文件中的heartbeat.recheck.interval的单位为毫秒的

通过HDFS读取数据

客户端将要读取的文件路径发送给NameNode,NameNode获取文件的元信息,主要是block的存放位置信息,返回给客户端,客户端根据返回的信息找到相应的DataNode逐个获取文件的block,并在客户端本地进行数据追加合并从而获得整个文件的

详细步骤解析:
根据NameNode通信查询元数据,找到文件块所在的DataNode服务器
挑选一台DataNode,就近原则,然后随机的,请求建立socket流的
DataNode开始发送数据,从磁盘读取数据输入流,以packet为单位来做校验的
客户端以packet为单位接收,先在本地进行缓存,然后写入目标文件

向HDFS些数据

客户端向HDFS些数据,首先根据NameNode通信以确认可以写文件并获得接收文件block的DataNode
然后,客户端按照顺序将文件逐个blcok 传递相应的DataNode并由接收到block的DataNode负责向其他的DataNode复制block副本的

详细步骤分析

跟NameNode通信请求上传文件,NameNode检查目标文件是否存在额,父目录是否存在
NameNode返回是否可以上传
Client请求第一个block该传输到哪些DataNode服务器上的
NameNode返回3个DataNode服务器ABC
client请求3台DataNode中的一台A上传数据,本质上是一个RPC调用的额,建立pipeline,A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成, 逐级返回客户端
client开始往A上传第一个block,先从磁盘读书数据放到一个本地内存缓存,以packet为单位,A收到一个packet就会传给B,B传给C,A每传一个packet会放入一个应答队列等待应答的
当一个block传输完成后,client再次请求NameNode上传第二个block的服务器的

ssh-keygen -t rsa -P ‘’ -f ~/.ssh/id_rsa
ssh-keygen 密钥生成指令 -t rsa为rsa算法,-p为密码 -f为文件

Hadoop机架感知

机架感知策略,可以通过编程实现接口与修改配置文件方式进行实现的
第一个副本在Client所处的节点上,如果客户端在集群上随机选择一个的
第二副本和第一副本不是相同机架
第三副本和第二副本所在机架相同

编写脚本文件实现在master节点上对其余四个从节点的控制1.分发脚本#/bin/bashpcount=$#if  ((pcount<1));thenecho   no  args;exit;fi##获得文件名p1=$1;fname=`basename $p1`###获得上级目录的绝对路径,-P获取物理路径pdir=`cd  -P   $(dirname   $p1); pwd`###获取当前用户名cuser=`whoami`#循环for  ((host =101;host<105;host=host+1));doecho   "--------------slave$host-------------------"rsync   -rvl  $pdir/$fname   $cuser@slave$host:$pdirdone在五台机器上执行相同的命令的脚本#!/bin/bashpcount=$#if ((pcount<1));thenecho   no  args;exit;fiecho  "----------master--------------------------"$@for ((host=101;host<105;host=host+1));do echo   "--------------------slave$host-------------------------"ssh   slave$host      $@done

机架感知决定集群的性能,尤其是在放置数据时候,需要从哪个节点去取数据,如何交换网络路由,设备,带宽是否降低,机架感知在里面起到了至关重要的作用

xsync分发
hadoop classpth执行查看hadoop的类路径的

JAVA_HEAP_MAX=-Xmx1000m 设置java的堆大小,默认为1000M的

if  [  "$HADOOP_HEAPSIZE" != "" ];then  JAVA_HEAP_MAX="-Xmx""$HADOOP_HEAPSIZE""m"fi
原创粉丝点击