架构师训练营十二周 - 总结

本周讲了大数据的主题,主要内容有
一、大数据的发展史
二、大数据组成
一、大数据的发展史
1. 大数据技术发展史
大数据起源于Google在2004年前后发表的三篇论文,也即经常听到的"三驾马车",分别是分布式文件系统GFS,大数据分布式计算框架MapReduce和NoSQL数据库系统BigTable。
现在我们熟知的Hadoop已经是大数据的代名词,Hadoop包含HDFS,MapReduce。
1) 2003年,Google publishes GFS paper
2) 2004年,Google publishes MapReduce paper
3) 2005年,Nutch rewritten to use MapReduce
4) 2006年,Hadoop factored out of Nutch
5) 2008年,Hadoop becomes a top-level Apache project
6) 2008年,Hadoop Wins TeraSort benchmark(209 secs)
大数据整体结构图如下

2. 大数据应用发展史
1) 大数据应用的搜索引擎时代
Google存储了万亿规模的网页,需要存储在数万块磁盘上,由数千台服务器提供,通过GFS统一管理。对这些文件进行词频统计,然后根据PageRank算法计算网页排名。对数万块磁盘进行计算处理,Google开发了MapReduce计算框架。
2) 大数据应用的数据仓库时代
系统运行日志,应用采集数据,数据库数据放到Hadoop中,使用Hive统计分析。数据仓库中存储的数据量级远远大于数据库中的。
3) 大数据应用的数据挖掘时代
基于商品与商品、人与人之间的共性, 推荐商品和服务给相似用户。给用户打标签,标签越多,越能完整描绘一个人。除了商品销售还可以用于人际关系挖掘。
4) 大数据应用的机器学习时代
发现数据规律,预测未来发生的事。
3. 大数据应用领域
1) 医学影像智能识别
识别出图像中异常病灶位置。
2) 病历大数据智能诊疗
对病历处理、分析、统计、挖掘,可以构成一个病历知识库,可以分享给更多人,构成一个智能辅助诊疗系统
3) AI外语老师
基于语音识别和语音合成技术的成熟,将学习的知识点设计进聊天的过程中,就可以实现一个简单的AI外语老师
4) 智能解题
三种层次智能解题
通过大量题库找到答案
通过图像识别与自然语言处理,进行相似性匹配,更改试题的部分数字、文字表述,但是不影响实质性解答思路
利用神经网络机器学习技术,将试题的自然语言描述转化成形式语言,然后分析知识点和解题策略,进行自动推导,从而完成实质性的解题。
5) 舆情监控与分析
实时爬取各个社交新媒体上的各种用户内容和媒体信息,然后通过自然语言处理,就可以进行情感分析,热点时间追踪等。
6) 大数据风控
金融借贷中,根据历史数据,计算用户特征和风险指数的曲线。当新用户借款时,计算出风险指数,进而自动给出该用户的借款策略。
7) 新零售
大数据流计算与机器学习结合,达到顾客无需排队买单,拿到东西可以直接走。
8) 无人驾驶
训练出自动驾驶模型,需要大量数据。汽车驾驶的里程与数据量有线性关系,所以追逐训练量公里数。
二、大数据组成
1. HDFS
hdfs架构图

