Hadoop

HDFS的存储思想

  • 文件分块存储:将大文件分成块,块的大小设置为128mb,这些文件块可以分布到集群中不同的节点上,令多个节点对逻辑层面的大文件在物理层面进行分布式存储
  • 分块冗余存储:HDFS将大文件切分成块,每个小块同时进行冗余备份
  • 简化文件读写:一次写入,多次读取,可避免读写冲突

NameNode是如何备份的

  • edits、fsimage

  • Secondary NameNode来做定期的元数据的合并,让edits文件的部分合并到fsimage中去,保证内存比较小

  • HA高可用

文件的读写

block的拆分是在客户端中进行的

代码

hadoop fs || hdfs dfs

MapReduce(批处理)

MapReduce
  • Map(<k,v>键值对) -> Reduce中间有Shuffle阶段如何将相同的k值合并到同一个reduce就用哈希取模将k值进行数字编码然后模上个数

  • 每个block块会启动一个Map任务

  • 每个reduce任务会输出一个结果文件,存放在一个数据目录下

  • combine方法是一种“局部”的reduce操作,好处:不仅能降低Map和Reduce任务消耗的存储空间,还能够有利于降低Shuffle过程中传输的数据量

  • 关系表自然连接

    • map和reduce
    • 如果一张表非常大一张表非常小怎么处理:通过MapReduce提供的分布式缓存机制对较小的关系表进行广播来解决,可以避免Shuffle过程,为整个关系表的连接带来了性能的提升

Spark(批处理)

  • Spark基于RDD(弹性分布式数据集)进行计算
  • RDD是只读的,对原RDD进行修改之后要用新的RDD来保存
  • RDD的操作算子(创建操作算子、转换操作算子、行动操作算子)
Spark
  • 主从结构
Spark
  • Spark可分为Standalone和Yarn两种模式
  • Standalone集群管理器包含Master和Worker
  • Yarn集群管理器包含ResourceManager和NodeManager
  • 集群管理器负责集群资源管理,而驱动器负责作业管理
  • RDD之间存在依赖关系,窄依赖是一对一,宽依赖是多对一
  • RDD的持久化
    • 原因:因为计算过程会不断产生新的RDD,因此系统无法将所有的RDD均存储于内存中,内存是有限的,所以要持久化
    • 调用RDD的persist(Storagelevel)方法cache()方法实现持久化
  • 在Lineage较长尤其存在宽依赖时,需要在适当的时机设置数据检查点
    • 检查点机制将RDD写入可靠的外部分布式文件系统,例如HDFS。如果用户指定某些RDD需要设置检查点,则系统将在作业结束之后启动一个独立的作业进行写检查点操作
    • 检查点机制作用:防止因RDD Lineage过长而导致恢复过程中重计算的开销过大
  • 关系表自然连接中,Spark提供广播变量机制,将较小的关系表作为广播变量进行广播

Yarn(资源管理系统)

  • FIFO(先进先出调度器)

    • 调度策略:将所有任务放入一个队列,先进队列的先获得资源,排在后面的任务只有等待
    • 缺点:资源利用率低,无法交叉运行任务,一个应用独占所有资源而其他应用需要不断等待,以及灵活性差,如紧急任务无法插队,耗时长的任务拖慢耗时短的任务
  • capacity(容量调度器)

    • 调度策略:集群资源由多个队列分享,每个队列都要预设资源分配的比例,空闲资源优先分配给“实际资源/预算资源”比值最低的队列,队列内部采用FIFO调度策略
    • 特点:
      • 层次化的队列设计:子队列可使用父队列资源
      • 容量保证:每个队列都要预设资源占比,防止资源独占,
      • 弹性分配:空闲资源可以分配给任何队列,当多个队列争用时,会按比例进行平衡
      • 支持动态管理:可以动态调整队列的容量、权限等参数,也可动态增加、暂停队列
      • 访问控制:用户只能向自己的队列中提交任务,不能访问其他队列
      • 多租户:多用户共享集群资源
  • Fair(公平调度器)

    • 调度策略:多队列公平共享集群资源,通过平分的方式,动态分配资源,无需预先设定资源分配比例,队列内部可配置调度策略:FIFO、Fair(默认)
    • 特点:
      • 资源抢占:终止其他队列的任务,使其让出所占资源,然后将资源分配给占用资源量少于最小资源量限制的队列
      • 队列权重:当队列中有任务等待,并且集群中有空闲资源时,每个队列可以根据权重获得不同比例的空闲资源

