Hadoop 学习研究(三): MR程序的基础编写和提交

来源:互联网 发布:测试周围辐射软件 编辑:程序博客网 时间:2024/06/05 11:15

Mapreduce初析

  Mapreduce是一个计算框架,既然是做计算的框架,那么表现形式就是有个输入(input),mapreduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(output),这个输出就是我们所需要的结果。

  我们要学习的就是这个计算模型的运行规则。在运行一个mapreduce计算任务时候,任务过程被分为两个阶段:map阶段和reduce阶 段,每个阶段都是用键值对(key/value)作为输入(input)和输出(output)。而程序员要做的就是定义好这两个阶段的函数:map函数 和reduce函数。


就以最基础的wordCount为例解释一下:

Map实现:默认文本行读取,将每个单词进行提取,并且计数为1

  1.         public void map(LongWritable key, Text value, Context context)  
  2.                 throws IOException, InterruptedException {  
  3.             String line = value.toString();  
  4.             StringTokenizer token = new StringTokenizer(line);  
  5.             while (token.hasMoreTokens()) {  
  6.                 word.set(token.nextToken());  
  7.                 context.write(word, one);  
  8.             }  
  9.         }  
    

在Map --> Reduce过程中,如果不对框架进行sort和Group等进行额外的设置,框架会自动按照key值对value进行迭代,生成value值列表。

Reduce实现:对key,和相应的Iterable<>值进行相加,

  1.         public void reduce(Text key, Iterable<IntWritable> values,  
  2.                 Context context) throws IOException, InterruptedException {  
  3.             int sum = 0;  
  4.             for (IntWritable val : values) {  
  5.                 sum += val.get();  
  6.             }  
  7.             context.write(key, new IntWritable(sum));  
  8.         }  

程序驱动模式:

  1.         Configuration conf = new Configuration();  
  2.         Job job = new Job(conf);  
  3.         job.setJarByClass(WordCount.class);  
  4.         job.setJobName("wordcount");  
  5.   
  6.         job.setOutputKeyClass(Text.class);  
  7.         job.setOutputValueClass(IntWritable.class);  
  8.   
  9.         job.setMapperClass(WordCountMap.class);  
  10.         job.setReducerClass(WordCountReduce.class);  
  11.   
  12.         job.setInputFormatClass(TextInputFormat.class);  
  13.         job.setOutputFormatClass(TextOutputFormat.class);  
  14.   
  15.         FileInputFormat.addInputPath(job, new Path(args[0]));  
  16.         FileOutputFormat.setOutputPath(job, new Path(args[1]));  
  17.   
  18.         job.waitForCompletion(true);

查看相应的结果
  1. hadoop@ubuntu:~$ hadoop fs -cat wcoutput3/part-r-00000  
  2. !!      2  
  3. !ci.*.*.us      1  
  4. !co.*.*.us      1  
  5. !town.*.*.us    1  
  6. "AS     22  
  7. "Accept"        1  
  8. "Accept-Language"       1  
  9. "License");     22  
  10. "NOW"   1  
  11. "WiFi"  1  
  12. "Z"     1  
  13. "all"   1  
  14. "content"       1  
  15. "delete 1  
  16. "delimiter"     1  

在Hadoop中常用的命令有如下几种:

hadoop  fs  -ls                         //列出文件

hadoop  fs  -put  文件名  文件在hdfs上地址

hadoop  fs  -get  文件名                     //下载文件

hadoop  fs  -rm  -r  文件目录                  //删除某个目录

hadoop  jar  文件.jar  执行的类名             //在集群上执行hadoop任务

yarn  application  -kill   JobID号             //在集群上kill一个应用(别把别人提交的应用kill了)

yarn  logs  -applicationId    app的ID号      //查看某个应用的日志


日志的查看也可以在你的hadoop安装目录下 logs中进行查看,里面有app的,有资源管理器、namenode、datanode、historyserver等。如果一个应用程序出现什么问题,都可以对日志文件进行查看来判断问题的所在。




Hadoop中MR程序的几种提交运行模式

1:在Windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行

----输入输出数据可以放在本地路径下(c:/wc/srcdata/)

----输入输出数据也可以放在hdfs中(hdfs://weekend110:9000/wc/srcdata)


2:在Linux的eclipse里面直接运行main方法,但是不要添加yarn相关的配置文件,也会提交给localjobrunner执行

----输入输出数据可以放在本地路径下(/home/Hadoop/wc/srcdata/)

----输入输出数据也可以放在hdfs中(hdfs://weekend110:9000/wc/srcdata)

 

集群模式运行

1:将工程打成jar包,上传到服务器,然后用 hadoop 命令提交  hadoop jar wc.jar cn.intsmaze.hadoop.mr.wordcount.WCRunner

程序编写好以后要打包成jar包放到 hadoop集群 上进行运行。这里打包的jar包名为wc.jar。

先把文件上传到linux目录,然后在该目录下使用指令将该jar分发到hadoop集群中并指定运行哪一个程序。

hadoop jar wc.jar cn.intsmaze.hadoop.mr.WCRunner(指定运行java类的完整路径)这个时候程序就执行了。


2:在linux的eclipse中直接运行main方法,也可以提交到集群中去运行,但是,必须采取以下措施:

----在工程src目录下加入 mapred-site.xml  和  yarn-site.xml (这两个文件在搭建hdfs时修改了的见hdfs文件夹下的搭建日志)

----将工程打成jar包(wc.jar),同时在main方法中添加一个conf的配置参数

Configuration conf = newConfiguration();conf.set("mapreduce.job.jar","wc.jar");

JAR包的位置要在运行程序的工程里面。


3:在windows的eclipse中直接运行main方法,也可以提交给集群中运行,但是因为平台不兼容,需要做很多的设置修改(很麻烦忽略)

----要在windows中存放一份hadoop的安装包(解压好的)

----要将其中的lib和bin目录替换成根据你的windows版本重新编译出的文件

----再要配置系统环境变量 HADOOP_HOME  和 PATH

----修改YarnRunner这个类的源码



0 0