大数据秋招学习笔记1

Hadoop基础知识:
1)bigdata特点:4V,大量(volume),高速(velocity),多样性(variety),低价值密度(value)。

2)Hadoop是Apache基金会开发的分布式系统基础架构,主要用于解决海量数据的存储和分析计算问题,广义上通常指Hadoop生态圈。

3)Hadoop1.* 和 Hadoop2.* 的区别:Hadoop1.* 中的Mapreduce同时负责业务逻辑计算与资源的调度,Hadoop2.* 中增加了Yarn,Yarn负责资源调度,Mapreduce只负责运算。

4)Hadoop优势:4高,高可靠性(底层维护多个副本),高扩展性(节点扩展方便),高效性(任务并行执行),高容错性(任务失败可以自动重新分配)。

5)Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。

6)思考:为什么不能一直格式化NameNode,格式化NameNode,要注意什么?
格式化 NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。所以,格式化NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode。

7)服务器数据同步命令scp与rsync区别:使用rsync执行文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。

8)A,B服务器免密登录原理:A生成公私密钥对,将公钥拷贝给B,利用ssh命令访问B时使用私钥加密发送的数据,B接收到数据后去授权key中查找A的公钥并解密,再用A的公钥加密后将数据返还给A,A接收到返还的数据后使用私钥解密,完成免密登录。

HDFS基础知识:
1)HDFS(Hadoop Distributed File System)是一种分布式文件管理系统,适用于一次写入,多次读出的场景,不支持文件的修改。

2)优缺点:
优点: 1.高容错性:数据自动保存多个副本,某副本丢失后,可以自动恢复。
2.适合处理大数据。
3.可构建在廉价机器上。
缺点:1.不适合低延时数据访问。
2.无法高效对大量小文件进行存储(大量小文件会占用Namenode大量内存存储文件目录和块信息,小文件的寻址时间会超过读取时间)。
3.不支持并发写入,文件随机修改,仅支持数据追加。

3)组成架构:
Namenode:1.管理HDFS的名称空间。2.配置副本策略。3.管理数据块映射信息。4.处理客户端读写请求。
Datanode:1.存储实际的数据块。2.执行数据块的读写操作。
Client:1.将文件切分成一个个block,然后上传。
2.与Namenode交互,获取文件位置信息。
3.与Datanode交互,读取或写入信息。
4.提供命令管理HDFS,如Namenode格式化。
5.使用命令访问HDFS。
Secondary Namenode:1.定期合并Fsimage和edits,并推送给Namenode。
2.紧急情况下,可辅助恢复Namenode,但并非Namenode的热备,Namenode挂掉时,不能马上进行替换并提供服务。

4)文件块大小:HDFS文件在物理上是分块存储,默认块大小为128M(寻址时间大约10ms,寻址时间为传输时间的1%最佳,磁盘传输速率普遍为100MB/s,块大小计算得100M,取整为128M)。
为什么块不能设置太大或太小?1.块设置太小,会增加寻址时间。
2.块设置太大,传输数据时间远大于寻址时间,导致程序处理块速度非常慢。
总结:HDFS块大小设置主要取决于磁盘传输速率

5)写数据流程:
1.客户端通过(DFS)分布式文件系统模块向Namenode请求上传文件,NameNode检查该用户是否有上传权限,目标文件是否已存在,父目录是否存在。NameNode返回是否可以上传。
2.客户端请求第一个 Block上传到哪几个DataNode服务器上。
3.NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
4.客户端请求向dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成,dn1、dn2、dn3逐级应答客户端。
5.客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet(数据包,64kb)为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8.数据被分割成一个个的packet数据包在pipeline上依次传输,在pipeline反向传输中,逐个发送ack(命令正确应答),最终由pipeline 中第一个 DataNode 节点 A 将 pipeline ack 发送给 Client。
9.当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

6)读数据流程:
1.client 向 namenode 发送请求。请求文件block的位置,namenode收到请求之后会检查用户权限以及是否有这个文件,如果都符合,则会视情况返回部分或全部的block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后。
2.Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性)。
3.底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕。
4.当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表。
5.读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
6.read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据。
7.最终读取来所有的 block 会合并成一个完整的最终文件。

7)HDFS读写数据的过程中,NameNode会选择距离待上传下载数据最近距离的DataNode接收数据。那么这个最近距离怎么计算呢?节点距离:两个节点到达最近的共同祖先的距离总和

