简介
问题起源
爬取全球的网站,然后计算页面的PageRank- 要解决的问题
这些网站怎么存放
这些网站应该怎么计算
思想之源
- Google发布了三篇论文
GFS : Google File System – 谷歌文件系统
MapReduce :数据计算的方法
BigTable
Hadoop创始人
Doug cutting 花费了自己的两年业余时间,用java将论文实现了出来
发展历程
- 2003-2004年,Google公开了部分GFS和Mapreduce思想的细节,以此为基础Doug Cutting等人用了2年业余时间实现了DFS和Mapreduce机制,一个微缩版:Nutch
- Hadoop 于 2005 年秋天作为 Lucene的子项目 Nutch的一部分正式引入Apache基金会。
- 2006 年 3 月份,Map-Reduce分布式离线计算 和 Nutch Distributed File System (NDFS) nutch分布式文件系统分别被纳入称为 Hadoop 的项目中。
- (Hadoop如今是Apache基金会顶级金牌项目)
- Hadoop这名字来源于Doug Cutting儿子的玩具大象。
对应实现
- Hadoop(Java) — 分布式系统架构
- HDFS - Hadoop Distributed File System
(hadoop 分布式文件系统)- MapReduce — 分布式计算系统
Logo
官网地址: http://hadoop.apache.org/
经过时间的发展 Hadoop 1.x-->3.x
Hadoop组成
Hadoop Common
---- 基础型功能
Hadoop Distributed File System
---- 负责存放数据
Hadoop YARN
---- 负责资源的调配
Hadoop MapReduce
---- 大数据的计算框架
Hadoop Ozone
---- 数据存放到仓库
Hadoop Submarine
---- 机器学习引擎
Hadoop = hdfs(存储) + mapreduce(计算) + yarn(资源管理) + common(工具包) …
分布式存储系统HDFS
(Hadoop Distributed File System )
- 分布式存储系统
- 提供了 高可靠性、高扩展性和高吞吐率的数据存储服务
分布式计算框架MapReduce
- 分布式计算框架(计算向数据移动)
- 具有 易于编程、高容错性和高扩展性等优点。
分布式资源管理框架YARN
(Yet Another Resource Management)
- 负责集群资源的管理和调度
HDFS分布式存储系统(★)
HDFS
- HDFS是什么?
HDFS是Hadoop分布式文件存储系统 - 为什么会有分布式的文件存储系统出现?
以应对大量的数据和如何计算的难题 - 大量【pb级以上】的网页怎么存储问题
(之前是用磁柜存储)
分布式存储系统HDFS (Hadoop Distributed File System)
主要解决大数据的存储问题。
经过多年的发展,HDFS的应用已经非常成熟非常多,如百度网盘 360云盘 腾讯微云 阿里云(不仅提供服务器和云存储还提供服务,比一般的强多了)
大数据好多技术框架都架构于这个文件存储系统之上的。
hdfs架构图
hdfs的构建原理
Hadoop Distributed File System分布式文件系统
---- 负责存放数据
数据量比较大
数据的安全性
概念
- 字节数组
文件的抽象概念 - 切分数据
对字节数组进行切分 - 拼接数据
按照数组的偏移量将数据连接到一起 - 偏移量
当前数据在数组中的相对位置 - 节点
集群中参与计算的虚拟机(服务器) - 数据块 Block
数据被切分后的一个整体
1.x 64M ---- 2.x 128M
真实情况下,会根据文件大小和集群节点的数量综合考虑块的大小 - 数据块的个数 =Ceil( 文件大小 / 每个块的大小)
- 每个数据块会有3个副本,相同副本是不会存放在同一个节点上
- 副本的数量可以变更,但是Block的大小是不能改变的
数据存储的原理:
- 不论文件是大是小,所有的文件都是由字节数组构成
- 如果我们要切分文件,就是将一个字节数组分成多份
- 我们将切分后的数据拼接到一起,数据可以继续使用
- 我们需要根据数据的偏移量将他们重新拼接到一起
效率
- 我们为了更好地去处理数据,我们希望更多的节点参与到运算
- 那么我们需要将数据进行切分
- 切分之后,子数据块会放在不同的节点上
因为大小和切片数量和存放位置都是未知的
如果直接查询效率很低
需要专门给节点进行分工
存储 DataNode
记录 NameNode
拆分的标准
- 拆分的数据块需要等大
等大考虑算法的时候,可以将问题简化
数据计算的速度 :相对均衡
数据的读取速度
通过偏移量就知道这个块的位置 - 同一个文件中,每个子数据块大小要一致
除了最后一个节点外 - 不同文件切分的子数据块可以不同
安全
- 肯定要对数据做备份
- 备份的数据肯定不能存放在一个节点上
- 当我们使用数据的时候可以就近获取数据
- 所以备份的数量要小于等于节点的数量
HDFS绝对不允许去修改数据
- 不能等分
- 如果要保证等分,有可能会产生数据的大批量迁移(蝴蝶效应)
HDFS允许追加数据
- 但是集群默认是不支持追加的,需要手动开启追加功能
Mapreduce是完全基于HDFS之上的计算框架
集群节点
NameNode(NN)
功能
-接受客户端的读写服务
-保存文件的时候会保存文件的元数据信息
--文件的归属
--文件的权限
--文件的大小时间
--Block信息,但是block的位置信息不会持久化,需要每次开启集群的时候DN上报
-收集Block的位置信息
--系统启动
---NN关机的时候是不会存储任意的Block信息
---DN启动的时候,会将自己节点上存储的文件信息汇报给NN
---NN接受请求之后重新生成映射关系
---如果某个数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点
--集群运行中
---NN与DN保持心跳机制,三秒钟发送一次
---如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况
---可以让客户端一致读取存活的节点
---如果DN超过三秒没有心跳,就认为DN出现异常,就不会让新的数据读写去DN
---如果DN超过10分钟没有心跳,那么NN会将当前DN存储的数据转存到其他节点
NameNode为了效率,将所有的操作都在内存中完成
-执行速度快
-NameNode不会和磁盘进行任何的数据交换
-问题:
--数据的持久化
---数据保存在内存中,掉电易失
DataNode(DN)
-存放的是文件的数据信息
-数据会存放在硬盘上
-汇报
--启动时
---向NN汇报当前DN上block的信息
--运行中
---向NN保持心跳机制
SecondaryNameNode(SNN)
-传统的内存持久化方案
--日志机制
---做任何操作之前先记录日志
---在数据改变之前先记录对应的日志,当NN停止的时候
---当我下次启动的时候,只需要重新按照以前的日志“重做”一遍即可
---但是数据文件大小不可控,随着时间的发展,集群启动的时间会越来越长
--拍摄快照
---我们可以将内存中的数据写出到硬盘上
---启动时还可以将硬盘上的数据写回到内存中
---缺点
关机时间过长
如果是异常关机,数据还在内存中,没法写入到硬盘
如果写出频率过高,导致内存使用效率低(stop the world) JVM
-SNN的解决方案
--解决思路
---让日志大小可控
---快照需要定时保存
--解决方案
---当我们每次集群启动的时候,都会生成一个叫做 fsimage0000001
---我们每次操作都会记录日志 -->edits_inprogress-000000001
---随和时间的推移,日志文件会越来越大,当达到阈值的时候(64M 或 3600秒)
---会生成新的日志文件
edits_inprogress-000000001 -->edits_0000001
创建新的日志文件edits_inprogress-0000000016
-查看SNN的工作过程
--查看目录
---/var/sxt/hadoop/local/dfs/name/current
---edits_0000000000000000001-0000000000000000002
---edits_0000000000000000006-0000000000000000045
---edits_inprogress_0000000000000000046
当前已经正在执行的操作的日志信息
这些日志信息还没有被合并到镜像中
---fsimage_0000000000000000004
---fsimage_0000000000000000004.md5
完整性校验规则
---fsimage_0000000000000000045
---fsimage_0000000000000000045.md5
---seen_txid -->46
---VERSION
集群相关
文件的数据
分类:
元数据:
文件属性的相关描述
使用stat命令查看
数据:
使用vim命令查看
安全模式
- 指的是集群启动时的一个状态
- 处于这个状态为了保护数据的安全所以不可以被客户端访问
- NN启动时不会记录block的位置信息,需要DN汇报
- 如果NN收集Block的信息达到最少副本数,就会脱离安全模式
- 如果NN收集的Block信息没有达到最少副本数,就会将缺失的副本,从有的DN上拷贝到其他DN
- 在拷贝的过程中系统还是处于安全模式
HDFS的权限
- HDFS对权限的控制
只能防止好人做错事
不能防止坏人做坏事
- 你告诉他你是谁,他就认为你是谁!
机架感知策略
-为了保证副本在集群不发生意外
-我们需要将副本放在不同的节点上,节点也需要一定的考量
-第一个节点
--集群内部
---优先考虑和客户端相同节点作为第一个节点
--集群外部
---选择资源丰富且不繁忙的节点为第一个节点
-第二个节点
--选择和第一个节点不同机架的其他节点
-第三个节点
--与第二个节点相同机架的其他接点
-第N个节点
--与前面节点不重复的其他节点