通用组件 - Hadoop Common
包含了其他hadoop模块要用到的库文件和工具
分布式文件系统 - Hadoop Distributed File System (HDFS)
运行于通用硬件上的分布式文件系统,高吞吐,高可靠
资源管理组件 - Hadoop YARN
于2012年引入的组件,用于管理集群中的计算资源并在这些资源上调度用户应用。
分布式计算框架 - Hadoop MapReduce
用于处理超大数据集计算的MapReduce编程模型的实现。
1、简述HDFS架构
NameNode
存储元数据,相应客户端的请求
元数据存储:fsimage+edits log
工作时,数据在哪儿?加载到内存
元数据存储哪些信息?
文件名称
大小
权限
时间
block信息
block位置信息(不存储)
通过dataNode的心跳上报上来,动态收集。
DataNode
存储block信息
存储模型:
block块按照字节线性切分
block块分散存储于DataNodes中
block副本数默认值3,对不同的文件可以设置不同的值
即使是同一个文件,也可以修改副本数的值
容错/解决并发读,承担计算
block的大小默认值:128MB,对于同一个文件,
该值可以指定,但不可以修改
可以追加,不可以修改,多次读取
一次只能一个写入者。
平衡器blancer,会在DataNode之间平衡block的存储负载
内部平衡器,在一个DataNode内部的不同硬盘之间,平衡存储负载
SecondaryNameNode
checkpoint(fsimage+edits log的合并)
合并步骤:
1、向NameNode请求切换新的edits log文件
2、通过HTTP GET请求从NameNode下载最新的fsimage+edits log
3、在SecondaryNameNode内部加载fsimage,edits log的执行,进行合并
4、将合并好的fsimage改名为fsimage.ckpt,推送给NameNode
5、NameNode修改fsimage.ckpt为fsimage
此时NameNode有一个新的合并后的fsimage+小的edits log
1、指定多长时间做一次checkpoint:3600s
2、可以指定在不足一小时的情况下,多少次事务做一次checkpoint:1000000
3、可以指定多长时间抽样一次事务数量:60s
Client
操作文件系统:文件的读/写/修改元数据
2、HDFS上传文件步骤
HDFS写文件的流程:
FSDataOutputStream对象数据将数据切分成小的数据包60kb,并写入到一个内部队列(“数据队列”)。DataStreamer会夺去其中内容,并请求namenode返回一个datanode列表来储存当前block副本。列表中的databode会形成管线,DataStreamer将数据包发送给管线中的第一个datanode,第一个datanode将接受到数据发送第二个datanode以此类推。DataNode中是先到第一个储存再流向 第二个在储存流向下一个然后返回到确认队列,DataNode之间流的很快基本是一秒全部同时完成。当管线中所有datanode写入完成,就从ack(确认队列)中删除数据包。
如果在数据写入期间datanode发生故障,则执行以下操作
a、关闭管线,把确认队列中的所有包都添加回数据队列的最前端,以保证故障节点下游的datanode不会漏掉任何一个数据包。
b、为存储在另一正常datanode的当前数据块指定一个新的标志,并将该标志传送给namenode,以便故障datanode在恢复后可以删除存储的部分数据块。
c、从管线中删除故障数据节点并且把余下的数据块写入管线中另外两个正常的datanode。namenode在检测到副本数量不足时,会在另一个节点上创建新的副本。
d、后续的数据块继续正常接受处理。
3、HDFS下载文件步骤
流程:
1.客户端通过FileSystem对象的open方法打开希望读取的文件,DistributedFileSystem对象通过RPC调用namenode,以确保文件起始位置。对于每个block,namenode返回存有该副本的datanode地址。这些datanode根据它们与客户端的距离来排序。如果客户端本身就是一个datanode,并保存有相应block一个副本,会从本地读取这个block数据。
2. DistributedFileSystem返回一个FSDataInputStream对象给客户端读取数据。该类封装了DFSInputStream对象,该对象管理着datanode和namenode的I/O,用于给客户端使用。
客户端对这个输入调用read方法,存储着文件起始几个block的datanode地址的DFSInputStream连接距离最近的datanode。通过对数据流反复调用read方法,可以将数据从datnaode传输到客户端。到达block的末端时,DFSInputSream关闭与该datanode的连接,然后寻找下一个block的最佳datanode。客户端只需要读取连续的流,并且对于客户端都是透明的。
3. 客户端从流中读取数据时,block是按照打开DFSInputStream与datanode新建连接的顺序读取的。它也会根据需要询问namenode来检索下一批数据块的datanode的位置。一旦客户端完成读取,就close掉FSDataInputStream的输入流。
4. 在读取数据的时候如果DFSInputStream在与datanode通信时遇到错误,会尝试从这个块的一个最近邻datanode读取数据。它也记住那个故障datanode,保证以后不会反复读取该节点上后续的block。DFSInputStream也会通过校验和确认从datanode发来的数据是否完整。如果发现有损坏的块,就在DFSInputStream试图从其他datanode读取其副本之前通知namenode。
这个设计一个重点是:namenode告知客户端每个block中最佳的datanode,并让客户端直接连到datanode检索数据。由于数据流分散在集群中的所有datanode,这样可以使HDFS可扩展到大量的并发客户端。同时,namenode只需要响应block位置的请求,无需响应数据请求,否则namenode会成为瓶颈
最近邻:
hadoop把网络看作是一棵树,两个节点间的距离是它们到最近共同祖先的距离和。通常可以设置等级:
- 同一个节点上的进程
- 同一机架上的不同节点
- 同一数据中心中不同机架上的节点
- 不同数据中心中的节点
4、HDFS中数据存储的模式
1、文件线性切割成块(Block)
2、Block分散存储在集群节点中
3、单一文件Block大小一致,文件与文件可以不一致
4、Block可以设置副本数,副本分散在不同节点中
a) 副本数不要超过节点数量
b) 承担计算
5、文件上传可以设置Block大小和副本数
6、已上传的文件Block副本数可以调整,大小不变
7、只支持一次写入多次读取,同一时刻只有一个写入者
8、可以append追加数据
5、详述搭建伪分布式的步骤
找到core-site.xml文件在/opt/hadoop-2.6.5/etc/hadoop/目录下
正常为空配置如下图:
上图指定了NameNode位置
将localhost改成计算机名称比如:node1
还是在这个目录下找hdfs-site.xml文件
如图:
在帮助页面core-site.xml 下找hadoop.yem.dir它的默认目录是/tmp/hadoop-${user.name}但是在tmp目录下的文件是不安全的所以需要更改一下目录
- vim core-site.xml 在文件中更改如图:
2.在hdfs-site.xml文件里配置secondary的值50090
上图指定了SecondaryNameNode的位置在文件slaves中把localhost该为node001
上图指定了DateNode的位置
然后执行hdfs namenode –format格式化
免密要登录:ssh –keygen –t dsa –P ’’ –f ~/ .ssh/id_dsa
生成ssh的密约以dsa这种格式 –P’’把密码设置为空 文件放在家目录下的id_dsa
cat id_dsa.pub >> authorized_keys把id_dsa授权可以免密要登录