设为首页 收藏本站
查看: 1087|回复: 0

[经验分享] [hadoop源码阅读][9]-mapreduce-从wordcount开始

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-11 10:29:38 | 显示全部楼层 |阅读模式
  1.wordcount的代码如下   


public class WordCount
{
public static class TokenizerMapper extends Mapper
{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context ) throws IOException, InterruptedException
{
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens())
{
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer extends Reducer
{
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable values,Context context) throws IOException, InterruptedException
{
int sum = 0;
for (IntWritable val : values)
{
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception
{
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2)
{
System.err.println("Usage: wordcount  ");
System.exit(2);
}
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
  
  
  2.一个可以运行的mapreduce程序可以包含哪些元素呢?
JobConf 常用可定制参数

  
  


参数

  
  


作用

  
  


缺省值

  
  


其它实现

  
  


InputFormat

  
  


将输入的数据集切割成小数据集 InputSplits, 每一个 InputSplit 将由一个 Mapper 负责处理。此外 InputFormat 中还提供一个 RecordReader 的实现, 将一个 InputSplit 解析成  对提供给 map 函数。

  
  


TextInputFormat
(针对文本文件,按行将文本文件切割成 InputSplits, 并用 LineRecordReader 将 InputSplit 解析成  对,key 是行在文件中的位置,value 是文件中的一行)

  
  


SequenceFileInputFormat

  
  


OutputFormat

  
  


提供一个 RecordWriter 的实现,负责输出最终结果

  
  


TextOutputFormat
(用 LineRecordWriter 将最终结果写成纯文件文件,每个  对一行,key 和 value 之间用 tab 分隔)

  
  


SequenceFileOutputFormat

  
  


OutputKeyClass

  
  


输出的最终结果中 key 的类型

  
  


LongWritable

  
  


OutputValueClass

  
  


输出的最终结果中 value 的类型

  
  


Text

  
  


MapperClass

  
  


Mapper 类,实现 map 函数,完成输入的  到中间结果的映射

  
  


IdentityMapper
(将输入的  原封不动的输出为中间结果)

  
  


LongSumReducer,
LogRegexMapper,
InverseMapper

  
  


CombinerClass

  
  


实现 combine 函数,将中间结果中的重复 key 做合并

  
  


null
(不对中间结果中的重复 key 做合并)

  
  


ReducerClass

  
  


Reducer 类,实现 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

  
  




  
  
  
  比较容易疑惑的是:

  InputFormat:读取输入文件,以自定义map的输入数据格式,传给map.(如下红色字体)
public static class TokenizerMapper extends Mapper
  
  MapOutputKeyClass,MapOutputValueClass:定义了map的输出数据的格式,reduce的输入数据格式
  public static class TokenizerMapper extends Mapper
  public static class IntSumReducer extends Reducer
  
  OutputKeyClass,OutputValueClass:定义了reduce的输出数据格式,OutputFormat的输入格式
  public static class IntSumReducer extends Reducer
  
  OutputFormat:将mapreduce的结果数据写入到文件中去
  
  OutputKeyComparator/OutputValueGroupingComparator:二次排序用的

  
  参考文献:
  1.http://hadoop.apache.org/docs/r0.19.1/cn/mapred_tutorial.html
  2.http://caibinbupt.iteye.com/blog/338785
  3.http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop2/index.html
  4.http://www.riccomini.name/Topics/DistributedComputing/Hadoop/SortByValue/
  5.http://blog.iyunv.com/chjjunking/article/details/6747011

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85455-1-1.html 上篇帖子: [hadoop源码阅读][9]-mapreduce-job提交过程 下篇帖子: hadoop SecondaryNameNode和NameNode
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表