hadoop基石HDFS

HDFS的设计理念是源于非常朴素的思想:

当数据集大小超过单台计算机的存储能力时,就有必要将其进行分区,并且存储到若干台单独的计算机上,而管理网络中跨多台计算机存储的文件系统称为分布式文件系统(distribute filesystem).

hadoop 具有一个抽象的文件系统的概念,HDFS只是其中的一个实现。

hadoop文件系统接口由Java 抽象类 org.apache.hadoop.fs.FileSystem类定义,该类同时还继承了org.apache.hadoop.conf并且实现了JAVA 的java.io.Closeable接口。


HDFS特点以及短板:

特点:

  • 适合存储超大文件:存储在HDFS 的文件大多在GB甚至是TB 级别。
  • 运行于廉价的硬件之上:HDFS 在设计的时候,就已经认为在汲取规模足够大的时候,节点故障并不是小概率事件,而可以认为是一种常态,例如,一个节点故障的概率如果是千分之一,那么当集群规模是1000台的时候,正常情况每天都会有节点故障。当节点发生故障是,能够继续运行并且不让用户察觉到明显的终端,所以,HDFS并不需要运行在高可靠且昂贵的服务器上,普通的PC server即可。
  • 流式数据访问:HDFS认为,一次写入,多次读取是最搞笑的访问模式。HDFS 的数据集作为Hadoop的分析对象,在数据集生成以后,会长时间在吃数据集上 进行各种分析。每次分析都将涉及该数据集的大部分数据甚至全部数据,因此,读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要~。

短板:

  • 实时数据访问弱:如果应用要求数据访问的时间在秒或者毫秒级别,那么,HDFS是做不到的,由于HDFS针对高书记吞吐做了优化,因而牺牲了读取数据的速度,队友相应时间是秒或者是毫秒的数据藩王,可以考虑使用HBase.
  • 大量的小文件:当hadoop启动的时候,NameNode会将所有元数据读到内存,以此构建目录树。一般来讲,一个HDFS上的 文件、目录和数据块的存储信息,大约在150字节左右,那么,可以推算出,如果NameNode的内存为16GB的话,大概只能存放480万个文件,对于一个超大规模的集群,这个数字很快就能达到。
  • 多用户写入,任意修改文件:HDFS中的文件只能有一个写入者,并且写数据操作总是在文件末。它不支持多个写入者,也不支持在数据写入之后,在文件的任意位置进行修改。事实上,如果不讲hdfs-site.xml中的dfs.support.append设置为true,HDFS也不支持对文件进行追加操作。

HDFS-架构:
  • 块:
每个磁盘都有默认的数据块大小,这是磁盘进行数据读写的最小单位,而文件系统也有文件块的概念。HDFS的块比一般的文件系统块大得多,默认为64M,并且可以随着实际的需要而变化,配置项目为hdfs.sitte.xml文件中的dfs.block.size项。与单一文件系统相似,HDFS上的文件也被划分为块大小的多个分块,它是HDFS存储处理的最小单元。
使用块的好处就:
(1)可以保存比存储节点单一磁盘大的文件。
(2)简化存储子系统:实现了元数据和数据的分块管理与存储。
(3)容错性高:将dfs.relication 设置为2,即配置每个HDFS的块在hadoop中保存的份数,值越高,冗余性越好,默认为3.
  • NameNode和SecondaryNameNode :
NameNode名字节点,是HDFS的主从架构的主角,是HDFS的大脑,他维护着整个文件系统的目录树,以及所以的文件目录,这些信息以2种文件存储在本地文件中,一种是命名空间镜像(file system image ,FSImage,文件系统镜像),即HDFS元数据的完整快照,每次NameNode启动时,默认会加载最新的命名空间镜像,另一种是命名空间镜像的编辑日志(edit log)

SecondaryNameNode,也被称之为第二名字节点,是用于定期合并命名空间镜像和命名空间镜像的编辑日志的辅助守护进程。每个HDFS集群都有一个SecondaryNameNode,在生产环境下,一般SecondaryNameNode也会单独运行在一台服务器上。

  • DataNode 
DataNode被称为数据节点,它是HDFS的主从架构的从角色的扮演者,它在NameNode的指导下完成I/O 任务。如前文所述,放在HDFS的文件都是有HDFS的尽快组成, 所以的块都存放于DataNode 节点。实际上,对于DataNode所在的几点来说,快就是一个普通的文件,我们可以去DataNode存放块的目录下观察(默认是$(dfs.data.dir)/c urrent),块的文件名为blk_blkID。

DataNode会不断地向NameNode报告。初始化时,每个DateNode将当前存储的块告知NameNode,在集群正常工作时,DateNode任然会不断的更新NameNode,为止提供本地修改的相关信息,同时接受来自NameNode的指令,创建,移动或者删除本地磁盘上的数据。
  • HDFS客户端
HDFS可混短时指用户和HDFS交互的手段,HDFS提供了非常多的客户端,包括命令行接口、Java API、thrift接口、c语言库、用户文件系统。

原文地址:https://www.cnblogs.com/DeepRunning/p/9205996.html