Hadoop思维导图
2019-05-16 10:00:45 4 举报
AI智能生成
高质量!Hadoop大数据脑图详细内容,整合多种教学视频以及书籍资料。
作者其他创作
大纲/内容
大数据技术生态体系
数据来源层
数据传输层
数据存储层
资源管理层
数据计算层
数据计算层
任务调度层
业务层
数据库(结构化数据)
Sqoop数据传输
HDFS
YARN资源管理
MapReduce(离线)
Hive数据查询
Oozie任务调度
Mahout数据挖掘
Azkaban任务调度
SparkCore内存计算(离线)
Spark Milk数据挖掘
SparkR数据分析
SparkSql数据查询
文件日志(半结构化数据)
Flume日志收集
HDFS
HBase
视频ppt(非结构化数据)
Kafka消息队列
Kafka(能存部分数据)
YARN资源管理
Storm实时计算
SparkStreaming实时计算
基本问题
Hadoop1.x和2.x 3.x区别
Hadoop1.x
Common
HDFS
数据存储
MapReduce
计算——资源调度
Hadoop2.x
Common
具有SPOF的功能,因此只要Namenode失败,它就会自动恢复。
HDFS
数据存储
MapReduce
计算
Yarn
资源调度
Hadoop3.x
Common
支持多个NameNode,DataNode内部添加了负载均衡
HDFS
数据存储
EC技术
Erasure Encoding 简称EC,是Hadoop3给HDFS拓展的一种新特性,用来解决存储空间文件。EC技术既可以防止数据丢失,又能解决HDFS存储空间翻倍的问题
MapReduce
计算
Yarn
改进时间线服务v2并提高时间线服务的可扩展性和可靠性
HDFS
特性优点
可靠性
创建多个副本,放在不同的计算节点中
加快读取速度
可以选择有数据且相对空闲的机器来读取
适合大数据处理
缺点
时间长
无法做到低延迟数据访问和低延迟高吞吐
小文件占大内存
小文件存取占用namenode大量内存,寻道时间超过读取时间
hdfs小文件解决方案
Hadoop Archive(HAR)
它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时,仍然允许对文件进行透明的访问。
Sequence file
sequence file由一系列的二进制key/value组成,如果为key小文件名,value为文件内容,则可以将大批小文件合并成一个大文件。
CombineFileInputFormat
CombineFileInputFormat是一种新的inputformat,用于将多个文件合并成一个单独的split,另外,它会考虑数据的存储位置。
无法并发写入
文件随机修改一个文件只能有一个写者
仅支持Append
架构模型
Name Node
存储元数据
元数据保存在内存中一份保存在磁盘一份,在启动的时候回加载到内存,工作中都是在内存中读取数据的。
保存文件,block,datanode之间的映射关系
Data Node
保存文件内容在磁盘
HdfsClient
与NameNode交互元数据信息
与DataNode交互文件Block数据
Secondary Data Node
用来监控HDFS状态和辅助后台程序,每隔一段时间获取HDFS元数据的快照
节点关系
一个NameNode与多个DataNode
带来的问题
数据复制冗余
故障检测
心跳包
检测心跳来判断节点是否存活
块报告
对block块进行报告
数据完整性检测
存数据
他在收到客户端的数据或复制其它datanode数据时执行这个操作,正在写数据的客户端将数据及其校验和发送到由一系列DataNode组成的管线,管线中最后一个datanode负责验证校验和。如果DataNode检测到错误,客户端变回收到一个ChecksumException异常,它是IOException异常的一个子类,后者应该以应用程序特定的方式来处理,譬如重试这个操作。
读数据
将他们与datanode中存储的校验和进行比较。每个datanode均持久保存有一个用于验证的校验和日志,所以它指导每个数据块的最后一次验证时间。客户端成功验证一个数据块后,会告诉这个datanode,datanode由此更新日志。保存这些统计信息对于检测损坏的磁盘很有价值。
如果检测到错误处理步骤
客户端向namenode报告已损坏的数据块,以及正在操作的这个DataNode
客户端抛出ChecksumException异常
namenode将这个数据块副本标记为已损坏,来防止后面再次将请求发送到这个节点
namenode安排这个块的副本复制到另一个datanode上,并将损坏的的数据块从所在的datanode节点上删除。
定期检测
每个datanode在后台会运行一个DataBlockScanner线程,定期验证存储在这个datanode上的所有数据块。
存储模型
文件线性切割成块block,每次记录偏移量offset
如果是中文如何控制切割保证中文单个汉字的完整性?
分块源码
方法
//调用该方法并赋值给splitSize,splitSize为最终每个分块的大小 long splitSize = computeSplitSize(goalSize, minSize, blockSize);
protected long computeSplitSize(long goalSize, long minSize, long blockSize){ //分片大小的决定性公式:max(最小分片大小,min(期望分片大小,块的大小))
return Math.max(minSize, Math.min(goalSize, blockSize)); }
return Math.max(minSize, Math.min(goalSize, blockSize)); }
首先在goalSize(期望每个Mapper处理的数据量)和HDFS的block size中取较小的,然后与mapred.min.split.size相比取较大的。即为最终分块大小
参数
goalSize
是输入总大小与提示Map task数量的比值,即期望每个Mapper处理多少的数据,仅仅是期望,具体处理的数据数由方法computeSplitSize决定。
long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
totalSize:是整个Map-Reduce job所有输入的总大小。
numSplits:来自job.getNumMapTasks(),即在job启动时用org.apache.hadoop.mapred.JobConf.setNumMapTasks(int n)设置的值,给M-R框架的Map数量的提示。
minSize
默认为1,可由子类复写函数protected void setMinSplitSize(long minSplitSize) 重新设置。一般情况下,都为1,特殊情况除外。
blockSize
HDFS的块大小,默认为64M,一般大的HDFS都设置成128M。
设置块大小的时候需要考虑哪些问题?
六个要点
减少硬盘寻道时间(disk seek time)
假如数据块设置过少,那需要读取的数据块就比较多,由于数据块在硬盘上非连续存储,普通硬盘因为需要移动磁头,所以随机寻址较慢,读越多的数据块就增大了总的硬盘寻道时间。当硬盘寻道时间比io时间还要长的多时,那么硬盘寻道时间就成了系统的一个瓶颈。合适的块大小有助于减少硬盘寻道时间,提高系统吞吐量。
减少Namenode内存消耗
对于HDFS,他只有一个Namenode节点,他的内存相对于Datanode来说,是极其有限的。然而,namenode需要在其内存FSImage文件中中记录在Datanode中的数据块信息,假如数据块大小设置过少,而需要维护的数据块信息就会过多,那Namenode的内存可能就会伤不起了。
Map崩溃问题
系统需要重新启动,启动过程需要重新加载数据,数据块越大,数据加载时间越长,系统恢复过程越长。
监管时间问题
主节点监管其他节点的情况,每个节点会周期性的把完成的工作和状态的更新报告回来。如果一个节点保持沉默超过一个预设的时间间隔,主节点记录下这个节点状态为死亡,并把分配给这个节点的数据发到别的节点。当数据块小的时候,方便计算预设时长,如果块过大,时长会无法预测,出现全部死机现象
问题分解问题
数据量大小是问题解决的复杂度是成线性关系的。对于同个算法,处理的数据量越大,它的时间复杂度也就越大。块的大小太大的话,一个map任务处理一个块,那任务数就变少了,作业运行速度也就变慢了。
约束Map输出
在Map Reduce框架里,Map之后的数据是要经过排序才执行Reduce操作的。想想归并排序算法的思想,对小文件进行排序,然后将小文件归并成大文件的思想
block分块分散在集群节点中
block可以设置副本数,副本无需分散在节点中
副本数不要超过节点数
单一文件block大小一致
已上传的文件可以调整副本数,但不可修改block大小
每个blokc默认大小127MB,最小1MB
只支持一次写入多次读取,同一时刻只有一个写入者
可以append追加数据
YARN
特性优点
是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
基本架构
三者关系
对于所有的applications,RM拥有绝对的控制权和对资源的分配权,而每个AM则会和RM协商资源,同时和NodeManager通信来执行和监控task
ResourceManager(RM)
负责所有资源的监控,分配和协调,是一个全局的资源管理系统
NodeManager以心跳的方式向Resourcemanager汇报资源使用情况。RM只接受NM的资源汇报信息,对于具体的资源处理则交给NM自己处理。
YARN Scheduler 根据 application 的请求为其分配资源,不负责 application job 的监控、追踪、运行状态反馈、启动等工作。
NodeManager(Nm)
负责每一个节点的维护。
NodeManager 是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控。YARN 集群每个节点都运行一个NodeManager。
NodeManager 定时向 ResourceManager 汇报本节点资源(CPU、内存)的使用情况和Container 的运行状态。当 ResourceManager 宕机时 NodeManager 自动连接 RM 备用节点。
NodeManager 接收并处理来自 ApplicationMaster 的 Container 启动、停止等各种请求。
ApplicationMaster(AM)
负责每一个具体应用程序的调度和协调
用户提交的每个应用程序均包含一个ApplicationMaster,它可以运行在Resourcemanager以外的机器上。
负责与RM协商以获取资源(用Container表示)
Container是Yarn中的资源抽象,它封装了某节点上多维度资源,如内存,cpu,磁盘,网络等。
调度器
三者关系
对于所有的applications,RM拥有绝对的控制权和对资源的分配权,而每个AM则会和RM协商资源,同时和NodeManager通信来执行和监控task
FIFO Scheduler
把应用按提交顺序排成一个队列,资源先来先得。
不适用于共享集群,大应用可能会占用所有集群资源,会导致其它被阻塞。
Capacity Scheduler
会有专门的队列来运行小任务
但为小任务专门设置一个队列会预先占用一定的集群资源,会导致大任务执行时间会落后于使用FIFO调度器时的时间
允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力
为每个组织分配专门的队列,再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。
为每个组织分配专门的队列,再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。
队列内部可以垂直划分,这样组织内部多个成员可共享队列资源,采用FIFO策略
一个job可能使用不了整个队列的资源,可分配多个job,如果队列资源不够用,Capacity Scheduler仍可能分配额外的资源给这个队列,这就是弹性队列(queue elasticity)
Fair Scheduler
会为所运行的job动态的调整系统资源,一个任务所有资源,两个任务,各获取一半资源
但是第二个任务获取资源有一定的延迟,因为需要等待第一个任务释放占用的Container
资源最终在两个用户之间平等的共享
支持抢占(Preemption),为了使提交job的执行时间更具预测性(可以设置等待的超时时间),Fair调度器支持抢占。抢占就是允许调度器杀掉占用超过其应占份额资源队列的containers,这些containers资源便可被分配到应该享有这些份额资源的队列中。需要注意抢占会降低集群的执行效率,因为被终止的containers需要被重新执行。
运行流程
步骤7 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
在应用程序运行过程中,用户可随时通过RPC向
ApplicationMaster查询应用程序的当前运行状态。
步骤1 用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
步骤2 ResourceManager为该应用程序分配第一个
Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
步骤3 ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
步骤4 ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
步骤5 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。
步骤6 NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
步骤7 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
在应用程序运行过程中,用户可随时通过RPC向
ApplicationMaster查询应用程序的当前运行状态。
步骤8 应用程序运行完成后,ApplicationMaster向
ResourceManager注销并关闭自己。
ResourceManager注销并关闭自己。
MapReduce
Map
概念
并行处理输入数据
Reduce
概念
对Map数据进行汇总
每层样式例子
特性优点
子主题
子主题
子主题
子主题
子主题
子主题
子主题
子主题
子主题
Hive
Hive基本概念
定义
用于解决海量结构化日志的数据统计,可将结构化数据文件映射成一张表,并提供类SQL查询功能
数据存储在HDFS上
分析数据底层为MapReduce
执行程序运行在Yarn上
本质
将HQL转化成MapReduce程序来执行
执行基本过程
用户写sql
Hive有很多操作写好的模板(例如select,where等关键字),然后通过框架匹配出相应的MapReduce模板。
运行MapReduce程序, 生成相应的分析结果
Hive优缺点
优点
类SQL提高开发效率,免去写MapReduce
支持用户自定义函数UDF
缺点
延迟高
表达能力有限,数据挖掘方面不擅长
效率比较低,调优困难,粒度较粗
Hive架构原理
原理图
组件
Meta store
默认元数据存放数据库
derby
SQL Parser(解析器)
Physical Plan(编译器)
Query Optimizer(优化器)
Execution(执行器)
Hive与数据库比较
数据存储位置
Hive存在HDFS中
数据库将数据保存在块设备或本地文件系统
数据更新
Hive为数据仓库服务,读多写少,因此不建议修改,可以追加
数据库中数据经常要修改
索引
Hive加载数据中不对数据进行任何处理,无法建立索引,需要暴力扫描整个数据
数据库支持索引
执行
Hive通过MR执行的,其他的有自己的引擎
执行延迟
Hive无论大小数据延迟都高
可扩展性
数据规模
Hive数据类型
数据传输层
数据存储层
资源管理层
数据计算层
数据计算层
任务调度层
业务层
DDL数据定义
数据传输层
数据存储层
资源管理层
数据计算层
数据计算层
任务调度层
业务层
DML数据操作
数据传输层
数据存储层
资源管理层
数据计算层
数据计算层
任务调度层
业务层
查询
数据传输层
数据存储层
资源管理层
数据计算层
数据计算层
任务调度层
业务层
函数
数据传输层
数据存储层
资源管理层
数据计算层
数据计算层
任务调度层
业务层
压缩和存储
数据传输层
数据存储层
资源管理层
数据计算层
数据计算层
任务调度层
业务层
企业级优化
数据传输层
数据存储层
资源管理层
数据计算层
数据计算层
任务调度层
业务层
常见问题
数据传输层
数据存储层
资源管理层
数据计算层
数据计算层
任务调度层
业务层
收藏
收藏
0 条评论
下一页