Hadoop 基础知识(一)
Hadoop 作为大数据的主要支撑技术之一,被广泛使用。那何为hadoop了?
节选维基上的解释如下(其基本和官方定义差不多),
Apache Hadoop是一款支持数据密集型分布式应用程序并以Apache 2.0许可协议发布的开源软件框架。它支持在商品硬件构建的大型集群上运行的应用程序。Hadoop是根据谷歌公司发表的MapReduce和Google文件系统的论文自行实现而成。所有的Hadoop模块都有一个基本假设,即硬件故障是常见情况,应该由框架自动处理。
上文提及Hadoop主要是两个部分:MapReduce和Google文件系统,这里暂时不提MapReduce,重点谈文件系统,Hadoop有一个抽象的文件系统概念,使用最多的是HDFS,其他文件系统如Local、ftp、swift等均支持。所有支持的文件系统均在org.apache.hadoop.fs.FileSystem。普通的介绍Hadoop安装中,定义fs.defaultFS时,设置:hdfs://localhost 这里的hfds 就是表明使用的就是HDFS文件系统。具体内容可以参见:权威指南3.4 节。由于实际中,使用HDFS的最多,所以后续我们重点讨论的均为HDFS.
HDFS文件系统特点(旧的文档中也称之为DFS)
HDFS以流式数据访问模式来存储超大文件、运行于商用硬件集群上。
- 超大文件:指具有几百MB、几百GB大小的文件。
- 流式数据访问:一次写入、多次读取的模式。
- 商用硬件:HDFS认为银奖是不可靠的。
- 低时间延迟的数据访问:HDFS 是为高数据吞吐量应用优化,因此实时低延迟不适用于HDFS
- 大量的小文件:其可以存储大量的小文件(上百万,数十亿还是不行的)。
- 多用户写入、任意修改文件
HDFS 常规概念
【数据块】
HDFS使用块的概念来作为独立的存储单元,其默认大小为128MB(Hadoop 2.x以后),HDFS上的文件也被划分为块大小的多个分块,但与磁盘的块不同的是,如果HDFS中小于一个块大小的文件不会占据整个块的空间,而只占据实际的磁盘空间。
% hdfs fsck / -files -blocks 查看文件系统块的信息
【namenode 和datanode】
Hdfs集群主要分为2类节点,一类是namenode节点,一类是datanode节点。
NameNode 管理文件系统的命名空间,它维护着文件系统树及整颗树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。
Namenode记录了每个文件中各个块所在的数据节点信息,但它并不保存块的位置信息,因为这些信息会在系统启动时根据数据节点信息重建。(注意:保存的只有数据节点信息,主要是指持久化保存,不保存具体块的信息,只是说没有持久化保存而已,并不是不保存)。
DataNode:存储并检索数据块,并定期向namenode发送他们所存储的块的列表。
【Secondary NameNode节点】
从上面的Namenode和datanode节点的关系,可以很容易地发现namenode节点存在单点故障的问题。Secondary namenode节点的作用是定期将namespace镜像与操作日志文件合并,以防止操作日志文件变得过大。(注意:Secondary Namenode节点不是NameNode节点的备份节点,其主要的功能是确保数据不丢失,而不是HA,在基础知识二中将详细描述2者的区别)
Secondary NameNode不同于NameNode,它不接受或者记录任何实时的数据变化,但是,它会与NameNode进行通信,以便定期地保存HDFS元数据的 快照。由于NameNode是单点的,通过Secondary NameNode的快照功能,可以将NameNode的宕机时间和数据损失降低到最小。同时,如果NameNode发生问题,Secondary NameNode可以及时地作为备用NameNode使用。
【块缓存】
通常datanode 从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在datanode的内存中。
【HDFS的高可用】
关于HDFS的高可用,本质很复杂。这里只是简单介绍一下。首先,在hadoop2中,配置了一对活动-备用的namenode。当活动NameNode失效,备用NameNode就会接管它的任务,并开始服务于来自客户端的请求,不会有明显的中断。但要满足这个架构,根据权威指南描述要满足以下几点:
- namenode节点间通过NFS或者QJM实现共享存储
- datanode向2个namenode节点发送数据块报告
- 辅助namenode的角色被备用namenode所包含。
【故障切换与规避】
HDFS目前使用zookeeper来确保仅有一个活动namenode
HDFS 接口
- Java 接口: Hadoop接口是用java 写的,通过java api可以调用大部分hadoop文件系统的交互操作。
- Http: 有WebHDFS协议提供的HTTP REST API 提供给了其他语言的方式与HDFS进行交互
采用这种方式又有两种模式,一种是直接访问,一种是通过代理访问。
直接访问模式,主要是访问namenode和datanode内嵌的web服务器作为WebHDFS的端节点运行(由于dfs.webhdfs.enabled被设置为true,WebHDFS默认是启用状态)。
代理模式访问,代理模式主要是依靠一个或者多个独立代理服务器通过HTTP访问HDFS,由于代理服务是无状态的,因此可以运行在负载均衡服务器之后,也可以使用更严格的防火墙策略和带宽策略,更方便不同数据中心hadoop集群。其中HttpFS代理提供和WebHDFS相同的HTTP接口,使用httpfs.sh脚本,默认在端口14000端口启动代理。