8)机架感知(副本存储节点选择):第一个副本在Client所处的节点上,如果客户端在集群外,则随意选择。第二个副本和第一个副本位于相同机架,随机节点。第三个副本位于不同机架,随机节点。禁止将同一数据块的副本存储在相同节点上。

9)NN和2NN工作机制:
NameNode数据存储在内存和本地磁盘,本地磁盘数据存储fsimage镜像文件和edits编辑日志文件。
1. 第一阶段:NameNode启动
首次启动NameNode :
1、格式化文件系统,为了生成fsimage镜像文件。
2、启动NameNode :
(1)读取fsimage文件,将文件内容加载进内存。
(2)等待DataNade注册与发送block report 。
3、启动DataNode :
(1)向NameNode注册 。
(2)发送block report 。
(3)检查fsimage中记录的块的数量和block report中的块的总数是否相同。
4、对文件系统进行操作(创建目录,上传文件,删除文件等)
此时内存中已经有文件系统改变的信息,但是磁盘中没有文件系统改变的信息,此时会将这些改变信息写入edits文件中,edits文件中存储的是文件系统元数据改变的信息。
第二次启动NameNode :
1、读取fsimage和edits文件。
2、将fsimage和edits文件合并成新的fsimage文件。
3、创建新的edits文件,内容为空。
4、启动DataNode。
2. 第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要CheckPoint(触发条件:1) 定时时间到。2) edits中的数据满了)。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行CheckPoint。
(3)NameNode滚动正在写的Edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.checkpoint。
(7)拷贝fsimage.checkpoint到NameNode。
(8)NameNode将fsimage.checkpoint重新命名成fsimage。
所以如果NameNode中的元数据丢失,是可以从Secondary NameNode恢复一部分元数据信息的,但不是全部,因为NameNode正在写的edits日志还没有拷贝到Secondary NameNode,这部分恢复不了。
10) Secondary NameNode不能恢复NameNode的全部数据,那如何保证NameNode数据存储安全:
一个NameNode有单点故障的问题,那就配置双NameNode(高可用),配置有两个关键点,一是必须要保证这两个NN的元数据信息必须要同步的,二是一个NN挂掉之后另一个要立马补上。
元数据信息同步在 HA 方案中采用的是“共享存储”。每次写文件时,需要将日志同步写入共享存储,这个步骤成功才能认定写文件成功。然后备份节点定期从共享存储同步日志,以便进行主备切换。
监控NN状态采用 zookeeper,两个NN节点的状态存放在ZK中,另外两个NN节点分别有一个进程监控程序,实施读取ZK中有NN的状态,来判断当前的NN是不是已经down机。如果standby的NN节点的ZKFC发现主节点已经挂掉,那么就会强制给原本的active NN节点发送强制关闭请求,之后将备用的NN设置为active。

11)Datanode工作机制:
DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分30秒(默认)没有收到某个DataNode的心跳,则认为该节点不可用。

12)DataNode节点保证数据完整性
(1)当DataNode读取Block的时候,它会计算CheckSum。
(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
(3)Client读取其他DataNode上的Block。
(4)DataNode在其文件创建后周期验证CheckSum。
通常将原始数据进行crc计算和传输过来的crc校验位比较,看是否一致。

13) HDFS在读取文件的时候,如果其中一个块突然损坏了怎么办:
客户端读取完DataNode上的块之后会进行checksum 验证,也就是把客户端读取到本地的块与HDFS上的原始块进行校验,如果发现校验结果不一致,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。

14)HDFS在上传文件的时候,如果其中一个DataNode突然挂掉了怎么办:
客户端上传文件时与DataNode建立pipeline管道,管道正向是客户端向DataNode发送的数据包,管道反向是DataNode向客户端发送ack确认,也就是正确接收到数据包之后发送一个已确认接收到的应答,当DataNode突然挂掉了,客户端接收不到这个DataNode发送的ack确认,客户端会通知 NameNode,NameNode检查该块的副本与规定的不符,NameNode会通知DataNode去复制副本,并将挂掉的DataNode作下线处理,不再让它参与文件上传与下载。

Mapreduce基础知识:
1)Mapreduce是一个分布式运算程序的编程框架
2)优缺点:
优点:(1)易于编程,简单实现一些接口就可以完成一个分布式程序。
(2)良好的扩展性,可以通过简单的增加机器来扩展计算能力。
(3)高容错性,一台机器挂了可以将计算任务转移,不至于任务运行失败。
(4)适合海量数据的离线处理。
缺点:(1)不擅长实时计算。
(2)不擅长流式计算。
(3)不擅长有向图计算
3)数据切片与MapTask并行度决定机制:
(1)一个Job的Map阶段并行度由客户端在提交Job时的切片数决定。
(2)每一个切片分配一个MapTask并行实例处理。
(3)默认情况下,切片大小等于块大小。
(4)切片时不考虑数据集整体,而是逐个针对每一个文件切片。
4)Combiner:
(1)Combiner是MR程序中Mapper和Reducer之外的一种组件。
(2)Combiner组件的父类是Reducer。
(3)Combiner在每个MapTask所在的节点运行,
Reducer接收全局所有Mapper的输出结果。
(4)Combiner的意义是对每一个MapTask的输出进行局部汇总,减少网络传输量。
(5)Combiner能够应用的前提是不能影响到最终的业务逻辑,Combiner的输出kv类型应与reducer的输入kv类型对应。如果reduce的输入参数类型和输出参数的类型是一样的,则规约的类可以使用reducer类,只需要在驱动类中指明规约的类即可。
5)MapTask工作机制:
(1) 读取数据组件 InputFormat (默认 TextInputFormat) 会通过 getSplits 方法对输入目录中的文件进行逻辑切片规划得到 block, 有多少个 block就对应启动多少个 MapTask。
(2) 将输入文件切分为 block 之后, 由 RecordReader 对象 (默认是LineRecordReader) 进行读取, 以 \n 作为分隔符, 读取一行数据, 返回 <key,value>. Key 表示每行首字符偏移值, Value 表示这一行文本内容 。
(3) 读取 block 返回 <key,value>, 进入用户自己继承的 Mapper 类中,执行用户重写的 map 函数, RecordReader 读取一行这里调用一次。
(4) Mapper 逻辑结束之后, 将 Mapper 的每条结果进行collect数据收集. 在 collect 中, 会先对其进行分区处理,默认使用 HashPartitioner。
(5) 接下来, 会将数据写入内存, 内存中这片区域叫做环形缓冲区(默认100M), 缓冲区的作用是批量收集 Mapper 结果, 减少磁盘 IO 的影响。
(6) 当环形缓冲区的数据达到溢写比列(默认0.8),也就是80M时,溢写线程启动, 需要对这 80MB 空间内的 Key 做排序 (Sort)。
(7) 合并溢写文件, 每次溢写会在磁盘上生成一个临时文件 (写之前判断是否有 Combiner), 如果 Mapper 的输出结果真的很大, 有多次这样的溢写发生, 磁盘上相应的就会有多个临时文件存在. 当整个数据处理结束之后开始对磁盘中的临时文件进行 Merge 合并, 因为最终的文件只有一个, 写入磁盘, 并且为这个文件提供了一个索引文件, 以记录每个reducer对应数据的偏移量。
6)ReduceTask工作机制:
(1)Copy阶段:Reduce进程启动一些数据copy线程,请求map task获取属于自己的文件(maptask 的分区会标识每个maptask属于哪个reducetask ,默认reducetask的标识从0开始)。
(2)Merge阶段:这里的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数值。Copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活。merge有三种形式:内存到内存;内存到磁盘;磁盘到磁盘。默认情况下第一种形式不启用。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的文件。
(3)Sort阶段:按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。
(4)Reduce阶段:键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。
7)ReduceTask并行度:
ReduceTask的并行度同样影响整个Job的执行并发度和执行效率,但与MapTask的并发数由切片数决定不同,ReduceTask数量的决定是可以直接手动设置。
8)Shuffle过程详解:
一般把从 Map 产生输出开始到 Reduce 取得数据作为输入之前的过程称作 shuffle。Shuffle 中的缓冲区大小会影响到 mapreduce 程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。