1)hdfs两种角色
NameNode管理角色
存储文件元信息
DataNode存储角色
以block为存储单元,block默认为64M
2)hdfs设计目标
流式数据访问模式存储超大文件,运行于商用硬件集群上
3)不适用hdfs的场景
小文件
低延迟的数据访问
多用户随机写入修改文件
4)hdfs高可用性
数据以block为单位,采用多备份的方式,且尽量不放到同一台机架上
NameNode高可用,使用zk选举一个主节点,从节点同步主节点数据
DataNode因意外或主动下线后,NameNode会把原本位于DataNode上的数据块从
5)hdfs高性能
hdfs的高性能是读取高性能,写入时,非高性能
读取时,可同时读取多个block从多台服务器上,加快读取速度
写入时,服务器之间使用Pipeline的方式,非高性能
6)hdfs可扩展性
hdfs设计目标是随时应对扩容
新加入的DataNode,注册到NameNode,上报自己容量大小,所在机架(部署位置信息)
NameNode会把DataNode计入总体规划中,当遇到需要存储的任务,分配数据块写到DataNode中
DataNode周期性(一小时)上报自己所有块信息
DataNode每3秒一次心跳,心跳返回信息带有复制、删除数据块等信息,若10分钟没有收到DataNode的心跳,认为其不可用
集群运行过程中可以安全的加入和退出一些机器
7)hdfs写文件
Client向NameNode发起RPC请求
NameNode检查文件存在与否,以及请求者权限,不符合则Client抛出异常
Client在本地切分要上传文件为packets,形成“data queue”。请求NameNode分配Blocks,以及存储这些blocks的DataNodes列表,每个block会根据设置的replicas设置DataNodes个数
packets与blocks有对应表,多对一。packets以流的方式写入到最近的DataNode上,DataNode存储该packet之后以Data Pipeline的方式继续把该packet发送到下一个replica,直到最后一个DataNode
最后一个DataNode写完,返回一个ack packet,在pipeline里传递至客户端,客户端有个“ack queue”,收到packet,从“ack queue”移除
传输过程中,DataNode出现故障,当前pipeline关闭,出现故障的DataNode从replicas中移除,重新请求NameNode分配一个,保持replicas的数量
8)hdfs读文件
Client向NameNode发起RPC请求
NameNode视情况返回部分或全部blocks,每个block,都有完整的block拷贝DataNode地址
Client选取最近的DataNode读取block,若DataNode是client,则从本地读取
读取完当前block,完毕连接,并为读取下一个block选取最佳的DataNode
当读完列表的block后,且还没有读完文件,Client会继续向NameNode获取下一批的block列表
读取玩一个block会进行checksum验证,如果读取有问题,Client会向通知NameNode,然后从下一个拥有该block拷贝的DataNode继续读取
9)NameNode挂了怎么办
持久化元数据
操作日志(edit log)
记录文件创建、删除,修改文件属性等操作
Fsimage
包含完整的命名空间
File->Block的映射关系
文件的属性(ACL,quota,修改时间等)
2. MapReduce
1)是什么
MapReduce是一个计算框架,处理大规模分布式数据的处理。
在大数据中移动计算比移动数据更划算
当然移动的前提是,计算可移动,可以把对整个文件的计算,分解为对每个block的计算。
Map把任务分成计算分布到一个个hdfs文件的block中
Reduce对Map计算的结果进行汇总
2)有什么特点
Map和Reduce处理的结果都会写入Hdfs文件中
Map的处理结果经过shuffle,传递给Reduce
shuffle的作用是使相同的Reduce入参key到发往相同的Reduce进程中
3)编程特点
需要自己编写Map和Reduce函数,当需要多次MapReduce时,需要编写多个Map和Reduce函数
4)运行特点
多个MapReduce,需要等到前面的MapReduce对运行完毕,才会启动后续任务
5)MapReduce组成
JobClient
JobClient提供Job-Jar包,Jar包存储在HDFS中
JobClient提交Job到JobTracker
JobTracker
任务跟踪管理程序
JobScheduler
JobScheduler对收到的Job进行任务调度,会创建一个JobInprocess
JobInprocess
JobInprocess根据要处理文件的大小,创建与block数量有关系的TaskInprocess
TaskInprocess
TaskInprocess向block所在的DataNode发送task任务
TaskTracker
TaskRunner负责接收task,启动map进程或reduce进程
map进程会下载job-jar包,读取分片的数据块
reduce进程会输出计算结果数据
6)适合MapReduce的计算类型
TopK
K-means
Bayes
SQL
7)编程实现组成
InputFormat
验证输入作业的正确性,将作业分成逻辑的InputSplits,一个InputSplit将被分给一个单独的Mapper task,提供RecordReader实现,RecordReader正确读出一条一条的K-V对供Mapper使用
FileInputFormat
文件输入,通常一个block为一个InputSplit,文件以一条数据为一个Record
OutputFormat
默认为TextOutputFormat,输出结果是一种以行分割,包含制表符界定的键值对的文本文件格式
Partitioner
shuffle使用的就是partitioner,框架默认的是HashPartitioner
如果你需要key按照你的意愿分发,那么你需要自定义这个组件
8)主要调度方法
单队列调度
特点:FIFO
优点:简单
缺点:资源利用率低
容量调度(Capacity Scheduler)
特点:
多队列,每个队列分配一定系统容量(Guaranteed Capacity)
空闲资源可以被动态分配给负载重的队列
支持作业优先级
作业选择
选择队列:资源回收请求队列优先;最多自由空间队列优先
选择作业:按提交事件、优先级排队;检查用户配额;检查内存。
优点
支持多作业并行执行,提高资源利用率
动态调整资源分配,提高作业执行效率
缺点
队列设置和队列选择无法自动进行,用户需要了解大量系统信息
公平调度(Fair Scheduler)
目标
改善小作业的响应时间
确保生产性作业的服务水平
特点
将作业分组--形成作业池(based on a configurable attribute, such as username, unix group...)
给每个作业池分配最小共享资源(Minimum map slots,Minimum reduce slots)
将多余的资源平均分配给每个作业
作业选择
优先调度资源小于最小共享资源的作业
选择分配资源与所需资源差距最大的作业
优点
支持作业分类调度,使不同类型的作业获得不同的资源分配,提高服务质量
动态调整并行作业数量,充分利用资源
缺点
不考虑节点的实际负载状态,导致节点负载实际不均衡
9)容错
作业控制
作业抽象成三层:作业监控(JIP),任务控制层(TIP),任务执行层
任务可能会被尝试多次执行,每个任务实例被称作Task Attempt(TA)
TA成功,TIP会标注该任务成功,所有TIP成功,JIP成功
资源管理
根据TaskTracker状态信息进行任务分配
JobTracker容错
JobTracker失败,那么未完成Job失败
通过Job日志,Job可部分恢复
TaskTracker容错
超时。TaskTracker10分钟(mapred.tasktracker.expiry.interval)未汇报心跳,则将其从集群移除
灰名单、黑名单
TaskTracker上部署性能监控脚本
如果性能表现太差,被JobTracker暂停调度
Task容错
允许部分Task失败
允许失败的任务占比,默认0,mapred.max.map.failures.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.linerecordreader.maxlength
异常数据引发程序bug,task重试几次后,自动进入skip mode,跳过导致失败的记录,mapred.skip.attempts.to.start.skipping。
3. YARN
YRAN:Yet Another Resource Negotiator
一个通用的独立运行时资源调度框架,用户可以编写自己的计算框架,在该运行环境中运行
MapReduce资源调度和计算耦合在一起,想在集群中运行Storm,Spark,就无法统一使用集群中的资源
Yarn在Hadoop2时分离处理
MR2最基本的设计思想是将JobTracker的两个主要功能,即资源管理和作业管理分成两个独立的进程
在该解决方案中包含两个组件:全局的ResourceManger(RM)和与每个应用相关的ApplicationMaster(AM)
这里的应用指一个单独的MR作业或者DAG作业
1)Yarn架构

