第十二周 架构方法学习总结 —— 数据应用
HDFS
HDFS 事实上在前面的课程里已经学过了,当时也写了很多,这里就简单过一些。先看一下 HDFS 的整体架构,之后我们再拆解:
HDFS架构
Block
Block 块是 HDFS 基本存储单元,Hadoop 1.X 版本是 64MB,2.X 版本是 128MB。每个 Block 都有一个 id,相同的副本保证 id 一致。由于 block 的存储机制,HDFS 比较适合大文件、快速备份。
NameNode
NameNode 是 HDFS 的核心内容:用于管理 DataNode,记录元数据 Meta。在 1.x 中,最多设置 1 个;在 2.x 以上,最多可以设置 2 个。如果设置两个,不能设置 SecondaryNameNode。
元数据
管理 DataNode 流程
复本策略
超过三个复本,随机放。
机架感知策略
重要的安全策略,防止同属一个物理机架的服务器宕机,HDFS 会主动分机架存储。这里机架并不是物理结构,而是逻辑结构。通俗一点说,就是一个简单的 ip=>name 的映射。实际使用中,一般会将一个物理机架上的所有节点,放到一个逻辑机架上。
Secondary NameNode
Secondary NameNode 与 NameNode 并不是严格意义上的主从关系。仅用来辅助 NameNode 进行元数据合并,不能做到和 NameNode 实时热备。对集群影响不大,能起到一定的备份作用。在 Hadoop2.0 以上,为了 NameNode 的热备,舍弃了 Secondary NameNode。
DataNode
DataNode 用于存储数据,主要以 block 的形式存储。DataNode 会通过心跳机制发送给 NameNode 信息。
读流程
写流程
NameNode 收到请求后,检查户是否权限和是否有同名文件。通过文件信息,计算数据块,分配块存储地址。将地址放入队列返回给客户端
客户端收到地址后,将数据进行封包,写入对应 DataNode 节点上。当写完所有的 block 都放置成功后,客户端通知 NameNode 关流,同时将该文件更改为不可再写。
删流程
客户端发起请求到 NameNode,NameNode 收到请求后,校验文件存在与否和客户端是否有删除权限。将操作记录到 edits_inprogess 中
删除内存中记录,并返回 ACK 信号,表示删除成功。等待 DataNode 的心跳,如果该 DataNode 存在要删除的数据,则对该节点发送指令进行删除。
MapReduce
MapReduce 是一种计算模型,该模型可以将大型数据处理任务分解成很多单个的、可以在服务器集群中并行执行的任务,而这些任务的计算结果可以合并在一起来计算最终的结果。
MapReduce架构
我们来看看 MapReduce 是怎么做的:
用户程序首先将文本切割为 16M~64M 大小的数据分片(可由用户设置),然后它会在计算机集群上启动该程序的许多副本。
用户启动的所有副本中有一个副本叫 master,剩余的副本叫 worker。 master 负责将 worker 分配给 Map 或是 Reduce 任务。
Map worker 会读取相关的数据分片(第 1 步提到了),以 key-value 对的形式作为 Map 函数的入参传入并计算。
Map 函数运行结束后,又以新的 key-value 对形式存储到本地磁盘中。
接着,Reduce worker 得到 master 的通知,并远程读取步骤 4 中存入的数据。Reduce worker 会对这些数据再按 key 分组,相同 key 值的数据被分配给相同的 Reduce worker 节点,这个步骤叫做 shuffle。
再之后,Reduce worker 开始调用 Reduce 函数,并迭代处理相同 key 值的数据。Reduce 函数的输出最终写入到特定的文件里。
当所有 Map 和 Reduce 任务执行完成后,master 唤醒用户程序,并返回结果。
Yarn
Yarn 就是个多了资源管理框架的 Hadoop 架构——Yet Another Resource Negotiator。
Yarn 架构
Container
ResourceManager
ApplicationMaster
NodeManager
提交一个 Application 到 Yarn 的流程大致如下:
Client 向 Yarn 提交 Application,这里我们假设是一个 MapReduce 作业。
ResourceManager 向 NodeManager 通信,为该 Application 分配第一个容器。并在这个容器中运行这个应用程序对应的 ApplicationMaster。
ApplicationMaster 启动以后,对 作业(也就是 Application) 进行拆分,拆分 task 出来,这些 task 可以运行在一个或多个容器中。然后向 ResourceManager 申请要运行程序的容器,并定时向 ResourceManager 发送心跳。
申请到容器后,ApplicationMaster 会去和容器对应的 NodeManager 通信,而后将作业分发到对应的 NodeManager 中的容器去运行,这里会将拆分后的 MapReduce 进行分发,对应容器中运行的可能是 Map 任务,也可能是 Reduce 任务。
容器中运行的任务会向 ApplicationMaster 发送心跳,汇报自身情况。当程序运行完成后, ApplicationMaster 再向 ResourceManager 注销并释放容器资源。
Hive
Hive 是基于 Hadoop 的一个数据仓库工具,用于计算基于 Hadoop 实现的一个特别的计算模型 MapReduce。它可以将计算任务分割成多个处理单元,然后分散到一群家用或服务器级别的硬件机器上,降低成本并提高水平扩展性。Hive 的数据存储在 Hadoop 一个分布式文件系统上,即 HDFS。
Hive架构
Hive v.s. RDBMS
Hive 作为数仓应用工具,对比 RDBMS 有许多“不能”:
不能实时响应,Hive 查询延时大;
没有事务机制;
不能有行级别的变更操作(包括插入、更新、删除)。
没有定长的 varchar 这种类型,字符串都是 string;
读时模式,它在保存表数据时不会对数据进行校验,而是在读数据时校验不符合格式的数据设置为 NULL。
Hive 工作原理
如上图所示,Hive 的工作原理就是一个查询引擎,和普通的 SQL 执行原理大致相同,分为如下几步:
词法分析: 使用 antlr 将 SQL 语句解析成抽象语法树(AST)
语义分析: 从 Megastore 获取模式信息,验证 SQL 语句中队表名,列名,以及数据类型的检查和隐式转换,以及 Hive 提供的函数和用户自定义的函数(UDF/UAF)
逻辑计划生成,生成逻辑计划——算子树
计划优化:对算子树进行优化,包括列剪枝,分区剪枝,谓词下推等
物理计划生成:将逻辑计划生成包含由 MapReduce 任务组成的 DAG 的物理计划
计划执行:将 DAG 发送到 Hadoop 集群进行执行
最后返回查询结果
评论