《从0开始学大数据》专栏笔记1

专栏作者也是会搞事情的那款技术人员,所以妥妥地又跟着男票入坑了,这次还带上了我做测试的舍友。
刚开始看着是偏科普类的,没想着记点笔记啥的,一不留神看到了十几篇,再回过头来。嗯,知道他说了啥,又说不清他说了啥(大龄混饭程序员……?凑字数 凑字数 凑字数 凑……)

1、这个专栏想说啥

如果未来是面向AI编程的,希望软件工程师不要把AI当作什么万能的东西。当机器学习结果出现问题的时候,我们既不要陷入某种不可知的“玄学”之中,也不要无谓的抱怨什么“人工智障”,而是应该积极参与到问题的讨论、分析和解决中去。

相信科学。(不要用开机重启来解决问题……我是鄙视的)

2、大数据技术的发展史和应用

不管是学习某门技术,还是讨论某个事情,最好的方式一定不是一头扎到具体的细节里,而是应该从时空的角度先了解它的来龙去脉,以及它为什么会演进成为现在的状态。当你深刻理解了这些前因后果之后,再去看现状,就会明朗很多,也能更直接地看到现状背后的本质。

大数据的主要应用场景包括数据分析、数据挖掘和机器学习。

批处理计算:像MapReduce、Spark这类计算框架处理的业务场景通常是针对历史数据进行计算,也称作大数据离线计算。
流计算:需要对实时产生的大数据进行即时计算,有Storm、Flink、Spark Streaming等计算框架,
NoSQL是用来解决大规模海量数据的存储与访问,有HBase、Cassandra等。
一个大数据平台可以有:

移动计算比移动数据更划算

大数据场景下,数据是庞大的,程序比数据小得多,将程序分发到数据所在的地方进行计算更划算。

3、大规模数据的存储

数据存储要解决的几个核心问题:

  • 数据存储容量:PB级如何存储
  • 数据读写速度
  • 数据可靠性
3.1 RAID

大数据技术出现之前的解决方案是RAID——独立磁盘冗余阵列:将多块普通磁盘组成一个阵列,共同对外提供服务。
RAID0:根据磁盘数量,将数据分成N分,并发写入N块磁盘。无备份,数据完整性无法保证。
RAID1:将一份数据同时写入两块磁盘。磁盘空间比较浪费。
RAID0 + RAID1 = RAID10:将所有磁盘平均分成两份(N*2),数据同时在两份磁盘写入,每一份磁盘中,使用RAID0技术并发读写。
RAID3:将数据分成N-1份,并发写入,剩余一份记录校验数据。用来写校验数据的磁盘会被频繁写入,容易损坏。
RAID5:与RAID3类似,但是校验数据是螺旋式写入所有磁盘。
RAID6:与RAID5类似,数据写入N-2块磁盘,螺旋式在另外两块磁盘中写入校验信息(使用不同的算法生成)。

实现更强计算能力和更大规模的存储的两种思路:

  • 垂直伸缩:升级计算机。RAID
  • 水平伸缩:使用分布式系统。HDFS
3.2 HDFS

思路:在一个大规模分布式服务器集群上,对数据分片后进行并行读写及冗余存储。
关键组件:

  • DataNode:负责文件数据的存储和读写操作
  • NameNode:负责分布式文件系统的元数据的管理。如文件路径名、数据块的ID以及存储位置等信息。

HDFS将文件数据分割成若干个数据块,每个DataNode存储一部分数据块。为保证数据的高可用,一般会将一个数据块复制多份,存储在不同的服务器上。
HDFS的一般访问模式是通过MapReduce程序在计算时读取,MapReduce对输入数据进行分片读取,通常一个分片就是一个数据块,每个数据块分配一个计算进程,这样可以同时启动多个进程对一个HDFS文件的多个数据块进行并发访问,从而实现数据的高速访问。
HDFS的架构图

HDFS的高可用性保证策略:

  • 数据存储故障容错:对存储在DataNode上的数据块,计算并存储校验和。在读取数据的时候重新计算校验和,校验不正确就抛出异常给应用程序,应用程序捕获异常后可以从其他DataNode上读取备份数据。
  • 磁盘故障容错:DataNode对本机的磁盘进行监控,发现某块磁盘损坏后,就将该块磁盘上存储的所有BlockID报告给NameNode,NameNode通知存储有这些数据的其他DataNode服务器,将对应的数据复制过来,保证数据块的备份数(默认为3)满足要求。
  • DataNode故障容错:DataNode会通过心跳和NameNode保持通信。出现心跳超时的情况下NameNode会认为DataNode已经宕机,查找宕机的DataNode上数据的备份,重新复制一份到其他服务器上,保证数据块的备份数。
  • NameNode故障容错:NameNode上记录的是HDFS文件分配表信息,如果NameNode故障,整个HDFS将不可用。NameNode采用主从热备的方式提供高可用服务。
    集群部署两台NameNode服务器,一台作为主服务器提供服务,一台作为从服务器进行热备,两台服务器通过ZooKeeper选举,争夺znode锁资源。DataNode会同时向两台NameNode服务器发送心跳,但是只有主NameNode才能返回控制信息。

