Hadoop 由 HDFS,MapReduce,HBase,Hive 和 ZooKeeper 等成员组成, 其中最基础最重要元素为底层用于存储集群中所有存储节点文件的文件系统 HDFS(Hadoop Distributed File System)来执行 MapReduce 程序的 MapReduce 引擎.
Pig 是一个基于 Hadoop 的大规模数据分析平台, Pig 为复杂的海量数据并行计算提供了一个简单的操作和编程接口
Hive 是基于 Hadoop 的一个工具, 提供完整的 SQL 查询, 可以将 sql 语句转换为 MapReduce 任务进行运行
ZooKeeper: 高效的, 可拓展的协调系统, 存储和协调关键共享状态;
HBase 是一个开源的, 基于列存储模型的分布式数据库;
HDFS 是一个分布式文件系统, 有着高容错性的特点, 适合那些超大数据集的应用程序;
MapReduce 是一种编程模型, 用于大规模数据集 (大于 1TB) 的并行运算.
下图是一个典型的 Hadoop 集群的部署结构:
接着给出 Hadoop 各组件依赖共存关系:
HDFS 是一个高度容错性的分布式文件系统, 可以被广泛的部署于廉价的 PC 上. 它以流式访问模式访问应用程序的数据, 这大大提高了整个系统的数据吞吐量, 因而非常适合用于具有超大数据集的应用程序中.
HDFS 的架构如图所示. HDFS 架构采用主从架构(master/slave). 一个典型的 HDFS 集群包含一个 NameNode 节点和多个 DataNode 节点. NameNode 节点负责整个 HDFS 文件系统中的文件的元数据的保管和管理, 集群中通常只有一台机器上运行 NameNode 实例, DataNode 节点保存文件中的数据, 集群中的机器分别运行一个 DataNode 实例. 在 HDFS 中, NameNode 节点被称为名称节点, DataNode 节点被称为数据节点. DataNode 节点通过心跳机制与 NameNode 节点进行定时的通信.
NameNode
NameNode 可以看作是分布式文件系统中的管理者, 存储文件系统的 meta-data, 主要负责管理文件系统的命名空间, 集群配置信息, 存储块的复制.
DataNode
DataNode 是文件存储的基本单元. 它存储文件块在本地文件系统中, 保存了文件块的 meta-data, 同时周期性的发送所有存在的文件块的报告给 NameNode.
Client
Client 就是需要获取分布式文件系统文件的应用程序.
以下来说明 HDFS 如何进行文件的读写操作:
文件写入
Client 向 NameNode 发起文件写入的请求
NameNode 根据文件大小和文件块配置情况, 返回给 Client 它所管理部分 DataNode 的信息.
Client 将文件划分为多个文件块, 根据 DataNode 的地址信息, 按顺序写入到每一个 DataNode 块中.
文件读取
Client 向 NameNode 发起文件读取的请求
NameNode 返回文件存储的 DataNode 的信息
Client 读取文件信息
MapReduce 是一种编程模型, 用于大规模数据集的并行运算. Map(映射)和 Reduce(化简), 采用分而治之思想, 先把任务分发到集群多个节点上, 并行计算, 然后再把计算结果合并, 从而得到最终计算结果. 多节点计算, 所涉及的任务调度, 负载均衡, 容错处理等, 都由 MapReduce 框架完成, 不需要编程人员关心这些内容.
下图是 MapReduce 的处理过程:
用户提交任务给 JobTracer,JobTracer 把对应的用户程序中的 Map 操作和 Reduce 操作映射至 TaskTracer 节点中; 输入模块负责把输入数据分成小数据块, 然后把它们传给 Map 节点; Map 节点得到每一个 key/value 对, 处理后产生一个或多个 key/value 对, 然后写入文件; Reduce 节点获取临时文件中的数据, 对带有相同 key 的数据进行迭代计算, 然后把终结果写入文件.
如果这样解释还是太抽象, 可以通过下面一个具体的处理过程来理解:(WordCount 实例)
Hadoop 的核心是 MapReduce, 而 MapReduce 的核心又在于 map 和 reduce 函数. 它们是交给用户实现的, 这两个函数定义了任务本身.
map 函数: 接受一个键值对(key-value pair)(例如上图中的 Splitting 结果), 产生一组中间键值对(例如上图中 Mapping 后的结果).Map/Reduce 框架会将 map 函数产生的中间键值对里键相同的值传递给一个 reduce 函数.
reduce 函数: 接受一个键, 以及相关的一组值(例如上图中 Shuffling 后的结果), 将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)(例如上图中 Reduce 后的结果)
但是, Map/Reduce 并不是万能的, 适用于 Map/Reduce 计算有先提条件:
待处理的数据集可以分解成许多小的数据集
每一个小数据集都可以完全并行地进行处理
若不满足以上两条中的任意一条, 则不适合适用 Map/Reduce 模式.
来源: http://bigdata.51cto.com/art/201810/584663.htm