Hadoop作業(yè)提交多種方案

          方案: 
          1、用命令行方式提交
          2、在eclipse中提交作業(yè)
          3、采用eclipse的插件實現(xiàn)項目的提交

          方案一:用命令行方式提交
           
          其一,前提:

          成功搭建一個hadoop集群,或成功部署一個偽分布式,并啟動hadoop。

          其二,提交過程:

          1、在eclipse中將我們的項目打成一個jar包,放到hadoop的安裝目錄下。

          2、在命令行中提交作業(yè),這里以hadoop自帶的wordcount程序為例:

          (1)將統(tǒng)計文件傳到hdfs,如圖(1)

           

          (2)向云提交作業(yè),如圖(2)

          提交作業(yè)時,如果遇到錯誤:Name node in safe mode,可采用下面的解決方法,如圖(3)

          (3)列出hdfs上輸出文件夾下的文件,如圖(4)

          (4)在命令行中打印統(tǒng)計好的結(jié)果,如圖(5)

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

          方案二:在eclipse中提交作業(yè) 
          其一,前提

          1、在你的電腦上安裝好eclipse,可以在linux下,也可以在windows環(huán)境下哦~,這里需要指出的是:提交作業(yè)的機器只要
          有hadoop的API就可以了,和提交作業(yè)的機器所處的環(huán)境無關(guān)。

          2、成功搭建一個hadoop集群,或成功部署一個偽分布式,并啟動hadoop。

          其二,提交過程:

          1、在eclipse下建立一個mapreduce項目,導(dǎo)入hadoop的API(hadoop/lib下的包)。
          這里直接從外部導(dǎo)入hadoop中自帶的wordcount程序。為了可以直接“Run java Aplication”我修改了一點wordcount的代碼,
          使其輸入輸出文件的地址直接在代碼中設(shè)置。貼出代碼如下:
           

          wordcount.java:

          Java代碼  收藏代碼
            1. package org.apache.hadoop.examples;  
            2.   
            3. import java.io.IOException;  
            4. import java.util.StringTokenizer;  
            5. import org.apache.hadoop.conf.Configuration;  
            6. import org.apache.hadoop.fs.Path;  
            7. import org.apache.hadoop.io.IntWritable;  
            8. import org.apache.hadoop.io.Text;  
            9. import org.apache.hadoop.mapreduce.Job;  
            10. import org.apache.hadoop.mapreduce.Mapper;  
            11. import org.apache.hadoop.mapreduce.Reducer;  
            12. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
            13. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
            14.   
            15. public class WordCount {  
            16. //mapper類  
            17.   public static class TokenizerMapper   
            18.        extends Mapper<Object, Text, Text, IntWritable>{  
            19.       
            20.     private final static IntWritable one = new IntWritable(1);  
            21.     private Text word = new Text();  
            22.         
            23.     public void map(Object key, Text value, Context context  
            24.                     ) throws IOException, InterruptedException {  
            25.       StringTokenizer itr = new StringTokenizer(value.toString());  
            26.       while (itr.hasMoreTokens()) {  
            27.         word.set(itr.nextToken());  
            28.         context.write(word, one);  
            29.       }  
            30.     }  
            31.   }  
            32.     
            33. //reducer類  
            34.   public static class IntSumReducer   
            35.        extends Reducer<Text,IntWritable,Text,IntWritable> {  
            36.     private IntWritable result = new IntWritable();  
            37.   
            38.     public void reduce(Text key, Iterable<IntWritable> values,   
            39.                        Context context  
            40.                        ) throws IOException, InterruptedException {  
            41.       int sum = 0;  
            42.       for (IntWritable val : values) {  
            43.         sum += val.get();  
            44.       }  
            45.       result.set(sum);  
            46.       context.write(key, result);  
            47.     }  
            48.   }  
            49.    public static void main(String[] args) throws Exception {  
            50.     Configuration conf = new Configuration();  
            51.     
            52.     Job job = new Job(conf, "word count");  
            53.     job.setJarByClass(WordCount.class);  
            54.     job.setMapperClass(TokenizerMapper.class);  
            55.     job.setCombinerClass(IntSumReducer.class);  
            56.     job.setReducerClass(IntSumReducer.class);  
            57.     job.setOutputKeyClass(Text.class);  
            58.     job.setOutputValueClass(IntWritable.class);  
            59.     FileInputFormat.addInputPath(job, new Path("/home/hadoop/testin"));  
            60.     FileOutputFormat.setOutputPath(job, new Path("/home/hadoop/testout"));  
            61.       
            62.     System.exit(job.waitForCompletion(true) ? 0 : 1);  
            63.     
            64.      }  
            65. }  
            66.    

           如果此時你run java aplication,呵呵,你的程序只會在eclipse中虛擬的一個云環(huán)境中運行,而不會跑上云端去運行哦。
          我們一幫人在這個問題上糾結(jié)了好長時間。如果你想在云端運行,需要在main方法中添加幾行代碼,代碼附錄如下:

          Java代碼  收藏代碼
            1. //在你的文件地址前自動添加:hdfs://master:9000/  
            2. conf.set("fs.default.name", "hdfs://master:9000/");  
            3. conf.set("hadoop.job.user","xiaolu");    
            4. //指定jobtracker的ip和端口號,master在/etc/hosts中可以配置  
            5. conf.set("mapred.job.tracker","master:9001");  

          (注:如果你運行的不是master上也有的項目,比如自己實現(xiàn)的pagerank,那會報錯如下:)

          Java代碼  收藏代碼
            1. java.lang.RuntimeException: java.lang.ClassNotFoundException: *.PRMapper  

          這時會報找不到Mapper類的錯。呵呵,這個問題也卡了我們好長時間。我們分析:可能是沒有將項目打包,導(dǎo)致云上

          沒有mapreduce程序的緣故,我們嘗試著將pagerank項目打成.jar文件,放在項目下,將main方法作出如下修改:

          Java代碼  收藏代碼
            1.        //將Configuration類換成JobConf類  
            2.  JobConf conf = new JobConf();  
            3. //設(shè)置jar  
            4. conf.setJar("pagerank.jar");  

          這時運行java aplication ,呵呵,結(jié)果我們成功地將作業(yè)提交到了云端。(在瀏覽器中瀏覽:master:50030)


          方案三:采用eclipse的插件實現(xiàn)項目的提交 
           其一,前提:

          在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個包復(fù)制到hadoop-eclipse-plugin-0.20.203.0.jar的lib目錄下。

          2、然后,修改該包META-INF目錄下的MANIFEST.MF,將classpath修改為以下內(nèi)容:

          Java代碼  收藏代碼
              1. 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了。

          posted on 2012-10-22 10:40 陳夢琪 閱讀(3574) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2012年10月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宁蒗| 三门峡市| 通江县| 榆社县| 古田县| 新巴尔虎右旗| 宣化县| 临朐县| 贞丰县| 温泉县| 长春市| 寿阳县| 寿宁县| 九江县| 永丰县| 昆山市| 库尔勒市| 张家口市| 石屏县| 伽师县| 夹江县| 南川市| 丹江口市| 吉林省| 彭州市| 二连浩特市| 东至县| 甘谷县| 会昌县| 攀枝花市| 凤山市| 进贤县| 五莲县| 清镇市| 称多县| 建平县| 寿阳县| 内丘县| 新晃| 壤塘县| 永登县|