分布式系统基础架构:海量数据存储和分析计算.
MaReduce
Yarn
HDFS :存储文件的元数据,文件名,目录结构等等,快列表及块所在的DataNode等等;
Common :
1>ResourceManager 集群的管理者
2> NodeManager 单台服务器的资源管理者
3>ApplicationMater 单个应用程序的管理者
4>Container 应用程序跑起来的资源的容器如(ApplicationMater 位于其中)
1> Map 阶段 处理输入数据
2> Reduce 阶段对Map结果进行汇总
NameNode
DataNode
SecondaryNameNode
NameNode
SecondaryNameNode
DataNode
NodeManager
core-default.xml
hdfs-default.xml
yarn-default.xml
mapred-default.xml
core-site.xml
hdfs-site.xml
yarn-site.xml
mapred-site.xml
Client
NameNode
SecondaryNameNode
HDFS文件是以块的形式存储,可以理解为存储文件的单位,但是块的大小可以通过人为设置。
1>如果块太小,会增加寻址时间
2>太大,传输数据的时间会明显大于定位到这个块所用的时间
总结:HDFS块的大小设置主要取决于磁盘传输速率。
寻址时间为传输时间的1%时,则为最佳状态(专家)
而目前磁盘的传输速率普遍为100Mb/s 因此Hadoop2.x/3.x版本中默认是128M,进制1024.
1> 客户端通过Distributed FileSystem模块向NameNode请求上传文件
2>NameNode检查目标文件是否已存在,父目录是否存在,并当且返回可以上传文件;
3>客户端请求第一个 Block上传到哪几个DataNode服务器上。
4>NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
5>客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
6>dn1、dn2、dn3逐级应答客户端表示连接建立成功;
7>客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8>当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务
在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。(节点距离:两个节点到达最近的共同祖先的距离总和。)
集群
机架
节点
1>第一个副本在Client所处节点上,如果客户端在集群外,堆积选一个
2>第二个副本在另一个机架的随机一个节点
3>第三个副本在第二个副本所在的机架的随机节点
考虑的因素有:数据安全性和数据传输速率。
1>客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址并校验当前客户是否有读的权限;
2>挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3>DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
4>客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
FsImage (在磁盘中备份元数据)存储的是结果的值。
Edits文件 (只进行追加操作,效率很高) 每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。记录过程 ,不计算。
SecondaryNamenode (专门用于FsImage和Edits的合并)
checkpoint:定时时间到 (合并)
edits中的数据满(合并)
edits_inprogress
FsImage与Edits
NameNode被格式化后,将在/opt/module/hadoop-3.1.3/data/dfs/name/current目录之下产生如下文件:
fsimage
seen_txid
VERSION
1>Fsimage:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
2>Edis:存放HDFS文件系统额所有更新操作的路径,文件系统客户端执行的所有写操作首先会被纪录到Edits文件中;
3>seen_txid文件保存的是一个数字,就是最后一个edits的数字
4>每次NameNode启动的时候,都会将FsImage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的,同步的,可以看成NameNode启动的时候就将Fsimage
和Edits文件进行了合并;
CheckPoint时间设置
1>SecondaryNameNode每隔一小时执行一次
2>一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次.
1>datanode启动后向NameNode注册,注册成功,NameNode会与当前dataNode节点建立起一个通信关系。
2>以后每周期6小时上报所有块的信息;
3>心跳每3秒一次,心跳返回结果带有NameNode给DataNode的命令(告诉NameNode是否处于活着的状态)
4>r如果超过10分30秒没有收到DataNode的心跳则认为该节点不可用,断开联系;
奇偶校验
crc校验位( hadoop 使用 crc(32))
场景:DataNode进程死亡或者网络故障造成DataNode无法与NameNode通信,NameNode不会立即把该节点判定为死亡,要经过一段时间,这段时间称作超时时长。
HDFS默认的超时时长为10分钟+30秒
重点
1>HDFS文件块大小
2> HDFS的shell操作(开发重点)
3>HDFS读写流程
4>NN与2NN工作机制
5>DataNode工作机制
6>数据完整性
7>掉线时限参数
1>克隆104主机得到105主机
2>修改105的IP与主机名
3>在105上删除HDFS文件系统的文件(hadoop安装目录下data和logs)
4>在105上启动datanode与nodemanager即可
hdfs --daemon start datanode
yarn --daemon start nodemanager
5>如果数据不均衡,可以使用命令实现集群中数据的再平衡
start-balancer.sh
添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被退出。添加到黑名单的主机节点,不允许访问NameNode,会在数据迁移后退出。
白名单用于确定允许访问NameNode的DataNode节点,内容配置一般与workers文件内容一致。 黑名单用于在集群运行过程中退役DataNode节点。
说明:以后开发中在搭建集群时就考虑到黑白名单
1> 将105主机名写入黑名单
2>将黑名单进行分发,注意105机器上也要分发过去
3>刷新NameNode与ResourceManager
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes4>退役节点状态decommissioned时说明副本也已经拷贝完成
hdfs --daemon stop datanode
yarn --daemon stop nodemanager5>不允许白名单与黑名单中有重复的主机名,需要将已经下线的主机从白名单与workers中剔除,剔除后同步白名单与workers
6、数据均衡
DataNode可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本
1、关闭集群
2、配置hdfs-site.xml
3、分发配置
4、三台集群都删除data与logs
cd /opt/module/hadoop-3.1.3/;rm -rf data logs;ll
5、格式化并启动
机械硬盘,固态硬盘
date1:热数据放到data1目录下,这个目录可以指定在固态硬盘
date2:冷数据放到data2目录下,这个目录可以指定在机械硬盘开发中一般也不进行这样的处理。
序列化
核心框架原理(inputFormat shuffle outputFormat join etl )
压缩算法
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。
MapReduce程序:自己处理业务相关代码 + 自身的默认代码
1、易于编程
它简单的实现了一些接口,就可以完成一个分布式程序,2:良好的扩展性
当计算资源不足时,可以通过扩展增加机器来提升运算能力3:高容错性
任何一台机器挂掉,可以将任务转移到其它节点
4: 适合海量数据计算(TB/PB) 几千台服务器共同计算
1、不擅长实时计算 Mysql
2、不擅长流式计算 Sparkstreaming flink
3、不擅长DAG有向无环图计算 Spark
1>Map阶段并发MapTask完全并发运行,互不相干
2>Reduce阶段完全并发ReduceTask
3>如果业务逻辑非常复杂,需要多个MapReduce程序串行运行
(1)MrAppMaster:负责整个程序的过程调度及状态协调。
(2)MapTask:负责Map阶段的整个数据处理流程。
(3)ReduceTask:负责Reduce阶段的整个数据处理流程。
1>用户自定义的Mapper要继承自己的父类
2>Mapper的输入数据是KV对的形式(k指的是偏移量 v指的是一行的内容)
3>Mapper中的业务逻辑写在map()方法中
4>Mapper的输出数据是KV对的形式(KV类型可自定义)
5>map()方法(MapTask进程)对每一个
1>用户自定义的Reducer要继承自己的父类
2>Reducer的输入数据类型对应Mapper的输出数据类型,也是K,V
3>Reducer的业务逻辑卸载reduce()方法中
4>ReduceTask进程给对每一组相同k的
组调用一次reduce()方法
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReducer程序相关运行参数的job对象。
1 获取配置信息以及获取job对象
2 关联本Driver程序的jar
3 关联Mapper和Reducer的jar
4 设置Mapper输出的kv类型
5 设置最终输出kv类型
6 设置输入和输出路径
7 提交job
序列化:就是把内存中的对象转换成字节序列,以便于存储到磁盘和网络传输
反序列化:就是将接收到的字节序列或者是磁盘持久化存储的数据转换为内存中的对象
Java 序列化 重量级 传输慢 数据+各种校验信息/头/继承体系
Hadoop序列化 轻量级 传输快 简单校验 互操作性(支持多语言进行操作)
重写序列化方法 write()
重写反序列化方法 readFields()
(1)必须实现Writable接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
(3)重写序列化方法
(4)重写反序列化方法
MapTask (选择使用什么样的方式读取数据)
Input
InputFormat
Mapper
Shuffle
ReduceTask
Reducer
OutPutFormat
OutPut
1>MapTask的并行度决定Map阶段的任务处理并发度,进而影响到整个Job的处理速度。
2>MapTask并行度决定机制
3>数据块:Block是HDFS物理上把数据分成一块一块。数据块是HDFS存储数据单位。
4>数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。
1>一个job的map阶段并行度由客户端在提交Job时切片数决定
2>每一个split切片分配一个MapTask并行实例处理
3>默认情况下,切片大小=BlockSize
4>切片时不考虑数据集整体,而是逐个针对每一个文件单独切片