Storm(流计算系统)

  • 数据模型:将流数据看作一个无界的、连续的元组序列
  • Storm使用拓扑抽象描述计算过程,拓扑是由SpoutBolt组成的网格
  • Bolt中可执行过滤、聚合、查询数据库等操作对元组进行转换,并将处理后的元组作为新的流数据发送给其他Bolt
  • Storm以Executor作为工作线程而在Task中仅实现任务代码
  • Storm的ACK机制用于确保消息处理的可靠性,保证每个消息都会被至少处理一次
  • 词频统计中的ShuffleGrouping和FieldsGrouping

Spark Streaming(实时流计算系统)

  • Spark Streaming采用微批处理方式,将连续的流数据进行切片(按时间间隔离散化),生成一系列小块数据
  • 增量式是避免重复计算
  • 数据检查点旨在加快执行器发生故障后的恢复过程
  • 元数据检查点旨在保证驱动器能够从故障中恢复到正常状态

Flink(批流融合系统)

  • Flink程序使用DataStream类表示无界数据,其为一个可以包含重复项的不可变数据集合
  • DataSetDataStream的区别
    • 相同:记录是不可变的
    • 不同:DataSet是有界的,而DataStream是无界
  • 在Standalone模式下,除客户端外,Flink系统仅具有JobManagerTaskManager
  • 在Standalone模式下,当用户使用客户端提交Flink应用程序时,可以选择Attached方式或者Detached方式
    • Attached提交方式下客户端与JobManager保持连接,可以获取关于应用程序执行的信息
    • Dettached提交方式下客户端与JobManager断开连接,无法获取关于应用程序执行的信息
  • Flink使用Chaining机制进行优化,将部分算子合并为一个”大“的算子,可以避免数据在不同TaskManager之间的非必要传输
  • 状态管理
    • 原因:在个别节点发生故障的情况下自定义于内存中的数据结构将会丢失,故障恢复需要将过去所有数据重新计算
    • 状态:状态可以看作操作算子的记忆能力,可以保留已处理记录的结果,并对后续记录的处理造成影响
    • map是一种典型的无状态算子,sum、window为有状态算子
  • 非迭代计算过程的容错
    • 异步屏障快照算法:通过在输入数据中注入屏障并异步地保存快照,达到和在同一时刻保存所有算子状态到检查点相同的目的

​ sb分布式Teacher(点名yqe),平时只有签到啥都没,一次作业没布置过,平时分给85。。期末第一次做题。期末画重点把整本书都画了但是只考了一部分 。(Yarn和Storm没考)最后一周期末周安排实验课,整整上了两天上午8点到下午5点,最开始布置了50个实验,因为太多,有同学去反应砍了一些,但还是很多,巨多。没法只能通宵!肝了两整天90多页word吧(唉,早知道不花这么多时间写这些傻逼报告了,准备期末不好嘛。。选择>>努力)这学期活的真窝囊啊,一直连着写了20多天的报告。刚刚好马原考前一天结束了大部分报告(最后剩了一门计网的大作业报告)。最后一天开始复习,看来马原居然还是复习得最久的!(仅一天罢了)。果不其然这学期炸了,没好好复习的结果,数据结构连基数排序是啥都不知道,直接送了15分~

​ 扯远了,我还记得一些些,来简单复盘一下:

​ 考的大致如下,全是一些画流程图的,一次没做过咋画()G

  • 每个大题好像都有两个小问, 第一问是八股文,背书就行,就例如请写出HDFS上传文件的过程,什么是宽依赖什么是窄依赖等
  • 每个大题的第二问都是类似画出流程图的,因为每个题都是个实际的问题,就例如请用MapReduce来处理、Spark来处理…等
  • 依稀记得我们考了HDFS文件的读取操作
  • MapReduce操作+分析画图
  • Spark操作+分析画图
  • Spark Streaming操作+分析画图
  • Flink操作+分析画图
  • 每个题好像20分?记不太清了反正(1)好像都是5分
  • 然后(1)我记得的考了HDFS读文件操作,简述什么是宽依赖什么是窄依赖,简述Chaining机制,Flink中的状态管理是什么。我记得的只有这些了