架构师训练营第 12 周学习总结
12.1 大数据原理概述
大数据技术发展史
今天我们常说的大数据技术,其实起源于 Google 在 2004 年前后发表的三篇论文,也就是我们经常听到的大数据“三驾马车”,分别是分布式文件系统 GFS、大数据分布式计算框架 MapReduce 和 NoSQL 数据库系统 BigTable。
Hadoop
Hive
Yarn - 资源管理框架
Spark - 批处理计算,大数据离线计算
大数据流计算,大数据实时计算
NoSQL - HBase
大数据应用发展史
大数据应用的搜索引擎时代
大数据应用的数据仓库时代
大数据应用的数据挖掘时代
大数据应用的机器学习时代
大数据应用领域
医学影像智能识别
病历大数据智能诊疗
AI 外语老师
智能解题
舆情监控与分析
大数据风控
新零售
无人驾驶
12.2 分布式文件系统 HDFS
常用 RAID 技术
HDFS 系统架构
HDFS 设计目标
HDFS 以流式数据访问模式存储超大文件,运行于商用硬件集群上。
超大文件
流式数据访问
一次写入多次读取
商用硬件
不适合 HDFS 的场景
低延迟的数据访问
大量小文件
超过 NameNode 的处理能力
多用户随机写入修改文件
设计目标
假设:节点失效是常态
理想:
1. 任何一个节点失效,不影响 HDFS 服务
2. HDFS 可以自动完成副本的复制
文件
文件切分成块(默认大小 64M),以块为单位,每个块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认 3)
NameNode 是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表以及块所在的 DataNode 等等
DataNode 在本地文件系统存储文件块数据,以及块数据的校验和可以创建、删除、移动或重命名文件,当文件创建、写入和关闭之后不能修改文件内容。
HDFS 如何写文件?
HDFS 如何读文件?
节点失效是常态
DataNode 的磁盘挂了怎么办?
DataNode 正常服务
坏掉的磁盘上的数据尽快通知 NameNode
DataNode 所在机器挂了怎么办?
问:NameNode 怎么知道 DataNode 挂掉了?
答:Datanode 每 3 秒钟向 NameNode 发送心跳,如果 10 分钟 DataNode 没有向 NameNode 发送心跳,则 NameNode 认为该 DataNode 已经 dead, NameNode 将取出该 DataNode 上对应的 block,对其进行复制。
NameNode 挂了怎么办?
持久化元数据
操作日志(edit log)
记录文件创建,删除,修改文件属性等操作
Fsimage
包含完整的命名空间
File -> Block 的映射关系
文件的属性(ACL, quota, 修改时间等)
HDFS 一致性模型
文件创建以后,不保证在 NameNode 立即可见,即使文件刷新并存储,文件长度依然可能为 0;
当写入数据超过一个块后,新的 reader 可以看见第一个块,reader 不能看见当前正在写入的块;
HDFS 提供 sync() 方法强制缓存与数据节点同步,sync() 调用成功后,当前写入数据对所有 reader 可见且一致;
调用 sync() 会导致额外的开销.
Hadoop 文件系统
文件系统抽象(org.apache.hadoop)
JAVA 接口
通过 FileSystem API 读取数据
12.3 大数据计算框架 MapReduce - 编程模型
MapReduce:大规模数据处理
处理海量数据(>1TB)
上百上千 CPU 实现并行处理
简单地实现以上目的
移动计算比移动数据更划算
分而治之(Divide and Conquer)
WordCount 举例
MapReduce 的 WordCount
Mapper - map 函数
Reducer - reduce 函数
Combiner - 在 Map 端进行一次本地的 reduce 操作
MapResuce 过程
分区:每个 reduce 对应一个区
Shuffle
不同的 Map 输出,相同的 Key 会交给同一个 Reduce 去处理
12.4 大数据计算框架 MapReduce - 架构
适合 MapReduce 的计算类型
TopK
K-means
Bayes
SQL
不适合 MapReduce 的计算类型
Fibonacci
InputFormat
验证作业的输入的正确性
将输入文件切分成逻辑的 InputSplits,一个 InputSplit 将被分配给一个单独的 Mapper task
提供 RecordReader 的实现,这个 RecordReader 会从 InputSplit 中正确读出一条一条的K-V对供 Mapper 使用。
FileInputFormat
得到分片的最小值 minSize 和最大值 maxSize,可以通过设置 mapred.min.split.size 和 mapred.max.split.size 来设置;
对于每个输入文件,计算 max(minSize, min(maxSize, blockSize));
如果 minSize<=blockSize<=maxSize,则设为 blockSize。
分片信息<file,start,length,hosts>,通过 hosts 实现 map 本地性。
OutputFormat
OutputFormt 接口决定了在哪里以及怎样持久化作业结果。
默认的 OutputFormat 就是 TextOutputFormat,它是一种以行分隔,包含制表符界定的键值对的文本文件格式。
Partitioner
什么是 Partitioner
Mapreduce 通过 Partitioner 对 Key 进行分区,进而把数据按我们自己的需求来分发。
什么情况下使用 Partitioner
如果你需要 key 按照自己意愿分发,那么你需要这样的组件。
框架默认的 HashPartitioner
主要调度方法
单队列调度
特点:FIFO
优点:简单
缺点:资源利用率低
容量调度(Capacity Scheduler ,Hadoop-0.19.0 )
特点:
多队列,每个队列分配一定系统容量(Guaranteed Capacity)
空闲资源可以被动态分配给负载重的队列
支持作业优先级
作业选择:
选择队列:资源回收请求队列优先;最多自由空间队列优先。
选择作业:按提交时间、优先级排队;检查用户配额;检查内存。
优点:
支持多作业并行执行,提高资源利用率
动态调整资源分配,提高作业执行效率
缺点:
队列设置和队列选择无法自动进行,用户需要了解大量系统信息
JobTracker 内部实现
作业控制
作业抽象成三层:作业监控层(JIP),任务控制层(TIP),任务执行层。
任务可能会被尝试多次执行,每个任务实例被称作 Task Attempt(TA)
TA 成功,TIP 会标注该任务成功,所有 TIP 成功,JIP 成功
资源管理
根据 TaskTracker 状态信息进行任务分配
JobTracker 容错
JobTracker 失败,那么未完成 Job 失败;
通过 Job 日志,Job 可部分恢复。
TaskTracker 容错
超时
TaskTracker 10 分钟(mapred.tasktracker.expiry.interval)未汇报心跳,则将其从集群移除
灰名单,黑名单
TaskTracker 上部署性能监控脚本
如果性能表现太差,被 JobTacker 暂停调度
Task 容错
允许部分 Task 失败
允许失败的任务占比,默认 0,Mapred.max.map.failers.percent,mapred.max.reduce.failures.percent
Task 由 TIP 监控,失败任务多次尝试,慢任务启动备份任务
每次都是一个 TA(Task Attempt),最大允许尝试次数:mapred.map.max.attempts,mapred.reduce.max.attempts
Record 容错
跳过导致 Task 失败的坏记录
K,V 超大,导致 OOM,配置最大长度,超出截断 mapred.linercordreader.maxlength。
异常数据引发程序 bug,task 重试几次后,自动进入 skip mode,跳过导致失败的记录,mapred.skip.attempts.to.start.skipping 。
12.5 大数据集群资源管理系统 Yarn
YARN:Yet Another Resource Negotiator
下一代 MapReduce 框架的名称。
不再是一个传统的 MapReduce 框架,甚至与 MapReduce 无关。
一个通用的运行时框架,用户可以编写自己的计算框架,在该运行环境中运行。
Yarn 架构
Yarn 的工作流程(MapReduce 为例)
我们向 Yarn 提交应用程序,包括 MapReduce ApplicationMaster、我们的 MapReduce 程序,以及 MapReduce Application 启动命令。
ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一个容器,并将 MapReduce ApplicationMaster 分发到这个容器上面,并在容器里面启动 MapReduce ApplicationMaster。
MapReduce ApplicationMaster 启动后立即向 ResourceManager 进程注册,并为自己的应用程序申请容器资源。
MapReduce ApplicationMaster 申请到需要的容器后,立即和相应的 NodeManager 进程通信,将用户 MapReduce 程序分发到 NodeManager 进程所在服务器,并在容器中运行,运行的就是 Map 或者 Reduce 任务。
Map 或者 Reduce 任务在运行期和 MapReduce ApplicationMaster 通信,汇报自己的运行状态,如果运行结束,MapReduce ApplicationMaster 向 ResourceManager 进程注销并释放所有的容器资源。
12.6 大数据仓库 Hive
Hive 架构
Hive 和 Hadoop
Hive 编译器
Parser - 把 SQL 转换为抽象语法树(AST)
SemanOc Analyzer - 把抽象语法树转化为查询块(QB)
Logical Plan Generator - 把 QB 转化为逻辑执行计划(Logical Plan)
Logical OpOmizer - 重写执行计划,带入更多的优化后的计划。
Physical Plan Generator - 将逻辑执行计划转化为物理执行计划(M/R jobs)
Physical OpOmizer - 适应性 Join 策略调整
Hive Metastore
Single User Mode (Default)
Multi User Mode
评论