常用的保证系统可用性的策略有:

  • 冗余备份:数据备份到多个服务器上,数据请求分发给任一数据中心。异地多活
  • 失效转移:在数据出现无法访问时,将数据请求转移到可用的数据中心。需要注意的是失效鉴定。
  • 降级限流:当前资源无法满足大量的数据请求时,可以拒绝部分请求,为限流。或者关闭部分功能,降低资源消耗,即降级

4、MapReduce

既是一个编程模型,又是一个计算框架:基于MapReduce编程模型进行编程开发,然后将程序通过MapReduce计算框架分发到Hadoop集群中运行。

4.1 两个阶段和两个关键问题

MapReduce将计算分成Map和Reduce两个阶段。

  • 在Map阶段为每个数据块分配一个Map计算任务
  • 将所有map输出的可以进行合并,相同key及其对应的Value发送给同一个Reduce任务处理。

有两个关键问题需要处理:
1、 如何为每个数据块分配一个Map计算任务:

  • 代码如何发送到数据块所在的服务器?
  • 发送后如何启动?
  • 启动后如何知道要计算的数据在哪里?
    2、处于不同服务器的map输出的<Key, Value>,如何把相同的Key聚合在一起发送给Reduce任务进行处理
4.2 作业启动和运行机制

MapReduce运行过程涉及的三类关键进程:

  • 大数据应用进程:程序入口,指定Map和Reduce类,输入输出文件路径等,并提交作业给Hadoop集群。
  • JobTracker进程:根据要处理的输入数据量,令TaskTracker启动相应数量的Map和Reduce进程任务,管理作业的生命周期和任务调度。
  • TaskTracker进程:负责启动和管理Map进程和Reduce进程。通常和HDFS的DataNode进程启动在同一个服务器。

运行流程如下:

4.3 数据合并与连接

shuffle:分布式计算需要将不同服务器上的相关数据合并到一起进行下一步计算。
map输出的<key,value> shuffle到那个Reduce进程是有Partitioner来实现的。

5、资源调度框架Yarn

背景:早期Hadoop中,MapReduce中将程序分发到大数据集群的服务器上的动作使通过TaskTracker和JobTracker的通信来完成。如果想在当前集群中运行其他计算任务,如Spark和Storm,就无法同意使用集群中的资源。
HDFS还是那个HDFS,要用大家一起用呗~

5.1 两个重要进程和主要组件

Yarn包含两个部分

  • 资源管理器ResourceManager:ResourceManager进程负责整个集群的资源调度管理,独立部署。
  • 节点管理器NodeManager:NodeManager进程负责具体服务器上的资源和任务管理。

两个主要组件:

  • 调度器:资源分配算法。根据应用程序提交的资源申请和当前服务器集群的资源状况进行资源分配。内置Fair Scheduler、Capacity Scheduler等。
  • 应用程序管理器:负责应用程序的提交、监控应用程序状态等。ApplicationMaster来向ResourceManager申请资源。

Yarn作业流程如下:

5.2 框架

框架在架构设计上的一个重要原则是“依赖倒转”。

依赖倒转是高层模块不能依赖于底层模块,应该共同依赖一个抽象,这个抽象由高层模块定义,由低层模块实现。

Yarn是框架,使用Yarn要实现Yarn的接口规范。

6、小技能Get

不要纠结在仅仅学习了一些新的技术和知识点上,要构建自己的知识和思维体系。

作者分享的一个学习新知识的5-20-2法则:

  • 用5分钟了解新知识的特点、应用场景】要解决的问题
  • 用20分钟理解它的主要设计原理、核心思想和思路
  • 花两个小时看关键的设计细节,尝试使用或者做一个demo

