Hadoop 原理总结
Hadoop 原理总结
一、Hadoop技术原理
Hdfs主要模块:NameNode、DataNode
Yarn主要模块:ResourceManager、NodeManager
常用命令:
1)用hadoop fs 操作hdfs网盘,使用Uri的格式访问(URI格式:secheme://authority/path ,默认是hdfs://namenode:namenode port /parent path / child , 简写为/parent path / child)
2)使用start-dfs.sh启动hdfs
1 MR执行流程:
1)客户端提交Mr 的jar包程序给JobClient
2)JobClient通过RPC和JobTracker 进行通信返回新的JOB ID 和路径
3)Client将jar包写入到HDFS当中(提交10份)
4)开始提交任务(任务的描述信息,不是Jar),有任务的详细信息
5)JobTracker进行初始化任务,把任务放到调度器中,在一台机器上
6)读取HDFS上的要处理的文件,开始计算输入分片
7)TaskTracker通过心跳机制领取任务
8)下载所需要的jar,配置文件等
9)TaskTracker启动一个Java child子进程
10)将结果写入HDFS 当中
二、HDFS主要模块及运行原理
Hdfs主要模块:
Hdfs的块的实际保存位置:tmpHdfsPath + /dfs/data/current/BP-126879239-192.168.1.213-1648462/cureent/finalized中,保存俩文件一个是块,一个是块的描述信息,即:blk_1073434 、blk_1073434_1015.meta
1)NameNode:
功能:是整个文件系统的管理节点。维护整个文件系统的文件目录树,文件/目录的元数据和每个文件对应的数据块列表。接收用户的请求。
存储:存储DataNode中各个文件的基本元数据信息,其中元数据存储是瓶颈,因为元数据需要保存2份,一份存在内存中(内存中有3个文件,fsimage,edits,内存中的metaData),一份序列化到硬盘上,但是内存空间有限,如果不停的保存几K的元数据,容易导致内存的不足,同时由于不停的从内存序列化到硬盘,也占CPU。
结构:
fsimage元数据镜像文件:存储某一段时间的NameNode的内存元数据信息(fsimage.ckpt文件)
edits:操作日志文件。(上传文件的过程中,不停的向edits写日志,不断的追加,直到成功后,内存的元数据才会更新元数据。edits都是从0开始的)
fstime:保存最近一次checkpoint的时间(checkpoint跟文件的一键还原点意义相同)
以上文件都保存在Linux系统中,edits日志是实时保存在磁盘,但edits与fsimage是v2.0版本,才是实时保存,2.0没有SecondaryNameNode。
2)DataNode:
以下针对Hadoop V 1.0 、V 0 的版本
SecondaryNameNode
功能:是HA(高可用性)的一个解决方案,是备用镜像,但不支持热备
执行过程:
1)Secondary通知NameNode切换edits文件
2)Secondary从NameNode中获取fsimage和edits(通过http),Secondary获取文件后,NameNode会生成新的edits.new文件,该文件从0开始。
3)Secondary将fsimage载入内存,然后开始合并
4)Secondary将新生成的fsimage,在本地保存,并将其推送到NameNode
5)NameNode替换旧的镜像。
说明:SecondNameNode默认是安装在NameNode节点上,但是这样不安全。
Yarn主要模块:ResourceManager、NodeManager
常用命令:
1、用hadoop fs 操作hdfs网盘,使用Uri的格式访问(URI格式:secheme://authority/path ,默认是hdfs://namenode:namenode port /parent path / child , 简写为/parent path / child)
2、使用start-dfs.sh启动hdfs
hbase行键设计原理~如何进行复杂表的查询~redis原理~hdfs原理~job提交过程~hbase,hive,mapreducejvm的优化方式~数据如何采集~集群的动态添加去除节点方法!
三、MapReduce运行原理
1、Map过程简述:
1)读取数据文件内容,对每一行内容解析成<k1,v1>键值对,每个键值对调用一次map函数
2)编写映射函数处理逻辑,将输入的<k1,v1>转换成新的<k2,v2>
3)对输出的<k2,v2>按reducer个数和分区规则进行分区
4)不同的分区,按k2进行排序、分组,将相同的k2的value放到同一个集合中
5)(可选)将分组后的数据重新reduce归约
2、reduce处理过程:
1)对多个Map的输出,按不同分区通过网络将copy到不同的reduce节点
2)对多个map的输出进行排序,合并,编写reduce函数处理逻辑,将接收到的数据转化成<k3,v3>
3)将reduce节点输出的数据保存到HDFS上
说明:
1)Mapper Task 是逻辑切分。因为Maper记录的都是block的偏移量,是逻辑切分,但相对于内存中他确实是物理切分,因为每个Mapper都是记录的分片段之后的数据。
2)shuffle是物理切分。MapReduce的过程是俩过程需要用到Shuffle的,1个mapper的Shufflle,1个多个reduce的Shuffle,一般每个计算模型都要多次的reduce,所以要用到多次的Shuffle。.
MapReduce原理图
正常HDFS存储3份文件,Jar包默认写10份,NameNode通过心跳机制领取HDFS任务,运行完毕后JAR包会被删除。
Map端处理流程分析:
1) 每个输入分片会交给一个Map任务(是TaskTracker节点上运行的一个Java进程),默认情况下,系统会以HDFS的一个块大小作为一个分片(hadoop2默认128M,配置dfs.blocksize)。Map任务通过InputFormat将输入分片处理成可供Map处理的<k1,v1>键值对。
2) 通过自己的Map处理方法将<k1,v1>处理成<k2,v2>,输出结果会暂时放在一个环形内存缓冲(缓冲区默认大小100M,由mapreduce.task.io.sort.mb属性控制)中,当缓冲区快要溢出时(默认为缓冲区大小的80%,由mapreduce.map.sort.spill.percent属性控制),会在本地操作系统文件系统中创建一个溢出文件(由mapreduce.cluster.local.dir属性控制,默认${hadoop.tmp.dir}/mapred/local),保存缓冲区的数据。溢写默认控制为内存缓冲区的80%,是为了保证在溢写线程把缓冲区那80%的数据写到磁盘中的同时,Map任务还可以继续将结果输出到缓冲区剩余的20%内存中,从而提高任务执行效率。
3) 每次spill将内存数据溢写到磁盘时,线程会根据Reduce任务的数目以及一定的分区规则将数据进行分区,然后分区内再进行排序、分组,如果设置了Combiner,会执行规约操作。
4) 当map任务结束后,可能会存在多个溢写文件,这时候需要将他们合并,合并操作在每个分区内进行,先排序再分组,如果设置了Combiner并且spill文件大于mapreduce.map.combine.minspills值(默认值3)时,会触发Combine操作。每次分组会形成新的键值对<k2,{v2...}>。
5) 合并操作完成后,会形成map端的输出文件,等待reduce来拷贝。如果设置了压缩,则会将输出文件进行压缩,减少网络流量。是否进行压缩,mapreduce.output.fileoutputformat.compress,默认为false。设置压缩库,mapreduce.output.fileoutputformat.compress.codec,默认值org.apache.hadoop.io.compress.DefaultCodec。
Reduce端处理流程分析:
1) Reduce端会从AM那里获取已经执行完的map任务,然后以http的方法将map输出的对应数据拷贝至本地(拷贝最大线程数mapreduce.reduce.shuffle.parallelcopies,默认值5)。每次拷贝过来的数据都存于内存缓冲区中,当数据量大于缓冲区大小(由mapreduce.reduce.shuffle.input.buffer.percent控制,默认0.7)的一定比例(由mapreduce.reduce.shuffle.merge.percent控制,默认0.66)时,则将缓冲区的数据溢写到一个本地磁盘中。由于数据来自多个map的同一个分区,溢写时不需要再分区,但要进行排序和分组,如果设置了Combiner,还会执行Combine操作。溢写过程与map端溢写类似,输出写入可同时进行。
2) 当所有的map端输出该分区数据都已经拷贝完毕时,本地磁盘可能存在多个spill文件,需要将他们再次排序、分组合并,最后形成一个最终文件,作为Reduce任务的输入。此时标志Shuffle阶段结束,然后Reduce任务启动,将最终文件中的数据处理形成新的键值对<k3,v3>。
3) 将生成的数据<k3,v3>输出到HDFS文件中。
Map与Reduce执行过程图
三 Hadoop序列化--Writable
序列化就是将内存当中的数据序列化到字节流中,
他实现了WritableComparable 接口,并继承了Writable(Write和ReadFile需要被实现)和Compare接口
1 特点:
1 )紧凑:高校使用存储空间
2 )快速:读写数据的额外开销小
3 )可扩展:可透明的读取老格式的数据
4 )互操作:支持多语言的交互
说明:JAVA 的序列化对继承等的结构都保存了,而对hadoop用不着,只需要存储字符就可以,所以有自己的机制。
Hadoop 原理总结的更多相关文章
- hadoop原理
MapReduce工作原理图文详解 前言: 前段时间我们云计算团队一起学习了hadoop相关的知识,大家都积极地做了.学了很多东西,收获颇丰.可是开学后,大家都忙各自的事情,云计算方面的动静都不太 ...
- Hadoop介绍-2.分布式计算框架Hadoop原理及架构全解
Hadoop是Apache软件基金会所开发的并行计算框架与分布式文件系统.最核心的模块包括Hadoop Common.HDFS与MapReduce. HDFS HDFS是Hadoop分布式文件系统(H ...
- Eclipse上Hadoop插件中Run On Hadoop原理[转]
通过Eclipse的hadoop插件中的"run on hadoop"命令的原理:它不是把jar包发送到hadoop集群上去运行,而只是使用了hadoop集群上的hdfs,从hdf ...
- Hadoop原理之——HDFS原理
Hadoop 3个核心组件: 分布式文件系统:Hdfs——实现将文件分布式存储在很多的服务器上(hdfs是一个基于Linux本地文件系统上的文件系统) 分布式运算编程框架:Mapreduce——实现在 ...
- Hadoop原理介绍
Hadoop核心之HDFS 架构设计 老嗨 2015-09-18 16:55:00 浏览225 评论0 摘要: 概述:HDFS即Hadoop Distributed File System分布式文 ...
- hadoop 原理: 浅析Hadoop文件格式
Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度为优势.不过,MPP数据库社区也一直批评Hadoop由于文件格式并非 为特定目的而建,因此序列化和反 ...
- [Hadoop]Hadoop章1 Hadoop原理解析
Hadoop是Apache软件基金会所开发的并行计算框架与分布式文件系统.最核心的模块包括Hadoop Common.HDFS与MapReduce. HDFS HDFS是Hadoop分布式文件系统(H ...
- 大数据组件原理总结-Hadoop、Hbase、Kafka、Zookeeper、Spark
Hadoop原理 分为HDFS与Yarn两个部分.HDFS有Namenode和Datanode两个部分.每个节点占用一个电脑.Datanode定时向Namenode发送心跳包,心跳包中包含Datano ...
- Hadoop、Pig、Hive、Storm、NOSQL 学习资源收集
(一)hadoop 相关安装部署 1.hadoop在windows cygwin下的部署: http://lib.open-open.com/view/1333428291655 http://blo ...
随机推荐
- 使用ajax实现简单的带百分比进度条
需求:当进行文件上传保存等操作时,能在页面显示一个带百分比的进度条,给用户一个好的交互体验 实现步骤 JSP页面 1.添加table标签 <table id="load" w ...
- iOS获取/删除url中的参数
1.获取URL中的某个参数: - (NSString *)getParameter:(NSString *)parameter urlStr:(NSString *)url { NSError *er ...
- react及flux架构范例Todomvc分析
react及flux架构范例Todomvc分析 通过分析flux-todomvc源码,学习如何通过react构建web程序,了解编写react应用程序的一般步骤,同时掌握Flux的单向数据流动架构思想 ...
- MySQL 主从同步 Slave_IO_Running: No
MariaDB [chen]> show slave status \G *************************** 1. row ************************* ...
- MFC项目依赖 BCG框架示例
1.创建一个简单的MFC工程: 2.将BCG框架项目导入到新建的mfc解决方案中,例如将BCGCBPro\BCGCBPRO140.vcxproj添加到解决方案. 3.修改mfc项目属性,包含BCG框架 ...
- springBoot支持PageHelp插件使用学习笔记
首先在springboot项目的maven中加入依赖(版本可能需要自己选择合适的) <dependency> <groupId>com.github.pagehelper< ...
- input宽度超出
设置样式:style=“width:100%”;即可
- intellij中导入java包
- python-读写文件的方式
open(path, flag[, encoding][, errors]) path:要打开文件的路径 flag:打开方式 r 以只读的方式打开文件,文件的描述符放在文件的开头 rb 以二进制格式打 ...
- IntelliJ IDEA 12详细开发教程(一)思想的转变与新手入门【转】
转载地址:http://bangqu.com/alicas/blog/433 从事软件开发工作以来,提高自己的开发效率,提高自己编码的规范,提高编码深度层次,这三样一直都是自己努力去追求的事情. 最近 ...