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
- HDFS
- HDFS
- HDFS
- HDFS
- HDFS
- HDFS
- HDFS
- HDFS
- HDFS
- hdfs
- hdfs
- HDFS
- hdfs
- HDFS
- HDFS
- HDFS
- hdfs
- HDFS
- PHP_notes_04
- AngularJS指令
- PHP二维数组(或任意维数组)转换成一维数组的方法汇总
- effective C++ 学习(Inheritance and Object-Oriented Design)
- 关于防止SSL劫持的解决方案
- HDFS
- 成为UX设计师:你需要知道的六个基本步骤
- Range Sum Query
- HBuilder快捷方式
- 卡尔曼滤波数据融合算法
- PHP_notes_05
- 2018网易校招试题2
- AngularJS控制器
- Webpack模块解析