反思一下自己,学新的知识前会花很多时间纠结找合适的资料(英语渣不能看官方文档?……

7、Hive

Hive可以处理输入SQL语句,调用MapReduce计算框架来完成数据分析操作。
Hive处理过程如下:

8、Spark

针对数据进行编程,将大规模数据集合抽象成一个RDD(Resilient Distributed Datasets弹性数据集)对象,然后在RDD对象上进行各种计算,得到一个新的RDD。继续进行计算,直到得到最后的结果数据。
RDD上定义的函数分两种

  • 转换函数:函数的返回值还是RDD。
  • 执行函数:不再返回RDD

Spark也是对大数据进行分片计算,数据分片、任务调度都是以RDD为基本单位展开的,每个RDD分片都会分配到一个执行进程去处理。
RDD上的转换操作也分为两种:

  • 不会出现新的分片:map、filter等
  • 产生新的分片:reduceByKey

Spark不是按照代码编写顺序去生成RDD的。只有在产生新的RDD分片时,才会真的生成一个RDD,惰性加载。

8.1 Spark为什么比较快

Spark根据应用的复杂程度,分割成更多的计算阶段,这些计算阶段组成一个有向无环图DAG,Spark任务调度器根据DAG的依赖关系执行计算阶段。
Spark划分阶段的依据:当RDD之间的转换连接线呈现多对多交叉连接的时候,就会产生新的阶段。其实就是shuffle,Spark需要通过shuffle对数据进行重新组合,所以每次shuffle都会产生新的计算阶段。也就是说计算阶段划分的依据时shuffle,不是转换函数的类型。

窄依赖:不需要进行shuffle的依赖。
宽依赖:需要进行shuffle的依赖。

为啥比MapReduce快:

  • 根据应用对Reduce和Map阶段进行连接,形成计算阶段,有效减少对HDFS的访问,减少作业调度的执行次数。
  • Spark优先使用内存进行数据存储
8.2 Spark作业管理和执行过程

概念清理
负责Spark应用DAG生成和管理的组件是DAGScheduler,DAGScheduler根据程序代码生成DAG,然后将程序发布到分布式计算集群,按阶段的先后关系调度执行。
DAGScheduler在遇到shuffle的时候会生成一个计算阶段,在遇到action函数的时候,会生成一个作业。
RDD的计算逻辑主要是通过转换函数完成,RDD里面每个数据分片,Spark都会创建一个计算任务去处理,所以一个计算阶段会包含很多个计算任务。
所以,一个作业至少包含一个计算阶段,一个计算阶段有多个计算任务,

执行过程
这个是自己读完画的图

原图中还有个cache,应该是用来存储Driver的执行代码的。贴

9、HBase

HBase的设计目标主要是为了解决海量数据的分布式存储。主要思路就是按key进行分片(HRegion),应用程序通过HMaster查找分片,然后和分片所在的服务器HRegionServer通信,获取所需要的数据。
定调:NoSQL是关系数据库的补充,而不是替代。
HBase的伸缩性主要依赖于其可分裂的HRegion及可伸缩的分布式文件系统HDFS的实现。HBase中的数据是以HRegion为单位进行管理的。
每个HRegion中存储一段Key值区间[key1,key2)的数据,所有HRegion的信息(存储的key值区间、所在的HRegionServer地址、访问端口等)都记录在HMaster中。为保证HMaster的高可用,一般会启动多个HMaster,并通过ZooKeeper选举主服务器。

HBase使用列族的概念来保证可扩展的数据结构。列族实际上就是把字段的名称和值以key-value的方式存储在HBase中,所以在写入的受可以随意指定字段名称。
HBase使用LSM树来提高数据的写入速度,数据的写操作都在内存中进行。

10、流式计算

针对实时产生的大数据进行的计算。

Storm

早期使用消息队列来进行实时处理的过程

其中消息队列负责完成数据的流转,处理逻辑同时是消费者和生产者。
缺点:跟业务需求紧密联系,复用难。

Storm的处理过程

Storm也是主从架构,nimbus是Master,负责集群管理、任务分配等。supervisor是slave,启动worker进程,worker运行多个task。

Spark Streaming

利用Spark的分片和快速计算的特性,将实时传输进来的数据按照时间进行分段,把一段时间传输进来的数据合并在一起,当作一批数据,交给Spark处理。

Flink

可以进行批处理,也可以进行流处理,初始化不同的执行环境,构建对应的数据集即可。
进行流处理的过程是:将数据切分到一个10秒的时间窗口,对这个时间窗口里的一批数据进行统计汇总。

这个图我就看看,不说话。

11、ZooKeeper

分布式系统里多用主从结构,当slave对于master是否可用的判断出现差异时,就会引起冲突。
专业的叫法:脑裂——对不同主服务器做出不同的响应。

ZooKeeper就是用来解决多服务器状态一致性的问题。
用来解决该问题的比较复杂的算法是Paxos算法,基本思路如下:

这个图我也是看看不说话

ZooKeeper简化实现,使用的是ZAB的算法协议。
ZooKeeper系统的多态服务器存储相同的数据,每次数据更新都要所有服务器投票表决,因为ZooKeeper集群的性能会随着服务器数据量的增加而下降。

小结

可能真正开始记并没有多少可以写的(都是看过肉没吃过的啊),好歹吧,框图啥的都是自己按照理解画的。
听到作者讲自己曾经是个没有顿悟的小渣渣,同感啊,所以我去看《我的精神家园》了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值