MyException - 我的异常网
当前位置:我的异常网» 编程 » Hadoop功课提交多种方案具体流程详解

Hadoop功课提交多种方案具体流程详解

www.MyException.Cn  网友分享于:2013-09-28  浏览:70次
Hadoop作业提交多种方案具体流程详解

                                          Hadoop作业提交多种方案具体流程详解

前言:

提交hadoop作业时我们遇到了许多的问题,在网上也查过许多的文章,有许多对hadoop提交作业原理进行分析的文章,却总看不到对具体操作过程讲解的文章,导致我们在eclipse提交的作业总是在eclipse虚拟的云环境中运行。慢慢摸索中,一个一个的作业提交方法被我们发现,呵呵,现在总结一下吧。

方案:

1、用命令行方式提交
2、在eclipse中提交作业
3、采用eclipse的插件实现项目的提交

方案一:用命令行方式提交

前提:成功搭建一个hadoop集群,或成功部署一个伪分布式,并启动hadoop。

提交过程:

1、在eclipse中将我们的项目打成一个jar包,放到hadoop的安装目录下。

2、在命令行中提交作业,这里以hadoop自带的wordcount程序为例:

(1)将统计文件传到hdfs,如图(1)

 

 

(2)向云提交作业,如图(2)

 

 

提交作业时,如果遇到错误:Name node in safe mode,可采用下面的解决方法,如图(3)

 

 

(3)列出hdfs上输出文件夹下的文件,如图(4)

 

 

(4)在命令行中打印统计好的结果,如图(5)

 

 

(注:在命令行中提交作业是按hadoop/conf下的配置文件提交的)

方案二:在eclipse中提交作业

前提:

1、在你的电脑上安装好eclipse,可以在linux下,也可以在windows环境下哦~,这里需要指出的是:提交作业的机器只要有hadoop的API就可以了,和提交作业的机器所处的环境无关。

2、成功搭建一个hadoop集群,或成功部署一个伪分布式,并启动hadoop。

提交过程:

1、在eclipse下建立一个mapreduce项目,导入hadoop的API(hadoop/lib下的包)。

这里直接从外部导入hadoop中自带的wordcount程序。为了可以直接“Run java Aplication”我修改了一点wordcount的代码,使其输入输出文件的地址直接在代码中设置。贴出代码如下:


wordcount.java:

package org.apache.hadoop.examples;

import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {
//mapper类
  public static class TokenizerMapper 
       extends Mapper<Object, Text, Text, IntWritable>{
    
    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);
      }
    }
  }
  
//reducer类
  public static class IntSumReducer 
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> 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();
  
    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("/home/hadoop/testin"));
    FileOutputFormat.setOutputPath(job, new Path("/home/hadoop/testout"));
    
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  
     }
}
 

 

 如果此时你run java aplication,呵呵,你的程序只会在eclipse中虚拟的一个云环境中运行,而不会跑上云端去运行哦。我们一帮人在这个问题上纠结了好长时间。如果你想在云端运行,需要在main方法中添加几行代码,代码附录如下:

 

    //在你的文件地址前自动添加:hdfs://master:9000/
    conf.set("fs.default.name", "hdfs://master:9000/");
    conf.set("hadoop.job.user","xiaolu");  
    //指定jobtracker的ip和端口号,master在/etc/hosts中可以配置
    conf.set("mapred.job.tracker","master:9001");
 

(注:如果你运行的不是master上也有的项目,比如自己实现的pagerank,那会报错如下:)

 

java.lang.RuntimeException: java.lang.ClassNotFoundException: *.PRMapper

 

这时会报找不到Mapper类的错。呵呵,这个问题也卡了我们好长时间。我们分析:可能是没有将项目打包,导致云上没有mapreduce程序的缘故,我们尝试着将pagerank项目打成.jar文件,放在项目下,将main方法作出如下修改:

 

        //将Configuration类换成JobConf类
	 JobConf conf = new JobConf();
	//设置jar
	conf.setJar("pagerank.jar");

 

这时运行java aplication ,呵呵,结果我们成功地将作业提交到了云端。(在浏览器中浏览:master:50030)

方案三:采用eclipse的插件实现项目的提交

前提:在eclipse中成功地安装mapreduce插件。

不过需要提醒各位的是:hadoop-0.20.203.0版本自带的插件不够完整,需要作出如下修改:

1、将HADOOP_HOME/lib目录下的 commons-configuration-1.6.jar , commons-httpclient-3.0.1.jar , commons-lang-2.4.jar , jackson-core-asl-1.0.1.jar 和 jackson-mapper-asl-1.0.1.jar 等5个包复制到hadoop-eclipse-plugin-0.20.203.0.jar的lib目录下。

2、然后,修改该包META-INF目录下的MANIFEST.MF,将classpath修改为以下内容:

 

Bundle-ClassPath: classes/,lib/hadoop-core.jar,lib/commons-cli-1.2.jar,lib/commons-httpclient-3.0.1.jar,lib/jackson-core-asl-1.0.1.jar,lib/jackson-mapper-asl-1.0.1.jar,lib/commons-configuration-1.6.jar,lib/commons-lang-2.4.jar

 

(注:这样就完成了对hadoop-eclipse-plugin-0.20.203.0.jar的修改。如果还有其它的问题,比如Map/Reduce Locations下添加一个Location不能弹出添加对话框,这是eclipse版本的问题,我建议大家采用eclipse的版本是:eclipse-java-indigo-SR1-linux-gtk.tar.gz。)

提交过程:

1、不用手动将项目打成jar包,run on Hadoop就OK了。呵呵~

 

 

 

 

1 楼 diyunpeng 2012-06-25  
楼主写的真的很好,我自己也在研究hadoop么,可惜一个人力量太薄弱了。只有看网络才能学到知识啊。哈~
2 楼 lpingxh 2012-08-22  
问个问题:
关于hadoop用户权限的,hadoop在客户端默认是用系统用户去跑mapreduce任务,如果我开发环境(比如在windowns下边)系统的用户和起hadoop的用户名不一样,通过您上边写的 第二种和第三种方式运行程序都会出现如下错误:  org.apache.hadoop.security.AccessControlException: Permission denied: user=xxx, access=WRITE, inode="staging":hadoop:supergroup:rwxr-xr-x
请问如何解决呢?

文章评论

总结2014中国互联网十大段子
总结2014中国互联网十大段子
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
如何成为一名黑客
如何成为一名黑客
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
漫画:程序员的工作
漫画:程序员的工作
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
旅行,写作,编程
旅行,写作,编程
 程序员的样子
程序员的样子
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Java程序员必看电影
Java程序员必看电影
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员必看的十大电影
程序员必看的十大电影
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员和编码员之间的区别
程序员和编码员之间的区别
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员都该阅读的书
程序员都该阅读的书
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
每天工作4小时的程序员
每天工作4小时的程序员
程序员的鄙视链
程序员的鄙视链
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
为什么程序员都是夜猫子
为什么程序员都是夜猫子
中美印日四国程序员比较
中美印日四国程序员比较
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
代码女神横空出世
代码女神横空出世
老程序员的下场
老程序员的下场
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
编程语言是女人
编程语言是女人
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
10个调试和排错的小建议
10个调试和排错的小建议
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
鲜为人知的编程真相
鲜为人知的编程真相
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
那些争议最大的编程观点
那些争议最大的编程观点
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有