欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

深入解析MapReduce架构设计与实现原理–读书笔记(2)作业配置及In

程序员文章站 2022-05-24 08:32:55
...

作业配置与提交 1.hadoop配置原理 包括系统默认配置和管理员自定义配置。 系统默认为:core-default.xml,hdfs-default.xml,mapred-default.xml,它们包含了所有可配置属性的默认值。 管理员自定义:core-site.xml,hdfs-site.xml,mapred-site.xml,主要用于定义

作业配置与提交

1.hadoop配置原理

包括系统默认配置和管理员自定义配置。
系统默认为:core-default.xml,hdfs-default.xml,mapred-default.xml,它们包含了所有可配置属性的默认值。
管理员自定义:core-site.xml,hdfs-site.xml,mapred-site.xml,主要用于定义一些新的配置属性或者覆盖系统默认配置文件中的属性。
每个配置属性包括4个配置参数:name,value,description,final及变量扩展功能。
final参数:如果管理员不想让用户程序修改某些属性的属性值,可将该属性的final参数设置为true
变量扩展:当读取配置文件时,如果某个属性存在对其他属性的引用,则hadoop首先查找引用的属性是否为以下2种:
1)其他已经定义的属性
2)java中system.getProperties函数可获取属性。
例如

hadoop.tmp.dir
/tmp/hadoop-${user.name}

2.MR配置与提交

每个作业由2部分组成:应用程序和作业配置。
作业配置包括2部分:环境配置和用户自定义配置。
环境配置为:mapred-site.xml,mapred-default.xml
用户自定义配置:用户自己根据作业特点个性化定制而成,比如用户可设置作业名称,以及MR Task数量等。
示例:
Configuration conf = new Configuration();
Job job = new Job(conf,”SWTest”);
job.setJarByClass(MyJob.class);
job.setMapperClass(MyJob.MyMapper.class);
job.setReducerClass(MyJob.MyReducer.class);
job.waitForCompletion(true);

InputFormat接口的设计与实现

主要用于描述输入数据的格式。提供2种功能

数据切分

按照某个策略将输入数据切分成若干个split,以便确定Map Task个数及对应的split
为Mapper提供输入数据:给定某个split,能将其解析成一个个key/value对

InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;RecordReader getRecordReader(InputSplit split,???????????????????????????????????? JobConf job, ???????????????????????????????????? Reporter reporter) throws IOException;

InputSplit特点:
1).逻辑分片
只是在逻辑上对输入数据进行分片,并不会在磁盘上将其切分成分片进行存储。InputSplit只记录分片的元数据:起始位置,长度以及所在的节点列表等。
核心算法:
文件切分算法和host选择算法。
1.1)文件切分算法
splitsize=max{minSize,min{globalSize,blockSize}}
globalSize根据用户期望的InputSplit数目计算 = totalSize/splitnum
minSize为InputSplit的最小值,由配置参数mapred.min.split.size确定
blockSize为文件在HDFS中存储的block大小
1.2)host选择算法
完成切分方案后,要确定每个InputSplit的元数据信息。文件,其实位置,长度及所在host列表。
hadoop按照本地性按照代价划分为三个等级node locality,rack locality,data center locality.
优先让空闲资源处理本节点上的数据,如果节点上没有可处理的数据,则处理同一个机架上的数据,最差情况是处理其他机架上的数据,但必须位于同一个数据中心。
虽然InputSplit对应的block可能位于多个节点上,但考虑到任务调度的效率,通常不会把所有节点加到InputSplit的host列表中,而是选择包含数据总量最大的前几个节点,以作为任务调度时判断任务是否具本地性的主要凭证。
首先,按照rack包含的数据狼对rack进行排序;在rack内部按照每个node包含的数量对node排序;最后取前N个node的host作为InputSplit的host列表。这里的N为block副本数。
注意:当使用基于FileInputFormat实现的InputFormat时,为了提高MapTask的数据本地性,应尽量使InputSplit大小与block大小相同。

2).可序列化

主要是为了进程间通信。作业被提交到JobTracker之前,Client会调用作业InputFormat中的getSplits函数,并将得到的InputSplit序列化到文件。
当作业提交到JobTracker端对作业初始化时,可直接读取该文件,解析出所有的InputSplit,并创建地应的MapTask。
getRecord方法返回一个RecordReader对象,该对象可将输入的InputSplit解析成若干个key/value对,MapReduce框架在Map Task执行过程中,会不断调用RecordReader
对象中的方法,迭代获取key/value对并交给mapper进行处理。

K key = input.createKey();V value = input.createValue();while(input.next(key,value)){//调用mapper()}input.close()

InputFormat
包括DBInputFormat,FileInputFormat,EmptyInputFormat
FileInputFormat
包括CombinFileInputFormat,NLineInputFormat,SquenceFileInputFormat,KeyValueTextInputFormat,TextInputFormat
SquenceFileInputFormat
包括SquenceFileAsBinaryInputFormat,SquenceFileAsTextInputFormat,SquenceFileInputFormat