hadoop基础知识
hadoop三大核心技术:
1.HDFS分布式存储系统
2.MR分布式计算框架
3.Yarn资源调度
Hadoop的核心配置:
Hadoop的核心配置通过两个xml完成。
hadoop-default.xml和hadoop-site.xml。
Hadoop现在拥有4个配置文件:
1.core-site.xml
2.hdfs-site.xml
3.mapred-site.xml
4.yarn-site.
大数据:
指无法在一定时间范围内用常规工具对数据进行存储处理的数据集合,至少是PB级别的。它有5V特性,大量,高速,多样,价值密度低,真实
hadoop:
hadoop是一个开源的框架,它实现了对海量数据的分布式存储和计算。hadoop的核心是HDFS和MapReduce。
可用作数据备份,数据挖掘,搜索引擎等等。
HDFS:
hdfs功能节点
namenode:管理文件系统的命名空间,集群配置信息,存储块的复制,处理client的读写请求
secondenamenode:辅助namenode,定期合并fsimage和fsedits推送给namenode
datanode:文件存储基本单元,block存储在本地文件系统,同一时间周期性地将全部block信息发送给namenode,存储实际数据块slaves
client:文件切分,与namenode交互获取文件位置,与datanode交互写入数据
hdfs原理
1.分布式文件系统,管理的文件是被切块存储在若干个datanode服务器上
2.hdfs提供了统一的目录树来定位hdfs中的文件,客户端访问文件时只要指定目录树的路径即可
3.每个文件都备份了三份
4.提供了namenode和datanode进程服务,维护了hdfs的目录树与文件真实位置的映射
hdfs读/写操作
读:client链接namenode,namenode查看元数据找到位置,client通过hdfs的api查看数据,关闭链接
写:client链接namenode,namenode把位置告诉client,client在hdfs上将数据存到datanode上面,datanode备份数据通知client,client通知namenode,namenode加载元数据到内存
HDFS存储的机制
写流程:
client链接namenode存数据
namenode记录一条数据位置信息(元数据),告诉client存哪
client用hdfs的api将数据块(64,128M)存储到datanode上
datanode将数据水平备份,并且备份完将反馈client上
clident通知namenode存储块完毕
namenode将元数据同步到内存中
另一块循环上面的过程
读流程:
client链接namenode,查看元数据,找到数据的存储位置
client通过hdfs的api并发读取数据
关闭链接
写详细步骤:客户端要向HDFS写数据,首先要跟namenode通信以确认可以写文件并获得接收文件block的datanode,然后,客户端按顺序将文件逐个block传递给相应datanode,并由接收到block的datanode负责向其他datanode复制block的副本
1、根namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
2、namenode返回是否可以上传
3、client会先对文件进行切分,比如一个blok块128m,文件有300m就会被切分成3个块,一个128M、一个128M、一个44M请求第一个 block该传输到哪些datanode服务器上
4、namenode返回datanode的服务器
5、client请求一台datanode上传数据(本质上是一个RPC调用,建立pipeline),第一个datanode收到请求会继续调用第二个datanode,然后第二个调用第三个datanode,将整个pipeline建立完成,逐级返回客户端
6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(一个packet为64kb),当然在写入的时候datanode会进行数据校验,它并不是通过一个packet进行一次校验而是以chunk为单位进行校验(512byte),第一台datanode收到一个packet就会传给第二台,第二台传给第三台;第一台每传一个packet会放入一个应答队列等待应答
7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。
读详细步骤:客户端将要读取的文件路径发送给namenode,namenode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件
1、跟namenode通信查询元数据(block所在的datanode节点),找到文件块所在的datanode服务器
2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流
3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)
4、客户端以packet为单位接收,先在本地缓存,然后写入目标文件,后面的block块就相当于是append到前面的block块最后合成最终需要的文件。
HDFS的文件读取原理,详细解析如下:
1、首先调用FileSystem对象的open方法,其实获取的是一个DistributedFileSystem的实例。
2、DistributedFileSystem通过RPC(远程过程调用)获得文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照Hadoop拓扑结构排序,距离客户端近的排在前面。
3、前两步会返回一个FSDataInputStream对象,该对象会被封装成 DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方 法,DFSInputStream就会找出离客户端最近的datanode并连接datanode。
4、数据从datanode源源不断的流向客户端。
5、如果第一个block块的数据读完了,就会关闭指向第一个block块的datanode连接,接着读取下一个block块。这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不断的流。
6、如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。
HDFS的文件写入原理详细步骤解析:
1.客户端通过调用 DistributedFileSystem 的create方法,创建一个新的文件。
2.DistributedFileSystem 通过 RPC(远程过程调用)调用 NameNode,去创建一个没有blocks关联的新文件。创建前,NameNode 会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,NameNode 就会记录下新文件,否则就会抛出IO异常。
3.前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 可以协调 NameNode和 DataNode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列 data queue。
4.DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几个DataNode里,比如重复数是3,那么就找到3个最适合的 DataNode,把它们排成一个 pipeline。DataStreamer 把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推。
5.DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
6.客户端完成写数据后,调用close方法关闭写入流。
7.DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成。
hdfs机架感知:
1.通过配置脚本文件,core-site.xml..script.file.name可以指定文件
2.通过实现DNSToSwitchMapping的resolve方法,core-site.xml...switch.mapping.impl可以指定类
hdfs 在缺省配置下副本数是3个,通常的策略是:
第一个副本放在和Client相同机架的Node里(如果Client不在集群范围,第一个Node是随机选取不太满或者不太忙的Node)
第二个副本放在与第一个Node不同的机架中的Node
第三个副本放在与第二个Node所在机架里不同的Node.
MapReduce:
mapreduce的原理
MapReduce采用“分而治之”的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单来说,MapRecuder就是“任务的分解与结果的汇总”。
在Hadopp中,用于执行MapReduce人物的机器角色有两个:一个是Job Tracker;另一个是Task Tracker,Job Tracker是用于调度工作的,TaskTracker是用于执行工作的。一个Hadoop集群中只有一台Job Tracker。
在分布式计算中,MapReduce框架负责处理了并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题,把处理过程高度抽象为两个函数:Map和Reduce,map负责把任务分解成多个任务,reduce负责把分解后多任务处理的结果汇总起来。
需要注意的是,用MapR额的侧来处理的数据集(或任务)必须具备这样的特点:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。