《程序设计基础》课程实训报告 1056426976

发布时间:2023-06-28 14:06:22浏览次数:72
《程序设计基础》课程实训报告概述 是一个使用简易的软件框架,基于它写出来的应用程序能够运行在 由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上  级别的数据集。一个 作业() 通常会把输入的数据集切分为若干独立的数据块,由  任务()以完全并行的方式处理它们。框架会对  的输出先进行排序, 然后把结果输入给  任务。通常作业的输入和输出都会被存储在文件系统中。 整个框架负责任务的调度和监控,以及重新执行已经失败的任务。通常, 框架和分布式文件系统是运行在 一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些 已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。 框架由单独一个 和每个集群节点一个  共同组成。这个  负责调度构成一个作业的所有任务, 这些任务分布在不同的  上, 监控它们的执行,重新执行已经失败的任务。而 仅负责执行由  指派的任务。应用程序至少应该指明输入输出的位置(路径),并通过实现合适的接口或抽象类提供 和  函数。 再加上其他作业的参数,就构成了作业配置()。然后, 的 提交作业( 包可执行程序 等)和配置信息给 ,后者负责分发这些软件和配置信息 给 、调度任务且监控它们的执行,同时提供状态和诊断信息给 。虽然  框架是用  实现的,但  应用程序则不一定要用  来写 。   是一种运行作业的实用工具,它允许用户创建和运行任何可执行程序 (例如: 工具)来做为  和 。   是一个与 !"# 兼容的 $%%& "(没有基于 '"技术),它也可用于实现 应用程序。输入与输出 框架运转在()*+键值对上,也就是说, 框架把作业的输入看为是一组()*+键值对,同样也产出一组 ()*+键值对做为作业的输出,这两组键值对的类型可能不同。框架需要对 ) 和  的类,-进行序列化操作, 因此,这些类需要实现 ! 接口。 另外,为了方便框架执行排序操作,) 类必须实现 !$ 接口。一个 作业的输入和输出类型如下所示:,-(.*.+++(/*/+++(/*/+++(0*0+,-作业配置老接口 $1 代表一个  作业的配置。$1 的功能已被新的类$ 和  替换。$ 类描述了资源,这些资源大多都是从 23 配置文件中读取的属性和值组成。比如来自 145 和 45。 描述了用户角度的视图,它允许用户配置、提交、控制它的执行和查询状态。只有在作业提交之后才能使用  方法。',- 设置  的任务数;6)$,- 设置  包的类来源;$,- 设置实现的  类; $$,- 设置实现的 $ 类;$,- 设置实现的  类;"7$,- 设置实现的 "7 类;89)$,- 设置最终的输出 ) 类;8:$,- 设置最终的输出 : 类。默认情况下使用的是 7"7 类作为 "7 类。MapReduce 编程接口参数 作用 缺省值 其它实现InputFormat 将输入的数据集切割成小数据集 InputSplits, 每一个 InputSplit 将由一个 Mapper 负责处理。此外 InputFormat 中还提供一个RecordReader 的实现, 将一个 InputSplit 解析成 <key,value> 对提供给 map 函数。TextInputFormat(针对文本文件,按行将文本文件切割成 InputSplits, 并用 LineRecordReader 将 InputSplit 解析成 <key,value> 对,key 是行在文件中的位置,value 是文件中的一行) SequenceFileInputFormat OutputFormat提供一个 RecordWriter 的实现,负责输出最终结果TextOutputFormat(用 LineRecordWriter 将最终结果写成纯文件文件,每个 <key,value> 对一行,key 和 value 之间用 tab 分隔) SequenceFileOutputFormatOutputKeyClass 输出的最终结果中 key 的LongWritable % 类型OutputValueClass 输出的最终结果中 value 的类型Text %MapperClass Mapper 类,实现 map 函数,完成输入的 <key,value> 到中间结果的映射IdentityMapper(将输入的 <key,value> 原封不动的输出为中间结果) LongSumReducer,LogRegexMapper,InverseMapper CombinerClass 实现 combine 函数,将中间结果中的重复 key 做合并null(不对中间结果中的重复 key 做合并) %ReducerClassReducer 类,实现 reduce 函数,对中间结果做合并,形成最终结果IdentityReducer(将中间结果直接输出为最终结果) AccumulatingReducer, LongSumReducer InputPath 设定 job 的输入目录, job 运行时会处理输入目录下的所有文件null %OutputPath 设定 job 的输出目录,job 的最终结果会写入输出目录下null %MapOutputKeyClass 设定 map 函数输出的中间结果中 key 的类型如果用户没有设定的话,使用 OutputKeyClass %MapOutputValueClass 设定 map 函数输出的中间结果中 value 的类型如果用户没有设定的话,使用 OutputValuesClass %OutputKeyComparator 对结果中的 key 进行排序WritableComparable % 时的使用的比较器PartitionerClass 对中间结果的 key 排序后,用此 Partition 函数将其划分为 R 份,每份由一个 Reducer 负责处理。HashPartitioner(使用 Hash 函数做 partition) KeyFieldBasedPartitioner PipesPartitioner 在这里,我们重点讨论如何去实现"7、"、、 和  类。新接口可在4444;名字空间下找到。相关类的工作流程:(.)首先是 "7 类,该类的 ,-方法生成元素为" 的 3,这个类是在  提交的时候被执行的,并且 ,-方法创建相应的读记录类 ;(/)对于每个 " 都由一个 类来处理,产生(9*:+对,然后将结果交由  类来处理,一个" 对应于一个  和一个 ;(0)通过  类中的59):,-的迭代,每个  产生的(9*:+对,执行一次  类中的 ,-;(<) 产生的(9*:+对经过组合形成(9*31:+*然后  的,-对这样的组合进行操作,并产生新的(9=*:=+对,有  个  就对所有的(9*31:+分成  份,每份将产生一个输出,由 87 类来处理。InputFormat<K, V>用户可以定制自己的 "7 类,也就是实现一个 "7 子类,需要注意的是 9 类型必须实现 !$ 接口,: 类型必须实现 ! 接口。对于文件处理可以继承 7"7 类,再细一点,如果文本文件,可以直接使用5"7 类,如果二进制文件,可以直接使用 >7"7 类。对于 "7 的子类,必须实现 3("+,$55-方法和 (9*:+,"* &$55-方法。这里牵涉到另外四个类"、、$5 和 &$5。$5 是运行期的作业上下文,&$5 是运行期的尝试任务上下文。InputSplit用户可以定制自己的 " 类,也就是实现一个 " 子类,并且实现! 接口。" 子类必须实现 3,-和 ?@3,-方法,前者获取当前  的长度,后者获取  分布的主机。当然还必须实现 ! 接口的7,-和 A,-。对于文件类型的数据,可以使用 7,该类是以不超过分布在主机的单个块的大小为  块大小。RecordReader<K, V>用户可以定制自己的  类,也就是实现一个  子类。 子类必须实现 B,"*&$55-,59):,-*9$9),-*:$:,-*C ,-和 ,-。在 B,-函数的参数  就是上面的 " 子类,这类面最关键的就是 59):,-函数,它对当前  中的 9) 和 : 进行迭代查找,对于每个(9*:+执行一次  类的 ,-函数。对于文本文件,可以使用3 类,该类按行来读取  块中的内容。Mapper<KIN, VIN, KOUT, VOUT>用户可以定制自己的  类,也就是实现一个  子类。 子类必须实现 ,9*:*$5-方法,每处理一个(9*:+*交由 $5 类来处理,一般情况下有 $54A,-来写结果。Reducer<KIN, VIN, KOUT, VOUT> 用户可以定制自己的  类,也就是实现一个  子类。 子类必须实现 ,9*:*"(:+*$55-方法,每处理一个(9*31:+*交由 $5 类来处理,一般情况下有 $54A,-来写结果。 
文档格式: docx,价格: 5下载文档
返回顶部