“ hadoop 课程概述”
01
—
hadoop概述
1.0和2.0是由分布式存储系统HDFS和分布式计算框架MapReduce组成的。
2.0变化是多了YARN
HDFS、MapReduce、YARN、HBase、Hive、Pig、Mahout、Flume、Sqoop
方便、弹性、健壮、简单
spark是基于内存计算的大数据并行计算框架。spark基于内存计算 提高了在大数据环境下数据处理的实时性。保证了高容错性和高可伸缩性。允许用户将spark部署在大量的廉价硬件上,形成集群提高并行计算能力。
spark的特点:运行速度快、易用性、支持复杂查询、事实的流处理、容错性。
1. 流式计算:spark支持流式计算。hadoop没有流式计算
2. 批计算:spark Core、MapReduce都支持批处理
3. 图计算:spark支持图计算,hadoop没有相应的组件支持图计算
4. 机器学习:spark支持机器学习 hadoop也支持机器学习
5. SQL:对于SQL语句的支持 spark由dateframe组件 hadoop则是由hive组件实现
RDBMS:容易理解、使用方便、易于维护、支持SQL
1. 数据大小:RDBMS处理GB级 MapReduce处理PB级
2. 访问方式:RDBMS支持交互处理和批处理。MapReduce只支持批处理
3. 更新:RDBMS支持多次读写。MapReduce支持一次写多次读
4. 收缩性:RDBMS是非线性扩展的。而MapReduce 支持线性扩展
总的来说 MapReduce适合海量数据的批处理可以利用其并行计算的能力
RDBMS适合少量数据的实时复杂查询
02
—
Hadoop的开发以及运行环境搭建
单机模式 伪分布式模式 完全分布式模式
1.格式化NameNode
bin/hadoop namenode -format
2. 启动hadoop伪分布式集群
sbin/start-all.sh
3. 通过jsp命令查看hadoop的启动进程
03
—
HDFS分布式文件系统
1.单机负载可能极高
2.数据不安全
3.文件整理困难
1.支持超大文件存储
2.流式数据访问
3.简单的一致性模型
4.硬件故障的检测和快速应对
(1)NameNode
(2)SecondaryNameNode
(3)DataNode
(4)HDFS客户端
(5)数据块
1. 高容错性
2. 适合大数据处理
3. 流式文件访问
4. 可构建在廉价的机器上
1. 不适合延时数据访问
2. 不适合小文件的存储
1.首先调用FileSystem对象的open()方法,获取的是一个分布式文件系统的实例
2.分布式文件系统 通过RPC获得文件的第一批块的位置信息,同一个块按照重复数会返回多个位置信息。这些位置信息按照Hadoop拓补结构排序 距离客户端近的排在前面
3.前两步返回一个文件系统输入流对象该对象会被封装为分布式文件输入流对象。
分布式文件输入流对象
4.数据从DataNode源源不断的流向客户端
5.读完第一个块,DFSInputStream就会去NameNode拿下一批块的位置信息继续读
6.如果读完第一批块NameNode会去下一批继续读 如果全部读完就会关闭所有的流
1.客户端通过调用分布式文件系统的create()方法创建新文件
2.DistributedFileSystem 通过RPC 调用 NameNode 去创建一个没有块关联的新文件,创建前,NameNode会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,NameNode就会记录下新文件,否则就会抛出/O异常
3.前两步结束后,会返回文件系统数据输出流(FSDataOutputStream)的对象,与读文件的时候相似,FSDataOutputStream被封装成分布式文件系统数据输出流(DFSOutputStream) DFSOutputStream 可以协调 NameNode 和 DataNode。客户端开始写数据到DFSOutputStream, DFSOutputStream会把数据切成一个个小的数据包(packet),然后排成数据队列(dataquene)。
4.接下来,数据队列中的数据包首先输出到数据管道(多个数据节点组成数据管道)中的第一个 DataNode中(写数据包),第一个 DataNode 又把数据包输出到第二个 DataNode 中,依次类推
5.DFSOutputStream 还维护着一个队列叫响应队列(ack quene),这个队列也是由数据包组成,用于等待DataNode 收到数据后返回响应数据包,当数据管道中的所有DataNode都表示已经收到响应信息的时候,这时akc quene 才会把对应的数据包移除掉。
6.客端完成写数据后,调用close0方法关闭写入流。
7.客户端通知 NameNode 把文件标记为已完成。然后NameNode把文件写成功的结果反馈给客户端。此时就表示客户端已完成了整个HDFS的写数据流程。
1. 提高系统可靠性
2. 负载均衡
3. 提高访问效率
04
—
MapReduce分布式计算框架
1. MapReduce是一个并行程序的计算模型与方法
2. MapReduce是一个并行程序运行的软件框架
3. MapReduce是一个基于集群的高性能并行计算平台
MapReduce的基本设计思想
1.分而治之
2.抽象成模型
3.上升到框架
1.易于编程
2.良好的扩展性
3.高容错
4.适合pb级以上海量数据的离线处理
1.不适合实时计算
2.不适合流式计算
3.不适合DAG计算
客户端 作业管理器 任务管理器任务
第一步:在客户端启动一个作业。
第二步:向作业管理器请求一个作业ID(JobID)。
第三步:接着将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的Jar文件、配置文件和客户端计算所得的输入分片信息。这些文件都存放在作业管理器专门为该作业创建的文件夹中。文件夹名为该作业的JobID。Jar 文件默认会有10个副本(mapred.submit.replication属性控制):输入分片信息告诉了作业管理器应该为这个
输出格式 作业启动多少个Map任务。
第四步:等作业管理器接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度,当作业调度器根据自己的调度算法调度到该作业时,会根据输入分片信息为每个分片创建一个Map任务,并将Map任务分配给任务管理器执行。对于Map和Reduce
HDFS任务,任务管理器根据主机核的数量和内存的大小计算固定数量的Map槽和Reduce槽。
第五步:任务管理器每隔一段时间会给作业管理器发送一个心跳告诉作业管理器他在运行同时心跳重还携带者很多信息比如map任务的进度等
1.每个任务分片会给map任务来处理。map输出的结果会放在环形内存缓冲区中。当缓冲区快溢出时会在本地文件中创建一个溢出文件然后将缓冲区的数据写入这个文件
2.在写入磁盘之前线程首先根据reduce任务数目将数据划分为数目相同的分区也就是reduce任务对应的分区数据
3.当Map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并。合并的过程中会不断地进行排序和Combining操作,目的有两个:
其一:尽量减少每次写入磁盘的数据量。
其二:尽量减少下一复制阶段网络传输的数据量。
最后合并成了一个已分区且已排序的文件。为了减少网络传输的数据量,这里可以将数据压缩,只要将mapred.compressmap.out设置为true 就可以了。
4. 将分区中的数据复制给相对应的Reduce任务。
1.Reduce端会接收到不同Map任务传来的数据,并且每个Map传来的数据都是有序的。如果Reduce 端接受的数据量相当小,则直接存储在内存中(缓冲区大小由mapred job.shuffle.input.bufferpercent属性控制,表示用作此用途的空间的百分比),如果数据
ce端 量超过了该缓冲区大小的一定比例(由mapred.job.shuffle.merge.percent决定),则对数据 合并后溢写到磁盘中。(接收存储)
2.随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。其实不管在Map端还是Reduce端,MapReduce 都是反复地执行排序,合并操作,所以有些人会说:排序是Hadoop的灵魂。(合并排序)
3.合并的过程中会产生许多的中间文件(会写入磁盘),但MapReduce会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到Reduce函数并最终输出结果。(写入输出)
HDFS中数据以分片方式为MapReduce的输入
HDFS中的数据以块存储
同节点、 同机架、 跨机架
05
—
Hadoop的文件I/O
1. 数据传输的完整性
2. 数据存储的完整性
1. 数据的校验和
2. 数据块检测程序
1. DataNode接收数据后 存储数据前
2. 客户端读取DataNode上的数据时
3. DataNode后台守护进程的定期检测
一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只
publid
能由本地的进程使用,不能被发送到网络上的另外一台计算机。然而序列化可以存储“活的”对象,还可以将“活的”对象发送到远程计算机。所以说,如果想存储“活的”对象,存储这串字节流即可,如果想把“活的”对象发送到远程主机,发送这串字节流即可,如果需要使用对象的时候,做一下反序列化,就能将对象“复活”了。
将对象序列化存储到文件的操作,又叫“持久化”或“永久存储”。将对象序列化发送到远程计算机的过程,又叫“数据通信”或“进程间通信”。
Java也有序列化机制,但是Java的序列化机制的缺点就是计算量开销大,且序列化 对于一
的结果体积太大,有时能达到对象大小的数倍乃至十倍。它的引用机制也会导致大文件不能分割的问题。这些缺点使得Java的序列化机制对 Hadoop 来说是不合适的。于是Hadoop设计了自己的序列化机制。
1. Writable接口(赋值和取值)
2. WritableComparable接口
gzip压缩速度比较快 压缩率很高
lzo 压缩需要建索引 还需要指定输入格式
snappy 没有linux 命令
bzip2 压缩率最高
联系客服