专做西餐的网站,做影视类短视频的资源网站,计算机ui设计是什么,凡科建站转载http://my.oschina.net/Chanthon/blog/150500 map和reduce是hadoop的核心功能#xff0c;hadoop正是通过多个map和reduce的并行运行来实现任务的分布式并行计算#xff0c;从这个观点来看#xff0c;如果将map和reduce的数量设置为1#xff0c;那么用户的任务就没有并行… 转载http://my.oschina.net/Chanthon/blog/150500 map和reduce是hadoop的核心功能hadoop正是通过多个map和reduce的并行运行来实现任务的分布式并行计算从这个观点来看如果将map和reduce的数量设置为1那么用户的任务就没有并行执行但是map和reduce的数量也不能过多数量过多虽然可以提高任务并行度但是太多的map和reduce也会导致整个hadoop框架因为过度的系统资源开销而使任务失败。所以用户在提交map/reduce作业时应该在一个合理的范围内这样既可以增强系统负载匀衡也可以降低任务失败的开销。 1 map的数量 map的数量通常是由hadoop集群的DFS块大小确定的也就是输入文件的总块数正常的map数量的并行规模大致是每一个Node是10~100个对于CPU消耗较小的作业可以设置Map数量为300个左右但是由于hadoop的每一个任务在初始化时需要一定的时间因此比较合理的情况是每个map执行的时间至少超过1分钟。具体的数据分片是这样的InputFormat在默认情况下会根据hadoop集群的DFS块大小进行分片每一个分片会由一个map任务来进行处理当然用户还是可以通过参数mapred.min.split.size参数在作业提交客户端进行自定义设置。还有一个重要参数就是mapred.map.tasks这个参数设置的map数量仅仅是一个提示只有当InputFormat 决定了map任务的个数比mapred.map.tasks值小时才起作用。同样Map任务的个数也能通过使用JobConf 的conf.setNumMapTasks(int num)方法来手动地设置。这个方法能够用来增加map任务的个数但是不能设定任务的个数小于Hadoop系统通过分割输入数据得到的值。当然为了提高集群的并发效率可以设置一个默认的map数量当用户的map数量较小或者比本身自动分割的值还小时可以使用一个相对交大的默认值从而提高整体hadoop集群的效率。 2 reduce的数量 reduce在运行时往往需要从相关map端复制数据到reduce节点来处理因此相比于map任务。reduce节点资源是相对比较缺少的同时相对运行较慢正确的reduce任务的个数应该是0.95或者1.75 *节点数 ×mapred.tasktracker.tasks.maximum参数值。如果任务数是节点个数的0.95倍那么所有的reduce任务能够在 map任务的输出传输结束后同时开始运行。如果任务数是节点个数的1.75倍那么高速的节点会在完成他们第一批reduce任务计算之后开始计算第二批 reduce任务这样的情况更有利于负载均衡。同时需要注意增加reduce的数量虽然会增加系统的资源开销但是可以改善负载匀衡降低任务失败带来的负面影响。同样Reduce任务也能够与 map任务一样通过设定JobConf 的conf.setNumReduceTasks(int num)方法来增加任务个数。 3 reduce数量为0 有些作业不需要进行归约进行处理那么就可以设置reduce的数量为0来进行处理这种情况下用户的作业运行速度相对较高map的输出会直接写入到 SetOutputPath(path)设置的输出目录而不是作为中间结果写到本地。同时Hadoop框架在写入文件系统前并不对之进行排序。 map red.tasktracker.map.tasks.maximum 这个是一个task tracker中可同时执行的map的最大个数默认值为2看《pro hadoop》it is common to set this value to the effective number of CPUs on the node 把ob分割成map和reduce,合理地选择Job中 Tasks数的大小能显著的改善Hadoop执行的性能。增加task的个数会增加系统框架的开销但同时也会增强负载均衡并降低任务失败的开销。一个极端是1个map、1个reduce的情况这样没有任务并行。另一个极端是1,000,000个map、1,000,000个reduce的情况会由于框架的开销过大而使得系统资源耗尽。 Map任务的数量 Map的数量经常是由输入数据中的DFS块的数量来决定的。这还经常会导致用户通过调整DFS块大小来调整map的数量。正确的map任务的并行度似乎应该是10-100 maps/节点尽管我们对于处理cpu运算量小的任务曾经把这个数字调正到300maps每节点。Task的初始化会花费一些时间因此最好控制每个 map任务的执行超过一分钟。 实际上控制map任务的个数是很 精妙的。mapred.map.tasks参数对于InputFormat设定map执行的个数来说仅仅是一个提示。InputFormat的行为应该把输入数据总的字节值分割成合适数量的片段。但是默认的情况是DFS的块大小会成为对输入数据分割片段大小的上界。一个分割大小的下界可以通过一个mapred.min.split.size参数来设置。因此如果你有一个大小是10TB的输入数据并设置DFS块大小为 128M你必须设置至少82K个map任务除非你设置的mapred.map.tasks参数比这个数还要大。最终InputFormat 决定了map任务的个数。 Map任务的个数也能通过使用JobConf 的 conf.setNumMapTasks(int num)方法来手动地设置。这个方法能够用来增加map任务的个数但是不能设定任务的个数小于Hadoop系统通过分割输入数据得到的值。 Reduce任务的个数 正确的reduce任务的 个数应该是0.95或者1.75 ×节点数 ×mapred.tasktracker.tasks.maximum参数值。如果任务数是节点个数的0.95倍那么所有的reduce任务能够在 map任务的输出传输结束后同时开始运行。如果任务数是节点个数的1.75倍那么高速的节点会在完成他们第一批reduce任务计算之后开始计算第二批 reduce任务这样的情况更有利于负载均衡。 目前reduce任务的数量 由于输出文件缓冲区大小(io.buffer.size × 2 ×reduce任务个数 堆大小)被限制在大约1000个左右。直到能够指定一个固定的上限后这个问题最终会被解决。 Reduce任务的数量同时也控制着输出目录下输出文件的数量但是通常情况下这并不重要因为下一阶段的 map/reduce任务会把他们分割成更加小的片段。 Reduce任务也能够与 map任务一样通过设定JobConf 的conf.setNumReduceTasks(int num)方法来增加任务个数。 转载于:https://www.cnblogs.com/huifeidezhuzai/p/9245658.html