(1)MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中。
(2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件。
(3)多个溢出文件会被合并成大的溢出文件。
(4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序。
(5)ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据。
(6)ReduceTask会取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)。
(7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)。
10)MapReduce优化方法:
MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题和常用的调优参数。
数据输入:
1. 采用CombineTextInputFormat作为输入,解决输入端大量小文件问题。
2. 对于大量小文件 Job,可以开启 JVM 重用。
Map阶段:
1. 减少合并次数 。
2. 在Map之后,不影响业务逻辑前提下,先进行Combiner处理,减少IO。
3. 增大环形缓冲区大小。
4. 增大环形缓冲区溢写的比例。
Reduce阶段:
1.合理设置Map和reduce数。
2.设置Map,reduce共存。
3.规避使用reduce。
4.合理设置reduce端的buffer。
IO传输:采用数据压缩的方式,使用SequenceFile二进制文件。
数据倾斜问题:
1.采用抽样和范围分区。
2.自定义分区。
3.合理利用Combiner 。
4.采用Map join,尽量避免reduce join。

Yarn基础知识:
1)Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
2)ResourceManager:
它主要由两个部分组成:调度器(Scheduler)和应用程序管理器(Application Manager)。
(1)处理客户端请求。
(2)监控NodeManager,启动或监控ApplicationMaster。
(3)负责资源的分配和调度。
NodeManager:
(1)管理单个节点上的资源。
(2)它会定期地向RM汇报本节点上的资源使用情况和各个Container的运行状态。
(3)接收并处理来自AM的Container启动和停止请求。
ApplicationMaster:
用户提交的一个应用程序会对应于一个ApplicationMaster,它的主要功能有:
a.与RM调度器协商以获得资源,资源以Container表示。
b.将得到的任务进一步分配给内部的任务。
c.与NM通信以启动/停止任务。
d.监控所有的内部任务状态,并在任务运行失败的时候重新为任务申请资源以重启任务。
Container:
Yarn中的资源抽象,封装了某个节点上的多维度资源,如内存,CPU,磁盘,网络等。
3)Yarn工作机制:
(1)MR程序提交到客户端所在的节点。
(2)YarnRunner向ResourceManager申请一个Application。
(3)RM将该应用程序的资源路径返回给YarnRunner。
(4)该程序将运行所需资源提交到HDFS上。
(5)程序资源提交完毕后,申请运行MRAppMaster。
(6)RM将用户的请求初始化成一个Task。
(7)其中一个NodeManager领取到Task任务。
(8)该NodeManager创建容器Container,并产生MRAppMaster。
(9)Container从HDFS上拷贝资源到本地。
(10)MRAppMaster向RM 申请运行MapTask资源。
(11)RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
(12)MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
(13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
(14)ReduceTask向MapTask获取相应分区的数据。
(15)程序运行完毕后,MR会向RM申请注销自己。
4)Hadoop的JVM重用:
Hadoop中有个参数是mapred.job.reuse.jvm.num.tasks,默认是1,表示一个JVM上最多可以顺序执行的task数目(属于同一个Job)是1。也就是说一个task启一个JVM。比如我配的是每个slave节点最多同时运行8个map和8个reduce。那么在map阶段,slave节点会启动最多8个JVM用于map。
为每个task启动一个新的JVM将耗时1秒左右,对于运行时间较长(比如1分钟以上)的job影响不大,但如果都是时间很短的task,那么频繁启停JVM会有开销。
如果我们想使用JVM重用技术来提高性能,那么可以将mapred.job.reuse.jvm.num.tasks设置成大于1的数。这表示属于同一job的顺序执行的task可以共享一个JVM,也就是说第二轮的map可以重用前一轮的JVM,而不是第一轮结束后关闭JVM,第二轮再启动新的JVM。那么最多一个JVM能顺序执行多少个task才关闭呢?这个值就是mapred.job.reuse.jvm.num.tasks。如果设置成-1,那么只要是同一个job的task(无所谓多少个),都可以按顺序在一个JVM上连续执行。如果task属于不同的job,那么JVM重用机制无效,不同job的task需要不同的JVM来运行。
JVM重用技术不是指同一Job的两个或两个以上的task可以同时运行于同一JVM上,而是排队按顺序执行。
5)hadoop作业提交到yarn的流程:
(1)client将切片清单/配置/jar包上传到HDFS。
(2)RM收到请求后,选一个满足要求的NM,通知它启动一个特殊的Container,称为ApplicationMaster(AM),后续流程由AM发起。
(3)AM启动后,从HDFS下载切片清单,AM向RM申请资源(Container)。
(4)若有足够资源,RM会将Container分给NM,Container反向注册给AM。
(5)AM将任务分发给Container。
(6)Container执行具体任务,NM监控任务执行情况。
(7)各个Container向AM汇报自己的执行情况,都完成后,AM向RM注销任务,RM向NM杀死Container,任务结束.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值