浅浅学习一下~~~
目录
一.Hadoop基础
1.什么是Hadoop
Hadoop是一个分布式系统基础架构,主要解决海量数据的存储和海量数据的分析计算问题。
2.Hadoop的优缺点
优点:
高可靠性:Hadoop底层维护多个数据副本,所以即使某个计算元素或者存储出现故障,也不会出现数据的丢失。
高扩展性:在集群间分配任务数据,方便扩展数以千计的节点。
高效性:并行工作。
高容错性:能够自动将失败的任务自动分配。
3.Hadoop运行模式
本地模式:单机运行
伪分布模式:也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境。
完全分布模式:多台服务器组成分布式的环境。
4.辨析Hadoop和Hadoop生态系统的概念
Hadoop是指Hadoop框架本身;Hadoop生态系统是指Hadoop及能够保证Hadoop正常运行的其他框架。如Zookeeper,Flume,Hive等。
5.Hadoop生态圈的组件
1)Zookeeper:它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护,名字服务,分布式同步等。
2)HBase:它是一个分布式的,面向列的开源数据库。它是一个适合非结构化数据存储的数据库。
3)Hive:它是一个基于Hadoop的数据仓库工具,提供简单的SQL语句,可以将SQL语句转换为MapReduce任务进行运行。
4)Flume:它是一个高可用的,高可靠的,分布式的海量日志采集,聚合和传输的系统。
5)Sqoop:主要用于Hadoop,Hive和MySQL之间数据的传递
6)Spark:开源大数据内存计算框架
6.Hadoop集群正常工作中需要启动的进程及其作用:
NameNode:存储文件的元数据(如文件名,文件目录结构,文件属性)
DataNode:在本地文件系统存储文件块数据
SecondaryNameNode:每隔一段时间对NameNode元数据备份
NodeManager:执行任务
ResourceManager:负责调度DataNode上的工作
二.HDFS
1.HDFS定义
它是一个文件系统,用于存储文件,通过目录树来定位文件;它是分布式的,有很多服务器联合起来实现其功能;适合一次写入,多次读出的场景。
2.HDFS优缺点
优点:
1)高容错性:数据自动保存多个副本;某一个副本丢失后,可以自动恢复。
2)适合处理大数据。
3)可构建在廉价机器上。
缺点:
1)不适合低延时数据访问。
2)无法高效的对对大量小文件进行存储。
3)不支持文件并发写入,文件随即修改。
3.HDFS组成架构
1)NameNode:相当于Master,就是一个主管,管理者。
管理HDFS的空间名称;
配置副本策略;
管理数据块映射信息;
处理客户端读写请求。
2)DataNode:相当于Slave,实行命令。
存储实际的数据块;
执行数据块的读写操作。
3)Client:就是客户端。
文件切分;
与NameNode交互,获取文件的位置信息;
与DataNode交互,进行数据块的读写操作;
4)Secondary NameNode:并不是NameNode的热备,当NameNode挂掉的时候,它并不能马上替换NameNode并提供工作。
辅助NameNode,分担其工作量。帮助NameNode合并日志,减少NameNode启动时间。
HDFS组成架构图
4.HDFS文件块大小
HDFS的文件在物理上是分块储存,块的大小通过配置参数配置(dfs.blocksize),默认大小是128MB。
5.为什么快的大小不能设置太大,也不能设置太小?
如果HDFS块的大小设置太小,则会增加寻址时间,程序一直在寻找块的开始位置;
如果块的大小设置太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需要的时间。导致程序处理非常慢。
HDFS块的大小设置取决于磁盘传输速率。
6.HDFS的shell操作(开发重点)
#1.命令大全:
bin/hadoop fs
#2.启动Hadoop集群:
sbin/start-dfs.sh
sbin/start-yarn.sh
#3.输出某一命令参数
hadoop fs -help rm
#4.创建文件夹
hadoop fs -mkdir bigdata
#5.上传操作
#5.1 从本地剪切粘贴到HDFS上
hadoop fs -moveFromLocal
#5.2 从本地系统拷贝到HDFS上
hadoop fs -copyFromLocal
#5.3 等同于copyFromLocal
hadoop fs -put
#5.4 追加一个文件到已经存在的文件末尾
hadoop fs -appendToFile
#6.下载操作
#6.1 从HDFS拷贝到本地
hadoop fs -copyToLocal
hadoop fs -get
#7.直接操作
显示目录信息 hadoop fs -ls /shu
显示文件内容 hadoop fs -cat 文件名字
修改文件属性 -chmod -chown
创建路径 -mkdir
从HDFS的一个路径拷贝到另一个路径 -cp
在HDFS中移动文件 -mv
设置文件的副本数量 -setrep
7.HDFS的写数据流程
1)客户端通过分布式文件系统模块向NameNode请求上传文件,NameNode检查目标文件是否存在,父目录是否存在;
2)NameNode返回是否可以上传文件;
3)客户端请求第一个block上传到哪几个DataNode服务器上;
4)NameNode返回3个DataNode节点,分别为dn1,dn2,dn3;
5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,dn2调用dn3,将这个通信管道建立完;
6)dn1,dn2,dn3逐级应答客户端;
7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet传给dn2,dn2传给dn3,dn1每传一个packet会放入一个应答队列等待应答;
8)当一个block传输完成后,客户端再次请求NameNode上传第二个block的服务器(重复3-7步)。
HDFS写数据流程
8.HDFS的读数据流程
1)客户端通过DistributedFileSystem模块向NameNode请求下载文件,NameNode通过查询元数据,找到文件所在的DataNode地址。
2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3)DataNode开始传输数据给客户端(从磁盘里面读取数据流,以Packet为单位做校验)
4)客户端以Packet为单位接收,现在本地缓存,然后写入目标文件。
HDFS读数据流程
9.NN和2NN工作机制
1)Fsimage文件:在磁盘中备份元数据。
2)Edits文件:每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits文件中;
一旦NameNode断电,就会合并Fsimage文件和Edits文件,合成元数据。引入的Secondary NameNode 专门用于合并两个文件。
10.NameNode工作机制
第一阶段:NameNode启动
1)第一次启动NameNode格式化后,创建Fsimage和Edits文件,如果不是第一次启动,直接加载编辑日志和镜像文件到内存;
2)客户端对元数据进行增删改的请求;
3)NameNode记录操作日志,更新滚动日志;
4)NameNode在内存中对元数据进行增删改
第二节点:Secondary NameNode工作
1)Secondary NameNode询问NameNode是否需要checkpoint,直接带回NameNode是否检查结果。
2)Secondary NameNode请求执行checkpoint。
3)NameNode滚动正在写的Edits日志。
4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
5)Secondary NameNode将编辑日志和镜像文件加载到内存,并合并。
6)生成镜像文件fsimage.chkpoint。
7)拷贝到fsimage.chkpoint到NameNode.
8)NameNode将fsimage.chkpoint重新命名为Fsimage。
NameNode工作机制
三.MapReduce
1.什么是MapReduce?
MapReduce是一个分布式运算程序的编程框架,它的核心功能是将用户编写的业务逻辑代码和自带默认组件代码整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
2.MapReduce的核心编程思想
1)MapReduce运算程序一般分成两个阶段,Map阶段和Reduce阶段。
2)Map阶段的Map Task,完全并发运行,互不相干。
3)Reduce阶段的Reduce Task,完全互不相干,但是他们的数据依赖于上一个阶段的所有Map Task并发实例的输出。
4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段
3.Hadoop序列化
1)序列化:序列化就是把内存中的对象,转换成字节序列以便于存储到磁盘(持久化)和网络传输。
2)反序列化:将收到字节序列或者是磁盘的持久化数据,转换成内存中的对象。
3)为什么要序列化:
“活的”对象只生存在内存里,关机断电就没有了,而且“活的”的对象只能在本地的进程中使用,不能被发送到网络上的另一台计算机。然而序列化可以存储“活的”对象,可以将活的对象发送到远程计算机中。
4)为什么不用Java的序列化:
Java的序列化是一个重量级序列化框架,一个对象被序列化后,会附带很多额外的信息,不便于在网络中高效传输,所以,Hadoop自己开发了一套序列化机制。
5)Hadoop序列化的特点:
紧凑:高效使用存储空间
快速:读写数据的额外开销小
互操作:支持多语言的交互
6)自定义bean对象实现序列化接口步骤:
必须实现Writable接口;
反序列化时,需要反射调用空参构造函数,所以必须有空参构造;
重写序列化方法;
重写反序列化方法;
注意:反序列化和序列化的顺序完全一致。
要想把结果显示文件中,需要重写toString方法
如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口,因为MapReduce框中的shuffle对key进行排序。
4.MapReduce框架原理
4.1 InputFormat
1)MapTask并行度决定机制
数据块:Block是HDFS物理上把数据分成一块一块,数据块是HDFS数据存储单位。
数据切片:数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。
2)FileInputFormat切片源码解析
a.程序找到你数据存储的目录。
b.开始遍历处理(规划切片)目录下的每一个文件
c.遍历第一个文件:
c.1 计算文件大小:fs.sizeOf(文件名)
c.2 计算切片大小: computeSplitSize(Math.max(minSize,min(maxSize,blockSize)))=blockSize=128M
默认情况下,切片大小=blocksize
c.3 开始切,形成第一个切片,ss.txt:0-128M;形成第二个切片,ss.txt:128-256M;第三个切片,ss.txt:256-300M。(每次切片时都要判断剩下的部分是否大于块的1.1倍,若不大于,就划分为一个切片)。
c.4 将切片信息写到一个切片规划文件中。
c.5 这个切片的核心过程在getSplit()方法中完成。
c.6 InputSplit只记录了切片的元数据信息。
d.提交切换规划文件到Yarn中
3)切片大小的参数配置:
计算切片大小的公式:
切片大小的设置:
maxSize(切片最大值):参数如果调得比blockSize小,则会让切片变小,而且就等于配置的这个参数的值。
minSize(切片最小值):参数调得比blockSize大,则会让切片变得比blockSize大。
4.2 判定一个job的Map和Reduce数量
1)map数量由处理的数据分成的block数量决定,default_num=total_size/split_size。
2)resude数量由job.setNumReduceTasks(x)决定。
4.3 一个job的MapTask个数有什么决定
一个job阶段的MapTask并行度个数由客户端提交job时的切片个数决定。
5.MapReduce工作机制
5.1 MapTask工作机制
1)Read阶段:MapTask通过InputFormat获得的RecordReader,从输入InputSplit中解析出一个个key/value。
2)Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value.
3)Collect阶段:在用户map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果,在该函数内部,它会将生成的key/value 分区,并写入一个环形内存缓冲区内。
4)Spill阶段:当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件,
5)Merge阶段:当所有数据处理完成后,MapTask会将所有临时文件合并成一个大文件,以确保最终只会生成一个数据文件。
5.2 Reduce Task工作机制
1)Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
2)Sort阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上的文件过多。按照MapReduce语义,用户编写reduce()函数输入数据是按照key进行聚集的一组数据,为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略,由于各个MapTask已经对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。
3)Reduce阶段:reduce()函数直接将结果写到HDFS中。
6.MapReduce中的排序操作
1)部分排序:
MapReduce根据输入记录的键对数据集排序,保证输出的每个文件内部有序。
2)全排序:
最终输出结果只有一个文件,且文件内部有序。
3)辅助排序:
在Reduce端对key进行分组,应用于:在接收key为bean对象时,想让一个或多个字段的key进入到同一个reduce方法时,可以采用分组排序。
4)二次排序:在自定义排序过程中,如果compareTo中的判断条件为两个即为二次排序。
自定义排序排序实现WritableComparable接口重写compareTo方法。
7.MapReduce中的Shuffle机制
Map方法之后,Reduce方法之前的数据处理称为shuffle阶段。
分区,排序,溢写,拷贝到对应reduce机器上,增加combiner,压缩溢写的文件。
combiner的作用:
combiner对每一个MapTask的输出进行局部汇总,以减小网络传输量。
combiner在每一个MapTask所在的节点运行;reduce是接收全局所有mapper的输出结果。
8.Partition分区
1)将统计结果按照条件输出到不同分区中。
2)在没有自定义分区的情况下,数据被送到reduce端前如何分区?
根据默认的HashPartitioner,逻辑是根据key的哈希值和numReduces来返回一个分区号,key.hashCode()&Integer.MAXVALUE%numReduces.
3)自定义Partition分区步骤:
自定义类继承Partitioner,重写getPartition()方法。
在Job驱动中,设置自定义Partitioner。
自定义Partitioner后,要根据自定义Partitioner的逻辑设置相应数量的ReduceTask。
9.Map Join的实现
1)Map Join适用于一张表很小,一张表很大的场景。
当在Reduce端处理很多的表,出现数据倾斜怎么办?
在Map端缓存多张表,提前处理业务逻辑,增加Map端业务,减少Reduce端数据的压力,尽可能的减少数据倾斜。
10.数据清理
ETL(Extract-Transform-Load),用来描述将数据从来源段经过抽取,转换,加载至目的端的过程。
四.Yarn
1.什么是Yarn?
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台。
2.Yarn的基础架构
1)ResourceManager:
处理客户请求;
监控NodeManager;
启动或者监控ApplicationMaster;
资源的分配与调度。
2)NodeManager:
管理单个节点上的资源;
处理来自ResourceManager的命令;
处理来自ApplicationMaster的命令。
3)ApplicationMaster:
为应用程序申请资源并分配给内部的任务;
任务的监控与容错。
4)Container
3.Yarn的调度器及调度算法
1)先进先出调度器(FIFO):单队列,根据提交作业的先后顺序,先来先服务
2)容量调度器(Capacity Scheduler)默认:
支持多队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略;
管理员为每个队列设置资源最低保证和资源使用上限;
如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列;
资源分配算法:
队列资源分配:从root开始,优先选择资源占用率最低的队列分配资源;
作业分配资源:默认按照提交作业的优先级和提交时间顺序分配资源;
容器资源分配:按照容器的优先级分配资源;
如果优先级相同,按照数据本地性原则:
任务和数据在同一节点上;
任务和数据在同一机架上;
任务和数据不在同一节点也不在同一机架上。
3)公平调度器(Fair Scheduler):
支持多队列多用户,同队列所有任务共享资源,在时间尺度上获得公平的资源;
比如有三个队列:qa,qb,qc,每个队列的job按照优先级分配资源,优先级越高分配的资源越多,但是每个job都会分配到资源以确保公平,在资源有限的情况下,每个job理想情况下获得的计算资源与实际获得的计算资源存在一种差距,这个差距叫做缺额。在同一个队列中,job的资源缺额越大,越先获得资源有限执行。
4.Hadoop数据压缩算法
1)压缩的优缺点:
优点:
减少磁盘I/O,减少磁盘存储空间
缺点:
增加CPU开销
2)压缩方式选择:
压缩选择时应考虑:压缩/解压速度,压缩率,压缩后是否支持切片。
压缩格式 | Hadoop自带? | 算法 | 文件扩展名 | 是否可切片 | 换成压缩格式后,原来的程序是否需要修改 |
DEFLATE | 是 | DEFLATE | .deflate | 否 | 不需要 |
Gzip | 是 | DEFLATE | .gz | 否 | 不需要 |
bzip2 | 是 | bzip2 | .bz2 | 是 | 不需要 |
LZO | 否 | LZO | .lzo | 是 | 需要建立索引 |
Snappy | 是 | Snappy | .snappy | 否 | 不需要 |
Gzip:压缩率高,不支持切片,压缩/解压速度一般。
Bzip2:压缩率高,支持切片,压缩/解压速度较慢。
Lzo:压缩/解压速度快,支持切片,压缩率一般。
Snappy:压缩和解压速度快,不支持切片,压缩速度一般。