HDFS设计思想
HDFS设计思想
DataNode:用来在磁盘上存储数据
HDFS 数据存储单元( block )
1 文件被切分成固定大小的数据block块
•默认数据块大小为 64MB(hadoop1.x版本64M,2.x为128M) ,可配置
•若文件大小不到 64MB ,则单独存成一个block
比如:一个120M的文件会分成64M+56M两个block块,虽然第二个分割不到64M,依然作为单独的block。
2 一个文件存储方式
•上传时按文件大小被切分成若干个 block ,存储到不同节点上。每一个block都有唯一的编号。
•默认情况下每个 block 都有三个副本,存储到三个不同的节点上,这三个副本是同级的,比如第一次访问和第二次访问可能因为副本所在节点的资源空闲而被访问,因此副本和备份作用不同。比如某个文件被分成了三个block,block1+block2+block3,而对于每个block都有三个副本,如三个block1副本分别存储server1、server2、server3三个节点上。如果集群中DataNode节点数量不够三个,存储就会报错。也就是DataNode节点的数量不小于block数量。
Block 大小和副本数通过 Client 端上传文件时设置,文件已经上传服务器成功后,文件block的副本数可以变更,比如文件被append追加修改(因为文件修改仅仅支持追加)生成新的block。Block Size 不可变更,所以虽然block数量增加了,但是block数据块64M大小依然不变。
NameNode:保存metadate元数据,接受客户端读写。
1 NameNode保存metadata元数据,包括:
• 文件 owership(属组和属主)和 permissions(权限)
• 文件包含哪些block块及这些block块ID
• Block 保存在哪个DataNode (由 DataNode 启动时上报),即block块的位置信息。
2 metadate 元数据会在启动时从磁盘加载到内存
也就是说启动后,内存和磁盘中都有一份metadata元数据信息。
• metadata 存储到磁盘文件名为”fsimage” ,在NameNode启动时加载到内存,
而DataNode启动时会上报block的位置信息给NameNode,然后NameNode把block的位置信息保存到内存中。也就是说磁盘上的fsimage文件中此时就少了block的位置信息了。
• Block 的位置信息不会保存到fsimage
• edits 记录对 metadata 的操作日志
那么,metadata元数据的操作日志是什么情况下产生的呢?
答:比如上传新文件时,元数据进行内存操作之后记录edits日志,记录了元数据信息。
那么问题来了:
1为什么比如上传文件时,对元数据内存操作后,要记录edits日志,而不直接操作fsimage日志呢?
因为对于大数据系统来说,大量的文件上传时会操作内存中的元数据,然后如果直接操作fsimage元数据文件,就会造成IO瞬间爆发,造成阻塞。所以记录的只是操作记录edits日志。
2 随着时间增加,fsimage文件并没有跟内存元数据保持同步,而落后了很多。怎么办?
SecondaryNameNode的作用就提现出来。
SecondaryNameNode:不是主也不是从节点。主要用来辅助NameNode完成fsimage文件的同步的更新的,这个过程叫做合并edits日志。因为同步更新时根据edits日志来更新的,也就是fsimage日志和edits日志的合并。
1 SNN 执行合并时机
• 根据配置文件设置的时间间隔fs.checkpoint.period 默认 3600 秒
• 根据配置文件设置edits log 大小 fs.checkpoint.size 规定 edits 文件的最大值默
认是 64MB
2 SNN合并流程
• 首先,NameNode生成一个新的edits日志文件为元数据操作做准备。
• 接着,SecondrayNameNode从NameNode读取edits和fsimage文件到自己节点。
• 进行合并,生成一个新的fsimage文件。
• SecondrayNameNode把新fsimage文件传输给NameNode,NameNode更新fsimage。
• 当下一个合并时机到来时依次类推。
DataNode ( DN )
– 存储数据( Block )
–启动 DN 线程的时候会向 NN 汇报 block 信息
–通过向 NN 发送心跳保持与其联系( 3 秒一次),如果 NN 10 分钟没有收
到 DN 的心跳,则认为其已经 lost ,并 copy 其上的 block 到其它 DN。
问题:dataNode已经挂掉了,是怎么保持block副本为3个呢?
答:NameNode其实会进行checkSize检查每个block的副本数,如果不足则进行复制,所以也不需要知道挂掉的那个节点任何信息。如果复制时发现DataNode节点数小于配置副本数,报错!
Block 的副本放置策略
–第一个副本:放置在上传文件的 DataNode ;
如果是集群外提交,则随机挑选一台,磁盘不太满, CPU 不太忙的节点。
–第二个副本:放置在于第一个副本不同的机架的节点上。
–第三个副本:与第二个副本相同机架的节点。
–更多副本:随机节点
HDFS写流程:
其实就是上传为件,通过hdfs API.
1 客户端请求NameNode,传递参数文件大小、文件名、文件“客户端”用户
2 NameNode收到文件后,比如1G,NameNode服务端配置的有默认block大小,在客户端没有指定block大小时使用。会返回告诉客户端block大小、空闲DataNode机器(DataNode跟NameNode保持三秒一次的心跳)
3 客户端通过输出流,把数据按照字节流方式写到DataNode上去,边写边切成block,就是写够64M后就生成了第一个block,然后继续写第二个block到当前DataNode或者其他的DataNode上。写完后,文件就上传成功了。
注意:副本和客户端无关,当第一个block写完后就会复制副本给其他的DataNode节点。
HDFS读流程:
1 客户端请求NameNode,NameNode接收到文件路径,返回此文件的元数据(文件哪些block及编号、block位置信息)给客户端。
2 客户端通过字节输入流到DataNode上读取依次block。每个block有是3个以上副本,到哪里读?会找到副本所在dataNode空闲的节点读取。
3 读取完成,告诉NameNode汇报。
搭建HDFS集群环境:
准备:
1 准备机器192.168.98.95(node1)、192.168.98.96(node2)、192.168.98.97(node3)、192.168.98.98(node4)四台机器
2 各节点时间相同,差几秒没事
3 设置免登录、检查jdk1.7
配置Hosts:
scp –p /etc/hosts root@node2:/etc
设置免登录:
#这个命令会产生一个公钥(~/.ssh/id_rsa.pub)和密钥(~/.ssh/id_rsa)
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
# 将自己的公钥导入认证文件中,就直接可以ssh本机ip,进行登陆,不需要输入密码
cat ~/pub_key >> ~/.ssh/authorized_keys
所以,将其他机器的pub_key导入到本机认证文件中就可以实现免登录。
比如使用192.168.98.95(node1)访问192.168.98.96(node2),免登录:
- # ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
- #scp -p ~/.ssh/id_dsa.pub root@node2:/opt
复制到了192.168.98.96(node2),然后在192.168.98.96(node2)执行以下命令:
- #cat /opt/id_dsa.pub >> ~/.ssh/authorized_keys
- Ok!
- #cd /root/hadoop-2.5.1/etc/hadoop
- # vi hadoop-env.sh
修改JAVA_HOME
- #vi core-site.xml
- <property>
- <name>fs.defaultFS</name>
- <value>hdfs://node1:9000</value>
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/opt/hadoop-2.5</value>
- </property>
#vi hdfs-site.xml
- <property>
- <name>dfs.www.trgj888.com namenode.secondary.http-address</name>
- <value>hdfs://www.thq666.com/ node2:50090</value>
- </property>
- <property>
- <name>dfs.namenode.secondary.https-address</name>
- <value>hdfs://www.yigou521.com/ node2:50091</value>
- </property>
- <property>
- <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
- <value>false<www.yongshiyule178.com /value>
- </property>
#vi slavers
- node2
- node3
- node4
#vi master
node2
加入hadoop环境变量到/etc/profile
#hdfs namenode -format --只能在namenode下敲
帮我们创建了/opt/hadoop-2.5/dfs/name/current
及其下的fsimage文件
启动hadoop
#start-dfs.sh
关闭防火墙
#systemctl stop www.taohuayuan178.com/ firewalld.service
http://192.168.98.95:50070/
http://192.168.98.96:50090
问题:不知什么情况datanode只有node4,没有node2和node3呢?-www.tygj178.com-namdeNode和dataNode的clusterID不一致!
Hadoop日志也没有看出错误:/root/hadoop-2.5.1/logs
tail -fhadoop-root-namenode-localhost.localdomain.log
HDFS设计思想的更多相关文章
- 从一般分布式设计看HDFS设计思想与架构
要想深入学习HDFS就要先了解其设计思想和架构,这样才能继续深入使用HDFS或者深入研究源代码.懂得了"所以然"才能在实际使用中灵活运用.快速解决遇到的问题.下面这篇博文我们就先 ...
- HDFS设计思想、元数据、简单JAVAAPI操作HDFS
一. 设计思路 分布式文件系统 在Hadoop中文件系统是一个顶层的抽象. 分布式文件系统相当与对文件系统进行了一个扩展(类似于java中的接口). HDFS是分布式文件系统的一个实现,分布式文件系统 ...
- 2 weekend110的HDFS的JAVA客户端编写 + filesystem设计思想总结
HDFS的JAVA客户端编写 现在,我们来玩玩,在linux系统里,玩eclipse 或者, 即,更改图标,成功 这个,别慌.重新换个版本就好,有错误出错是好事. http://www.eclips ...
- LSM树由来、设计思想以及应用到HBase的索引
讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎 是哈希表的持久化实现,支持增.删.改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储 ...
- LSM树由来、设计思想以及应用到HBase的索引(转)
转自: http://www.cnblogs.com/yanghuahui/p/3483754.html 讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎 是哈 ...
- HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo
26 集群使用初步 HDFS的设计思路 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式 ...
- 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...
- spring事务管理器设计思想(二)
上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...
- 掌握 Cinder 的设计思想 - 每天5分钟玩转 OpenStack(46)
上一节介绍了 Cinder 的架构,这节讨论 Cinder 个组件如何协同工作及其设计思想. 从 volume 创建流程看 cinder-* 子服务如何协同工作 对于 Cinder 学习来说,Volu ...
随机推荐
- 2018.6.10 Oracle数据库常见的错误汇总
1.ClassNoFoundException 找不到注册驱动 可能原因:1>驱动名称不对 2>没有导入数据库驱动包 2.SQl 语句中可以使用任何有效的函数,函数操作的列,必须指定别名, ...
- python剑指offer 合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. # -*- coding:utf-8 -*- # class ListNode: # def _ ...
- 表格和网页ico图标
表格: 表格格式: <table> <tr> 表格的行 <th >表头</th> <th>表头 </th> </tr> ...
- C#条件运算符(?:)
一.C#条件运算符(?:) 条件运算符(?:),有时也称为三元操作符“?:”.它是根据布尔型表达式的值返回?后面的两个值中的一个.如果条件为True,则计算第一个表达式并以它的计算结果为准:如果条件为 ...
- es6中的模版字符串
目录 字符串拼接 includes() startsWith() endsWith() padStart() es6中的模版字符串替代了原有的字符串拼接功能. 字符串拼接 es5方式 传统的字符串拼接 ...
- PKI
公钥基础设施(Public Key Infrastructure,简称PKI)是眼下网络安全建设的基础与核心,是电子商务安全实施的基本保障,因此,对PKI技术的研究和开发成为眼下信息安全领域的热点.本 ...
- PHP实现消息推送
我们做web的时候偶尔会遇到消息推送,如图示例(红框位置) 当我们遇到这种功能要如何开发呢?下边将我了解的两种方法整理一下: 一.ajax轮询,定时去请求服务器数据 通过观察thinkphp官网貌似也 ...
- python3 提成计算
题目 企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 20万到4 ...
- Codeforces Round #464 (Div. 2) C. Convenient For Everybody
C. Convenient For Everybody time limit per test2 seconds memory limit per test256 megabytes Problem ...
- HDU 4005 The war 双连通分量 缩点
题意: 有一个边带权的无向图,敌人可以任意在图中加一条边,然后你可以选择删除任意一条边使得图不连通,费用为被删除的边的权值. 求敌人在最优的情况下,使图不连通的最小费用. 分析: 首先求出边双连通分量 ...