array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 Hadoop-MapReduce Shuffle原理及调优 - 爱码网

Shuffle过程图:
Hadoop-MapReduce Shuffle原理及调优
Hadoop-MapReduce Shuffle原理及调优
Hadoop-MapReduce Shuffle原理及调优

Map端:
  1.Collect:
    Map端不是直接把数据写入本地磁盘,而是先写入一个环形缓冲区,
    每个Map任务都有一个区,由io.sort.mb属性控制缓冲区大小。

  2.sort:
    将数据按照分区分好,并且在分区内实现按Key升序排序

  2*.Combiner:
     若有Combiner,在上面分区内sort的输出结果基础上再执行Combiner,
     相当于一次局部Reduce,精简数据,减少IO传输和网络传输的负担。

  3.spill(溢写)
  3.1.当缓冲区的数量达到一定值(由io.sort.spill.percent属性控制,默认为0.8),
      会启动一个后台线程将缓冲区中的数据溢写到本地磁盘。
  3.2.在该过程中,Map任务继续将数据送到缓冲区;
      若缓冲区已满,就会阻塞Map任务。
  3.3.线程写入按分区依次写入文件。分区在文件里也称作segmen(段)。
  3.4.spill文件位置由mapred.local.dir指定。
  3.5.输出到磁盘前可对数据先进行压缩,由mapred.compress.map.output属性控制
      默认为false。

  4.Merge:
    Map输出的数据量很大,溢写出来的文件很多,就是用Merge来合并文件。
    例如:一个文件中的(“aaa”,5)和另一个文件中的(“aaa”,7),更多的相同Key,
         会合并为(“aaa”,[5,7,···])。


Reduce端:
  1.copy:
  1.1.Reduce任务拥有多个线程去拉取拷贝Map的输出,
      线程数由mapred.reduce.parallel.copies控制,默认为5.
  1.2.由于很多Map任务,不是同时完成的,因此当完成了的Map数占中的Map数一定比例,
      Reduce任务就开始拉数据。
      由mapred.reduce.slowstart.completed.maps控制,默认为0.05(即20%完成)
  1.3.每个节点都有HTTP Server,当有Map output请求,HTTP Server就读取
      Map到这个Reduce对应的文件通过网络发送给Reduce任务。

  2.sort (包括 Merge):
  2.1.由于Map传输过来的数据是局部有序的,所以在调用sort实现实现一个
      Reduce任务里的有序。
  2.2.通过不断归并Map输出,归并排序(Merge and Sort)。
  2.3.若有50个Map输出,归并因子为10,即一次将归并10个文件归并成一个文件,
      归并成5个文件,需5次Merge。
      归并因子由io.sort.factor控制。

Shuffle调优:
Map端:

1) io.sort.mb

用于map输出排序的内存缓冲区大小

类型:Int

默认:100mb

备注:如果能估算map输出大小,就可以合理设置该值来尽可能
     减少溢出写的次数,这对调优很有帮助。
2)io.sort.spill.percent

map输出排序时的spill阀值(即使用比例达到该值时,将缓冲区中的内容spill 到磁盘)

类型:float

默认:0.80
3)io.sort.factor

归并因子(归并时的最多合并的流数),map、reduce阶段都要用到

类型:Int

默认:10

备注:将此值增加到100是很常见的。
4)mapred.compress.map.output

map输出是否压缩

类型:Boolean

默认:false

备注:如果map输出的数据量非常大,那么在写入磁盘时压缩数据往往是个很好的主意,
     因为这样会让写磁盘的速度更快,节约磁盘空间,并且减少传给reducer的数据量。
5)mapred.map.output.compression.codec

用于map输出的压缩编解码器

类型:Classname

默认:org.apache.hadoop.io.compress.DefaultCodec

备注:推荐使用LZO压缩。Intel内部测试表明,相比未压缩,
     使用LZO压缩的 TeraSort作业,运行时间减少60%,且明显快于Zlib压缩。
6) tasktracker.http.threads

每个tasktracker的工作线程数,用于将map输出到reducer。

(注:这是集群范围的设置,不能由单个作业设置)

类型:Int

默认:40

备注:tasktracker开http服务的线程数。用于reduce拉取map输出数据,
     大集群可以将其设为40~50。

Reduce端:

1)mapred.reduce.slowstart.completed.maps

调用reduce之前,map必须完成的最少比例

类型:float

默认:0.05
2)mapred.reduce.parallel.copies

reducer在copy阶段同时从mapper上拉取的文件数

类型:int

默认:5

参考:https://blog.csdn.net/shudaqi2010/article/details/80266834

相关文章: