Hadoop中的HDFS
HDFS的优点:
- 支持处理超大文件。
- 运行在廉价的服务器上
- 高容错性:hdfs上传的数据会自动保存多个副本,一个副本的丢失,hdfs副本冗余机制会自动复制其他机器上的副本。
- 流式文件写入:一次写入、多次读取的服务。文件一旦写入,就不能修改,只能增加,提高I/O性能。
HDFS的缺点:
- 不适合低延迟数据访问场景,实时性、低延迟的查询应用HBase会是更好。
- 不适合小文件。hdfs的元数据存放在namenode中,整个文件系统的文件数量会受限于namenode的内存大小,一旦小文件过多,会使namenode的压力倍增,影响集群性能,采用sequencefile等方式对小文件进行合并。
- 不适合并发写入
hdfs的设计目标
- 硬件故障:硬件故障时常态而不是异常,构成系统的组件数目是非常巨大的,每一个组件都可能失效,意味着总有一部分hdfs组件是不工作的,因此故障检测和自动快速恢复是hdfs最核心的架构设计目标。
- 大规模数据集。典型的hdfs文件大小一般都在gb至tb量级,hdfs应该提供更高的聚合数据宽带,能在一个及群里扩展到数百个节点。一个单一的hdfs实例应该能支撑数以万计的文件。
- 移动计算比移动数据更经济。
HDFS架构
采用了典型的master/slave架构设计,一个hdfs集群包含了一个活动namenode,它的职责是管理文件系统名字空间以及处理用户对数据的访问。还包含了一定数量的DataNode。一般是一个DataNode对应一个节点,每一个DataNode都管理并存储了整体数据的一部分。NameNode会执行类似于打开、关闭或者重命名文件夹或文件的操作,同时也负责确定数据块到具体DataNode的映射。DataNode负责处理文件系统客户端的读写请求,在NameNode的统一调度下进行数据块的创建删除和复制。
- 数据块(Block):hdfs最基本的存储单位是数据块,默认的块大小是128MB
- 元数据节点(NameNode):NameNode是管理者,一个hadoop集群中只有一个活动的NameNode节点,他负责管理文件系统的命名空间和控制用户的访问
- NameNode提供名称查询服务
- NameNode保存元数据信息。具体包括:文件包含哪些块,块保存在哪个DataNode。元数据信息在NameNode启动后会加载到内存
- 数据节点(DataNode):一般而言,DataNode是一个在hdfs实例中的单独机器上运行的进程。Hadoop集群包含大量的DataNode。DataNode是文件系统真正存储数据的地方,一个文件被拆分成多个块后,会将这些块存储在对应的DataNode上。客户端向NameNode发起请求,然后对应的DataNode上写入或者读出对应的数据块。
- 保存块:每个块对应一个元数据信息文件,这个文件主要描述块属于哪个文件、是文件中第几个块等信息。
- 启动DataNode进程的时候向NameNode汇报块信息
- 通过向NameNode发送心跳与其保持联系(3秒一次),如果NameNode在10分钟还没有收到DataNode的心跳,则认为该DataNode已经丢失,NameNode会将DataNode上的块复制到其他DataNode
- 从元数据节点(Secondary Namenode):周期性的将editlog文件中对hdfs的操作合并到一个FsImage文件中,然后清空editlog文件,防治日志文件过大。帮助NameNode将内存中的元数据信息持久化到硬盘上的。