Hadoop是Google的集群系统的开源实现
-- Google集群系统:GFS(Google File System),MapReduce,BigTable
-- Hadoop主要由HDFS(Hadoop Distributed File System Hadoop分布式文件系统) MapReduce和HBase组成
-- Hadoop的初衷是为了解决Nutch的海量数据爬取和存储需要
-- Hadoop与2005年秋天作为Lucene的子项目Nutch的一部分正式引入Apache基金会
适用范围
-- 数据仓库和离线数据分析MPP Hadoop/HBase
-- 大规模在线实时应用(单行事务处理能满足的场景)(HBase)
NameNode(NN)
-- NameNode主要功能:接受客户端的读写服务
-- NameNode保存metadate信息包括
* 文件ownership和permission
* 文件包含哪些块
* Block保存在哪个DataNode(由DataNode启动时上报)
-- NameNode的metadate信息在启动后会加载到内存
* metadata存储到磁盘文件名为fsimage
* Block的位置信息不会保存到fsimage,会保存到内存中
* edits记录对metadata的操作日志
SecondaryNameNode(SNN)
-- 他不是NN的备份(但可以做备份),它的主要工作是帮助NN合并edits log,减少NN启动时间
-- SNN执行合并的时机
* 根据配置文件设计的时间间隔fs.checkpoint.period 默认3600秒
* 根据配置文件eidits log大小fs.checkpoint.size规定edits文件的最大值默认是64MB
* 合并流程
DataNode(DN)
-- 存储数据
-- 启动DN线程的时候会向NN汇报block信息
-- 通过向NN发送心跳保持与其联系(3秒一次),如果NN 10 分钟没有收到DN的心跳,则认为是lost,
并copy其上的block到其它的DN
Block的副本放置策略
-- 第一个副本:放置在上传文件的DN如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点
-- 第二个副本:放置在与第一个副本不同的机架上的及节点
-- 第三个副本:放置在同第二个副本相同机架上的节点
HDFS读流程
-- 文字描述
HDFS Client 通过DistributeFileSystem的open方法去访问NameNode,NameNode通过getBlockLocations
获取得到文件的位置信息。当HDFS Client获取得到block存在于哪一台服务器上的时候,就通过FSDataInputStream
从DataNode上读取block的数据,最后读完数据,FSDataInputStream会close,关闭IO流。
HDFS写流程
-- 文字描述
HDFS Client通过DsitributeFileSystem的create方法去告诉NameNode,该文件名是什么,文件大小是多少,拥有者
是谁。NameNode会根据文件的大小来计算,应该切多少个block。然后,NameNode就会将这些数据信息返回。
接着,HDFS Client就会调用FSDataOutuputStream的weite方法在其中的一个DataNode上写入一个block,然后,DataNode
会根据block的存放的策略,开启一个线程在其他的一个DataNode复制,完成写的操作之后,就会执行流的关闭。
最后DistributedFileSystem会调用complete函数,告诉NamaNode已经完成工作。
HDFS文件权限
-- 与Linux文件权限类似
r--read; w--write;x--execute,权限对于文件忽略,对于文件夹表示是否允许访问其内容。
-- 如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS中owner就是zhangsan。
-- HDFS的权限目的:阻止好人做错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁。
说白了,就是不做密码的认证。
安全模式
-- 当Hadoop处于安全模式的时候,是不能对文件进行操作的,包括读取数据也是不行的。只能够查看目录。 上传文件也不行。
-- 一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)
和一个空的编辑日志
-- 此刻NameNode运行在安全模式,即namenode的文件系统对于客服务器端来说是只读的。
(显示目录,显示文件内容等。写,删除,重命名都会失败)。
-- 在此阶段NameNode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是安全的,在一定的比例的数据块
被确定为安全后,再过若干时间,安全模式结束。
-- 当检测到副本数不足的数据块时,该快会被复制知道达到最小副本数,系统中数据块的位置并不是nanenode维护的,
而是以块列表形式存储在datanade中。
-- 一般启动Hadoop或者重启Hadoop的时候就会进入安全模式。不建议强行退出Hadoop的安全模式。