2)Yarn组成
资源管理器(Resource Manager)
调度器
调度器就是一个资源分配算法,根据应用程序提交的资源申请和当前服务器集群的资源状况进行资源分配。Yarn内置了几种资源调度算法,包括Fair Scheduler,Capacity Scheduler等,你也可以开发自己的资源调度算法供Yarn调用
Yarn进行资源分配的单位是容器(Container),每个容器包含了一定量的内存、CPU等计算资源,默认配置下,每个容器包含一个CPU核心。容器由NodeManager进程启动和管理,NodeManager进程会监控本节点上容器的运行状况并向ResourceManager进程汇报
应用程序管理器
应用程序管理器负责应用程序的提交、监控应用程序运行状态等。
应用程序启动后,需要在集群中运行一个ApplicationMaster,ApplicationMaster也要运行在集群里面
每个应用程序启动后,都会先启动自己的ApplicationMaster,由ApplicationMaster根据应用程序的资源需求进一步向ResourceManager进程申请容器资源,得到容器以后就会分发自己的应用程序代码到容器上启动,从而开始分布式计算
节点管理器(Node Manager)
两种主要进程
ResourceManager进程负责整个集群的资源调度管理,通常部署在独立的服务器上
NodeManager进程负责具体服务器上的资源和任务管理,在集群的每一台计算服务器上都会启动,基本上跟HDFS的DataNode进程一起出现
3)Yarn的工作流程(MapReduce为例)
客户端向Yarn提交应用程序,包括MapReduce ApplicationMaster,MapReduce程序,以及MapReduce Application启动命令
ResourceManager进程和NodeManager进程通信,根据集群资源,为用户程序分配第一个容器,并将MapReduce ApplicationMaster分发到这个容器上面,并启动ApplicationMaster
ApplicationMaster启动后,立即向ResourceManager进程注册,并为自己的应用程序申请资源
得到容器后,ApplicationMaster立即和NodeManger通信,将用户MapReduce程序分发到NodeManager进程所在服务器,并在容器中运行,运行的就是Map或者Reduce任务
Map、Reduce任务在运行期和ApplicationMaster通信,汇报运行状态,如果运行结束,ApplicationMaster向ResourceManager进程注销并释放所有的容器资源
4. Hive
1)Hive是什么
Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制
2)Hive的架构

Client
Driver
Compiler
Metastore
Hadoop
3)Hive执行流程
操作符(Operator)是Hive的最小处理单元
每个操作符处理代表HDFS操作或MR作业
编译器把Hive SQL 转换成一组操作符

4)Hive编译器工作流程
把SQL转换为抽象语法树(AST)
把抽象语法树转化为查询块(QB)
把QB转化为逻辑执行计划(Logical Plan)
重写执行计划,带入更多的优化后的计划
将逻辑执行计划转化为物理执行计划(M/R jobs)
适应性Join策略调整
5)Metastore
Single User Model(Default)

Multi User Model

Remoter Server

6)Join Optimizations
Map Joins
User specified small tables stored in hash tables on the mapper backed by jdbm
No reducer needed
评论