精华内容
下载资源
问答
  • hdfs工作机制及读写数据简要流程图

    千次阅读 2017-02-26 09:44:28
    hdfs工作机制及读写数据简要流程图

    概述

    1. hdfs是一个分布式文件系统,它所管理的文件被切块存储在若干台datanode服务器上
    2. hdfs提供了一个统一的目录树,用来定位hdfs中的文件,客户端访问文件是只要指定目录数即可,不用关心文件的具体物理存放位置
    3. 每一个文件的切块在hdfs的集群中都可以保存多个副本(默认3个)
    4. hdfs中有一个关键服务进程namenode,它维护了一个hdfs的目录树 及 hdfs目录结构与文件真实存储位置之间的映射关系(元数据),还有一个datanode服务进程专门负责接收和管理“文件块”– block,block的默认大小为128M(可配置) dfs.blocksize

    作业简图

    hdfs工作机制图

    写数据

    hdfs写数据

    读数据

    hdfs读数据

    展开全文
  • Shuffle工作机制

    千次阅读 2017-01-04 08:55:00
    Hadoop生态系统中,Shuffle是MapReduce的核心机制,它肩负了从Map到Reduce的底层过程。 一个切片input split对应一个mapper,mapper将数据写入到环形缓冲区; 这个环形缓冲区默认是100M,当它达到默认阀值80%的时候...

    Hadoop生态系统中,Shuffle是MapReduce的核心机制,它肩负了从Map到Reduce的底层过程。

    这里写图片描述

    1. 一个切片input split对应一个mapper,mapper将数据写入到环形缓冲区;
    2. 这个环形缓冲区默认是100M,当它达到默认阀值80%的时候,它会将数据溢写(spill)到磁盘,在写磁盘过程中,map继续输出被写到缓冲区,如果在此期间缓冲区被填满,map会阻塞直到缓冲区被填满;
    3. 溢写到磁盘的时候它并不是简单地将数据溢写,而是先进行分区(Partitioner有自定义就用自定义的,没有就用HashPartitioner),再在每个分区里对数据进行合并(Combiner);
    4. 最后它会将数据合并成一个大文件,并且是相同分区号的数据进行合并;
    5. 合并之后每个分区里面的数据再按照Key2进行合并,计算完成之后向上级提交,Hadoop1.0是TaskTracker,Hadoop2.0是MrAppMaster;
    6. Reducer通过心跳线程不停地到上级去取任务,1.0是越级到JobTracker来取,2.0是到MrAppMaster来取,Reducer得到映射关系之后通过http下载数据,下载很多小文件,再进行合并,作为输入,计算之后输出到HDFS。
    展开全文
  • MapReduce总体工作机制

    千次阅读 2019-11-20 09:10:43
    MapTask运行机制详解 整个Map阶段流程大体如图所示: 简单概述 inputFile通过split被逻辑切分为多个split文件, 通过Record按行读取内容给map(用户自己实现的)进行处理, 数据被map处理结束之后交给...

    MapTask运行机制详解

    整个Map阶段流程大体如图所示:
    在这里插入图片描述

    简单概述

    inputFile通过split被逻辑切分为多个split文件,
    通过Record按行读取内容给map(用户自己实现的)进行处理,
    数据被map处理结束之后交给OutputCollector收集器,对其结果key进行分区(默认使用hash分区),
    然后写入buffer,每个map task都有一个内存缓冲区,
    存储着map的输出结果,
    当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,
    当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并,
    生成最终的正式输出文件,然后等待reduce task来拉数据。

    Map阶段详解

    在这里插入图片描述

    详细步骤:

    1.首先,读取数据组件InputFormat(默认TextInputFormat)会通过getSplits方法对输入目录中文件进行逻辑切片规划得到splits,有多少个split就对应启动多少个MapTask。默认情况下split与block的对应关系默认是一对一。Block块默认大小是128M 那么split分割时也是按照128分割

    2.将输入文件切分为splits之后,由RecordReader对象(默认LineRecordReader)进行读取,以\n作为分隔符,读取一行数据,返回<key,value>。Key表示每行首字符偏移值,value表示这一行文本内容。

    3.读取split返回<key,value>,进入用户自己继承的Mapper类中,执行用户重写的map函数。RecordReader读取一行用户重写的map调用一次,并输出一个<key,value>。

    4.Map输出的数据会写入内存,内存中这片区域叫做环形缓冲区,缓冲区的作用是批量收集map结果,减少磁盘IO的影响。key/value对以及Partition的结果都会被写入缓冲区。当然写入之前,key与value值都会被序列化成字节数组。

    环形缓冲区其实是一个数组,数组中存放着key、value的序列化数据和key、value的元数据信息,包括partition、key的起始位置、value的起始位置以及value的长度。环形结构是一个抽象概念。

    缓冲区是有大小限制,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写。这个溢写是由单独线程来完成,不影响往缓冲区写map结果的线程。溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。

    5.合并溢写文件:每次溢写会在磁盘上生成一个临时文件(写之前判断是否有combiner),如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个临时文件存在。当整个数据处理结束之后开始对磁盘中的临时文件进行merge合并,因为最终的文件只有一个,写入磁盘,并且为这个文件提供了一个索引文件,以记录每个reduce对应数据的偏移量。
    至此map整个阶段结束。

    mapTask的一些基础设置配置(mapred-site.xml当中社会):
    设置一:设置环型缓冲区的内存值大小(默认设置如下)
    mapreduce.task.io.sort.mb:100
    设置二:设置溢写百分比(默认设置如下)
    mapreduce.map.sort.spill.percent:0.80
    设置三:设置溢写数据目录(默认设置)
    mapreduce.cluster.local.dir:${hadoop.tmp.dir}/mapred/local
    设置四:设置一次最多合并多少个溢写文件(默认设置如下)
    mapreduce.task.io.sort.factor:10
    

    个人理解—Map 输出数据到内存

    map输出的数据写入环形缓冲区(内存),缓冲区的默认大小是100M(可修改)。
    当数据达到阈值(默认0.8-可修改)时,环形缓冲区进行flash,
    环形缓冲区:数据在输出的同时,数据也可以写入空余的空间内。
    当flash的数据个数达到一定的数量时(默认4个)。对数据进行合并(merge)。

    ReduceTask 工作机制

    Reduce大致分为copy、sort、reduce三个阶段,
    重点在前两个阶段。
    copy阶段包含一个eventFetcher来获取已完成的map列表,
    由Fetcher线程去copy数据,在此过程中会启动两个merge线程,
    分别为inMemoryMerger和onDiskMerger,
    分别将内存中的数据merge到磁盘和将磁盘中的数据进行merge。
    待数据copy完成之后,copy阶段就完成了,开始进行sort阶段,sort阶段主要是执行finalMerge操作,纯粹的sort阶段,完成之后就是reduce阶段,调用用户定义的reduce函数进行处理。

    Reduce阶段详解

    在这里插入图片描述

    详细步骤

    1、Copy阶段,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求maptask获取属于自己的文件。

    2、Merge阶段。这里的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数值。Copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活。merge有三种形式:内存到内存;内存到磁盘;磁盘到磁盘。默认情况下第一种形式不启用。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的文件。

    3、合并排序。把分散的数据合并成一个大的数据后,还会再对合并后的数据排序。

    4、对排序后的键值对调用reduce方法,键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。

    个人理解----Reduce在Map拷贝数据

    Map 输出的结果写入本地,reduce主动发出拷贝进程到Map端拷贝数据。
    reduce获取大数据后,将数据写入内存,当数据达到阈值时进行flash.
    当flash的个数达到一定的量时,进行合并,最终发送给reduce

    MapReduce总体工作机制

    在这里插入图片描述
    map逻辑完之后,将map的每条结果通过context.write进行collect数据收集。在collect中,会先对其进行分区处理,默认使用HashPartitioner。
    MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。

    当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序。

    如果job设置过Combiner,那么现在就是使用Combiner的时候了。将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。Combiner会优化MapReduce的中间结果,所以它在整个模型中会多次使用。

    哪些场景才能使用Combiner呢?从这里分析,Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等(求平均值绝不能用Combiner)。Combiner的使用一定得慎重,如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。

    Split对数据进行逻辑切分

    hdfs数据块大小是128 ,split 逻辑切分数据块大小是128M
    HDFS 128 是存储层面的概念,是切分数据的分界点。
    split 128 是一个逻辑切分。
    这两个128没有关系。

    Shuffle阶段是在Map的输出到Reduce的输入

    流程角度

    在这里插入图片描述

    内存角度

    在这里插入图片描述

    更好资源:大萝卜博客网 新人建站 求支持

    展开全文
  • MapTask工作机制整个 Map 阶段流程大体如上图所示。简单概述:input File 通过 split 被 逻辑切分为多个 split 文件,通过 Record 按行读取内容给 map(用户自己实现的)进行处理,数据被 map 处理结束之后交给 ...

    MapTask工作机制

    这里写图片描述

    整个 Map 阶段流程大体如上图所示。简单概述:input File 通过 split 被
    逻辑切分为多个 split 文件,通过 Record 按行读取内容给 map(用户自己实现的)进行处理,数据被 map 处理结束之后交给 OutputCollector 收集器,对其结果 key 进行分区(默认使用 hash 分区),然后写入 buffer,每个 map task 都有一个内存缓冲区,存储着 map 的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个 map task 结束后再对磁盘中这个 map task 产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task 来拉数据。

    详细步骤:

    • 首先,读取数据组件 InputFormat (默认 TextInputFormat)会通过 getSplits方法对输入目录中文件进行逻辑切片规划得到 splits,有多少个 split 就对应启动多少个 MapTask。split 与 block 的对应关系默认是一对一。

    • 将 输 入 文 件 切 分 为 splits 之 后 , 由 RecordReader 对 象 ( 默 认LineRecordReader)进行读取,以\n 作为分隔符,读取一行数据,返回 key/value。Key 表示每行首字符偏移值,value 表示这一行文本内容。

    • 读取 split 返回 key/value,进入用户自己继承的 Mapper 类中,执行用户重写的 map 函数。RecordReader 读取一行这里调用一次。

    • map 逻辑完之后,将 map 的每条结果通过 context.write 进行 collect 数据收集。在 collect 中,会先对其进行分区处理,默认使用HashPartitioner。MapReduce 提供 Partitioner 接口,它的作用就是根据 key 或 value 及 reduce 的数量来决定当前的这对输出数据最终应该交由哪个 reduce task 处理。默认对 key hash 后再以reduce task 数量取模。默认的取模方式只是为了平均 reduce 的处理能力,如果用户自己对 Partitioner 有需求,可以订制并设置到 job 上。

    • 接下来,会将数据写入内存,内存中这片区域叫做环形缓冲区,缓冲区的作用是批量收集 map 结果,减少磁盘 IO 的影响。我们的 key/value 对以及Partition 的结果都会被写入缓冲区。当然写入之前,key 与 value 值都会被序列化成字节数组。环形缓冲区其实是一个数组,数组中存放着 key、value 的序列化数据和 key、value 的元数据信息,包括partition、key 的起始位置、value 的起始位置以及 value 的长度。环形结构是一个抽象概念。缓冲区是有大小限制,默认是 100MB。当 map task 的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为 Spill,中文可译为溢写。这个溢写是由单独线程来完成,不影响往缓冲区写 map 结果的线程。溢写线程启动时不应该阻止 map 的结果输出,所以整个缓冲区有个溢写的比例 spill.percent。这个比例默认是 0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这 80MB 的内存,执行溢写过程。Map task 的输出结果还可以往剩下的 20MB 内存中写,互不影响。

    • 当溢写线程启动后,需要对这 80MB 空间内的 key 做排序(Sort)。排序是MapReduce 模型默认的行为,这里的排序也是对序列化的字节做的排序。如果 job 设置过 Combiner,那么现在就是使用 Combiner 的时候了。将有相同 key 的 key/value 对的 value 加起来,减少溢写到磁盘的数据量。Combiner 会优化 MapReduce 的中间结果,所以它在整个模型中会多次使用。那哪些场景才能使用 Combiner 呢?从这里分析,Combiner 的输出是 Reducer 的输入,Combiner 绝不能改变最终的计算结果。Combiner 只应该用于那种 Reduce 的输入 key/value与输出 key/value 类型完全一致,且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它对 job 执行效率有帮助,反之会影响 reduce 的最终结果。

    • 每次溢写会在磁盘上生成一个临时文件(写之前判断是否有combiner),如果 map 的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个临时文件存在。当整个数据处理结束之后开始对磁盘中的临时文件进行merge 合并,因为最终的文件只有一个,写入磁盘,并且为这个文件提供了一个索引文件,以记录每个 reduce 对应数据的偏移量。

    至此 map 整个阶段结束。

    喜欢就点赞评论+关注吧

    这里写图片描述

    感谢阅读,希望能帮助到大家,谢谢大家的支持!

    展开全文
  • SpringBoot工作机制概述

    万次阅读 多人点赞 2018-01-03 10:03:48
    判断过程完成后,委托ConfigurationClassParser来解析前面找到的每一个配置类,具体解析过程在此就不展开了,回头会专门一篇关于spring context的介绍文章详细介绍。 由此我们可知,如果在springcontext refresh主...
  • 深入理解ClassLoader工作机制

    千次阅读 2019-05-05 20:30:50
    笔者在之前也只了解了皮毛,想通过这篇文章,结合一些书籍和博客,加深对ClassLoader的理解,并分享一下。 什么是class文件? xxx.class想必不陌生,JVM不会理解我们的Java源文件, 我们必...
  • Hbase Master工作机制

    千次阅读 2018-03-14 00:13:19
    Hbase Master工作机制 1、master上线 master启动进行以下步骤: 从zookeeper上获取唯一一个代表active master的锁,用来阻止其它master成为活着的master。 扫描zookeeper上的server父节点,获得当前可用的...
  • MapReduce工作机制详解

    千次阅读 2018-03-02 23:15:19
    一、MapTask工作机制 详细步骤:  首先,读取数据组件 InputFormat (默认 TextInputFormat)会通过 getSplits 方法对输入目录中文件进行逻辑切片规划得到 splits,有多少个 split 就对 应启动多少个 MapTask...
  • tomcat中Servlet的工作机制

    千次阅读 热门讨论 2016-08-22 08:27:56
    在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init、service、destroy等方法,Servlet在初始化时要调用init方法,在销毁时要...
  • MapReduce工作机制

    千次阅读 2016-05-07 12:54:34
    作业执行完毕之后将调用OutputCommitter方法对作业的信息进行最后的清理工作 失败处理 在实际场景中,用户的代码总是会有bug、程序异常和节点失效等问题,Hadoop提供了失败处理的机制尽可能的保证用户的作业...
  • 线程池工作机制与原理

    千次阅读 2016-11-10 18:19:39
    接下来记录一下线程池的工作机制和原理线程池的两个核心队列: - 线程等待池,即线程队列BlockingQueue。 - 任务处理池(PoolWorker),即正在工作的Thread列表(HashSet)。线程池的核心参数: - 核心池大小...
  • MapTask工作机制

    千次阅读 2018-11-08 00:37:46
    MapTask 并行度决定机制 一个job的map阶段并行度(个数) 由客户端提交job时的切片个数决定 一个job的map阶段并行度由客户端在提交job时决定 每一个split切片分配一个mapTask 默认 切片大小=blocksize 切片时不考虑...
  • SQLite读写同步之WAL机制

    千次阅读 2018-05-24 18:06:32
    在数据库读写操作中,经常会有人问到数据库读写同步的问题,即在数据库操作中,数据正处于状态,此时要读取的数据为空状态,问怎么操作。其实,说到这就不得不提到数据库的一个重要的机制WAL,不管是后端的PostSql...
  • [IO系统]11 回写机制(writeback)

    千次阅读 2017-02-15 08:10:19
    在Linux-3.2新内核中,page cache和buffer cache的刷新机制发生...bdi_writeback机制为每个磁盘都创建一个线程,专门负责这个磁盘的pagecache或者buffer cache的数据刷新工作,从而实现了每个磁盘的数据刷新程序在线程
  • HBase的原理及其相关的工作机制 一、HBase的flush刷新机制(溢合并机制) hbase2.0: flush溢的流程说明 2.0中内存合并的策略: 如何配置内存合并策略: 二、HBase的storeFile的合并机制 三、Hbase的split机制...
  • 由于classloader 加载类用的是全盘负责委托机制。 所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个...
  • CKPT的工作机制

    千次阅读 2013-09-07 17:02:17
    ckpt进程本身只完成两件工作: 1,执行检查点和更新控制文件和数据文件 2,将脏缓存块写入数据文件的任务交给DBWR进程完成 CKPT发送CHECKPOINT信号的触发条件: 1. log_checkpoint_timeout时间达到 2
  • QList append工作机制

    万次阅读 2013-10-15 15:57:20
    做qt的开发也有几个月了,以前一直从事c项目的开发,新工作是做qt的开发,在c和c++的异同方面一直存在着很多困惑,以后有时间打算点两者之间异同方面给的文章。 今天要解决的是一个qt方面的问题,qt上有一个QList...
  • Hadoop中SecondaryNameNode工作机制

    千次阅读 2015-01-04 20:19:17
    首先来看一下HDFS的结构,如下图: 如上图,在HDFS架构中,NameNode是职责...其实SecondaryNameNode是hadoop1.x中HDFS HA的一个解决方案,下面我们来看一下SecondaryNameNode工作的流程,如下图: 1.Nam
  • 哨兵 (sentinal) 机制工作原理

    千次阅读 2019-10-16 17:47:49
    哨兵 (sentinal) 机制工作原理 什么是哨兵机制? Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务: 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常...
  • 深入了解ViewFlipper工作机制

    千次阅读 2014-01-10 17:52:31
    另一方面,我们时常感叹ViewFlipper给我们的接口方法太少,很多常用的效果都不好做,很难施展拳脚,这篇文章将详细介绍ViewFlipper的架构以及它的工作原理,相信看了这篇文章后你会发现ViewFlipper能展现的效果也...
  • MapTask运行机制详解 整个Map阶段流程大体如图所示 简单概述 inputFile通过split被逻辑切分为多个split文件, 通过Record按行读取内容给map(用户自己实现的)进行处理, 数据被map处理结束之后交给OutputCollector...
  • zookeeper工作原理、核心机制

    万次阅读 多人点赞 2018-02-10 15:28:44
    工作原理:1.ZooKeeper是什么?ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作...
  • 2.2磁盘IO&网络IO工作机制

    万次阅读 2020-04-09 18:56:57
    磁盘I/O工作机制:访问文件 在Java中,读 & 对应了 read() & write() 两个系统调用,但只要系统调用,就会存在内核空间地址和用户空间地址切换的问题(操作系统为了保护系统安全,必须将内存空间和用户...
  • 关于CPU CACHE工作机制的学习

    万次阅读 2015-08-31 23:45:09
    关于CPU CACHE工作机制的学习 由于这段时间的工作需要,对当前CPUCACHE 高速缓存的工作原理机制进行了相对比较易通的学习和了解工作。    1. 存储层次结构 由于两个不谋而合的因素如下: l 硬件:由于不同存储...
  • 请求分页系统工作机制

    千次阅读 2016-11-13 15:53:01
    若找到要访问的页,便修改页表项中的访问位(指令则还须重置修改位),然后利用页表项中给出的物理块号和页内地址形成物理地址。 若未找到该页的页表项,应到内存中去查找页表,再对比页表项中的状态位P,看该页...
  • Yaffs2文件系统工作机制

    千次阅读 2013-11-28 19:58:47
    断断续续做文件系统相关的工作已经有段时间了,从烧写工具问文件系统都有一定的了解,但是一直没有时间整理这部分知识。因为之前的文件系统调试问题是...小时候作文最讨厌提纲了,现在想想也许老师是正确的,但是那
  • HDFS的工作机制和原理

    千次阅读 2018-05-28 11:03:43
    的内部工作机制对客户端保持透明,客户端请求访问 HDFS 都是通过向 namenode 申请来进行 HDFS数据流程 1 、根 namenode 通信请求上传文件, namenode 检查目标文件是否已存在,父目录是否存在 2 、 namenode 返回...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 788,867
精华内容 315,546
关键字:

如何写工作机制