热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

maptask的并行度

maptask的并行度maptask:执行map阶段的任务称为maptask。并行度:maptask一起执行的个数换句话说在一个job中就是maptas

maptask的并行度


maptask:执行map阶段的任务称为maptask。
并行度:maptask一起执行的个数 换句话说在一个job中就是maptask运行的个数。


maptask运行的并行度:


底层的数据如何存储的:分块多副本存储的
300M文件
blk1:0-127M
blk2:128-255M
blk3:256-300M
maptask运行的个数 和数据的大小有关
一个maptask----> 对应的数据量?
130M—> 数据的跨节点传输的问题
100M—> 数据存在跨节点传输的问题
1个maptask-----> 一个数据块的大小 128M
事实上一个maptask对应的数据是一个逻辑切片的大小
一个逻辑切片---- 128M 一个块的大小
逻辑切片:逻辑上的概念 一个数据偏移范围的划分 并没有真正的切分数据
物理切片:是逻辑切片的对立面
一个逻辑切片对应一个maptask任务


底层源码:


FileInputFormat 文件加载器
getSplits方法 获取所有的切片


/** * Generate the list of files and make them into FileSplits.* @param job the job context* @throws IOException* 切片获取的方法* InputSplit 代表文件切片对象* 返回值:List 所有文件切片的列表* 参数:JobContext job job的上下文对象*/public List getSplits(JobContext job) throws IOException {StopWatch sw = new StopWatch().start();//获取最小切片大小/*getFormatMinSplitSize() :1getMinSplitSize(job):0minSize =1*/long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));//切片最大大小long maxSize = getMaxSplitSize(job);// generate splits//最终返回的list集合List splits = new ArrayList();//获取FileInputFormat.addInputPath("")输入路径下的所有文件状态信息对象,包含块大小信息List files = listStatus(job);//循环遍历每一个文件的状态信息for (FileStatus file: files) {Path path = file.getPath();//获取文件的实际长度long length = file.getLen();if (length != 0) {BlockLocation[] blkLocations;if (file instanceof LocatedFileStatus) {blkLocations = ((LocatedFileStatus) file).getBlockLocations();} else {FileSystem fs = path.getFileSystem(job.getConfiguration());blkLocations = fs.getFileBlockLocations(file, 0, length);}//判断是否可以逻辑切片if (isSplitable(job, path)) {//获取配置的块大小,默认128Mlong blockSize = file.getBlockSize();//核心 计算每一个切片大小的/*blockSize:128MminSize:1maxSize:Long.MAX_VALUE*/long splitSize = computeSplitSize(blockSize, minSize, maxSize);//计算切片剩余大小long bytesRemaining = length;//切片/*是否还进行切分的条件SPLIT_SLOP //切片的临界值 =1.1剩余大小/128M > 1.1剩余大小>128M * 1.1 140+((double) bytesRemaining)/splitSize > SPLIT_SLOP*/while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);splits.add(makeSplit(path, length-bytesRemaining, splitSize,blkLocations[blkIndex].getHosts(),blkLocations[blkIndex].getCachedHosts()));bytesRemaining -= splitSize;}if (bytesRemaining != 0) {int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);splits.add(makeSplit(path, length-bytesRemaining, bytesRemaining,blkLocations[blkIndex].getHosts(),blkLocations[blkIndex].getCachedHosts()));}} else { // not splitablesplits.add(makeSplit(path, 0, length, blkLocations[0].getHosts(),blkLocations[0].getCachedHosts()));}} else { //Create empty hosts array for zero length filessplits.add(makeSplit(path, 0, length, new String[0]));}}// Save the number of input files for metrics/loadgenjob.getConfiguration().setLong(NUM_INPUT_FILES, files.size());sw.stop();if (LOG.isDebugEnabled()) {LOG.debug("Total # of splits generated by getSplits: " + splits.size()+ ", TimeTaken: " + sw.now(TimeUnit.MILLISECONDS));}return splits;}

//最小切片大小
/*** Get the minimum split size* @param job the job* @return the minimum number of bytes that can be in a split* job.getConfiguration():获取job的所有配置文件信息,写到 job.xml中 * job.settJarByClass(Driver.class);jar.classDriver.class,没有配置的则使用默认值* getLong(配置属性名,默认返回值),先去配置文件中获取配置属性的值,获取到则返回,获取不到则返回默认值(参数2)。* mapreduce.input.fileinputformat.split.minsize,默认是:0* mapred-default.xml ------> return 0*r*/public static long getMinSplitSize(JobContext job) {return job.getConfiguration().getLong(SPLIT_MINSIZE, 1L);}

//最大切片大小
/*** Get the maximum split size.* @param context the job to look at.* @return the maximum number of bytes a split can include* */public static long getMaxSplitSize(JobContext context) {/*** context.getConfiguration(),获取job.xml* mapreduce.input.fileinputformat.split.maxsize,默认没有设置* return Long.MAX_VALUE*/return context.getConfiguration().getLong(SPLIT_MAXSIZE, Long.MAX_VALUE);}

//计算切片大小/*Math.max(minSize,blockSize)return blockSize 默认一个切片的大小就是一个块的大小调整切片大小大于128M ----->调整minSize小于128M ----->调整maxSize具体操作&#xff1a;//不推荐使用1&#xff09;修改配置文件&#xff1a;mapred-site.xml大于128Mmapreduce.input.fileinputformat.split.minsize130*1024*1024The minimum size chunk that map input should be splitinto. Note that some file formats may have minimum split sizes thattake priority over this setting.小于128Mmapreduce.input.fileinputformat.split.maxsize100*1024*1024The minimum size chunk that map input should be splitinto. Note that some file formats may have minimum split sizes thattake priority over this setting.2&#xff09;代码中修改//修改大于128MFileInputFormat.setMinInputSplitSize(job, size);//修改小于128MFileInputFormat.setMaxInputSplitSize(job, size);注意:1)一个文件如果不大于128M&#xff0c;这时候单独成一个切片文件大于128M&#xff0c;按照分块来2)文件切片划分的时候&#xff0c;最后一个切片有可能大于128M&#xff0c;128*1.1268M存储blk01 1-128Mblk02 129-256M 128Mblk03 257-268M 12M启动maptask时候 切片划分&#xff1a;split01 268/128>1.1 1-128剩余 268-128&#61;140Msplit02 140/128<1.1 不切 129-268M跨块或跨节点 比单独启动一个maptask划算*/protected long computeSplitSize(long blockSize, long minSize,long maxSize) {return Math.max(minSize, Math.min(maxSize, blockSize));}

合并小文件


默认的FileInputFormat的实现&#xff1a;TextInputFormat,这种方式 一个文件读一次&#xff0c;不会进行合并。
///逻辑合并&#xff0c;maptask的输入&#xff0c;将多个小文件合并到一个maptask中&#xff0c;根据切片大小进行合并的 &#xff0c;逻辑切片进行合并的时候&#xff0c;并不会进行真正的合并&#xff0c;
//合并的时候&#xff0c;根据切片的大小进行合并文件&#xff0c;输入的时候多喝小文件启动一个maptask任务。
job.setInputFormatClass(CombineTextInputFormat.class);
//设置切片大小 >128M
CombineTextInputFormat.setMinInputSplitSize(job, 13010241024);
//指定输入&#xff0c;设置切片大小
FileInputFormat.setMinInputSplitSize(job, 13010241024);



总结&#xff1a;一个maptask------一个yarnchild--------一个逻辑切片的数据------>默认大小block的大小。



逻辑切块和切块的区别&#xff1a;
1&#xff09;逻辑切片是逻辑概念&#xff0c;范围的划分
切块是真实的物理切分
2&#xff09;逻辑切片针对的是mapreduce运行过程&#xff0c; 对应的是maptask
切块针对于数据的存储



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
author-avatar
牛涛fd_501
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有