win10+eclipse+hadoop2.7.2+maven+local模式直接通過Run as Java Application運行wordcount


一、准備工作

 (1)Hadoop2.7.2 在linux部署完畢,成功啟動dfs和yarn,通過jps查看,進程都存在

 (2)安裝maven

二、最終效果

 在windows系統中,直接通過Run as Java Application運行wordcount,而不需要先打包成jar包,然后在linux終端運行

三,操作步驟

 1、啟動dfs和yarn

  終端:${HADOOP_HOME}/sbin/start-dfs.sh

    ${HADOOP_HOME}/sbin/start-yarn.sh

  通過在namenode節點上jps查看顯示:

  4852 NameNode
  5364 ResourceManager
  5141 SecondaryNameNode
  10335 Jps

  在datanode節點上使用jps查看顯示:

  10369 Jps
  4852 NameNode
  5364 ResourceManager
  5141 SecondaryNameNode

 2、Eclipse基礎配置

  (1)將hadoop-eclipse-plugin-2.7.2.jar插件下載,放在Eclipse的目錄下的plugins目錄下,啟動Eclipse,然后點擊查看Hadoop插件是否生效,點擊windows——>preferences,如下圖1

    

  (2)將hadoop-2.7.2的解壓包添加到2所示的目錄,點擊OK

 3、Eclipse創建maven工程

  (1)創建過程省略

  (2)添加dependency,POM.xml中的依賴項如下:

  hadoop-common

  hadoop-hdfs

  hadoop-mapreduce-client-core

      hadoop-mapreduce-client-common  

  <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.2</version>
    </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.7.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>2.7.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-common</artifactId>
        <version>2.7.2</version>
    </dependency>

   (3)此時可能會卡頓一段時間,Build workpath如果特別慢的話,請參考我前不久的一篇解決方法,等到maven中的依賴包下載install完畢即可

 4、編寫mapreduce中的wordcount代碼

  代碼此處不在累述,,簡單代碼架構(紅色框的那個包)和內容如下:

        

  WCMapper類:  

package cn.edu.nupt.hadoop.mr.wordcount;

import java.io.IOException;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

// 4個泛型中,前兩個是指定的mapper輸入數據的類型
//map 和 reduce 的數據輸入輸出是以key-value的形式封裝的
//默認情況下,框架傳遞給我們的mapper的輸入數據中,key是要處理的文本中一行的其實偏移量,這一行的內容作為value
// JDK 中long string等使用jdk自帶的序列化機制,序列化之后會攜帶很多附加信息,造成網絡傳輸冗余,
//        所以Hadoop自己封裝了一些序列化機制
public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
    
    // mapreduce框架每讀一行就調用一次該方法
    @Override
    protected void map(LongWritable key, Text value,Context context)
            throws IOException, InterruptedException {
        //具體的業務寫在這個方法中,而且我們業務要處理的數據已經被該框架傳遞進來
        // key是這一行的其實偏移量,value是文本內容
        String line = value.toString();
        
        String[] words = StringUtils.split(line, " ");
        
        for(String word : words){
            
            context.write(new Text(word), new LongWritable(1));      
        }      
    } 
}
View Code

  WCReducer類: 

package cn.edu.nupt.hadoop.mr.wordcount;

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
    
    // 框架在map處理完成之后,將所有的kv對緩存起來,進行分組,然后傳遞一個組
    // <key,{value1,value2...valuen}>
    //<hello,{1,1,1,1,1,1.....}>
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values,Context context)
            throws IOException, InterruptedException {

        long count = 0;
        for(LongWritable value:values){
            
            count += value.get();
        }
        context.write(key, new LongWritable(count));
    }
}
View Code

  WCRunner類

package cn.edu.nupt.hadoop.mr.wordcount;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
 * 
 *<p> WCRunner.java
 *    Description:<br/> 
 *    (1)用來描述一個作業<br/>
 *    (2)比如,該作業使用哪個類作為邏輯處理中的map,哪個作為reduce
 *    (3)還可以指定改作業要處理的數據所在的路徑
 *    (4)還可以指定作業輸出的路徑
 *<p>
 *    Company: cstor
 *
 *    @author zhuxy
 *    2016年8月4日 下午9:58:02
 */
public class WCRunner {

    public static void main(String[] args) throws Exception {
        
        Configuration conf = new Configuration();
        
        Job wcjob = Job.getInstance(conf);
        
        // 找到Mapper和Reducer兩個類所在的路徑
        //設置整個job所用的那些類在哪個jar下
        wcjob.setJarByClass(WCRunner.class);
        
        //本job使用的mapper和reducer類
        wcjob.setMapperClass(WCMapper.class);
        wcjob.setReducerClass(WCReducer.class);
        
        //指定reduce的輸出數據kv類型
        wcjob.setOutputKeyClass(Text.class);
        wcjob.setOutputValueClass(LongWritable.class);
        
        // 指定map的輸出數據的kv類型
        wcjob.setMapOutputKeyClass(Text.class);
        wcjob.setMapOutputValueClass(LongWritable.class);
        
//        
//        FileInputFormat.setInputPaths(wcjob, new Path("hdfs://master:9000/wc/input/testHdfs.txt"));
//        FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://master:9000/wc/output7/"));

        FileInputFormat.setInputPaths(wcjob, new Path("file:///E:/input/testwc.txt"));
        FileOutputFormat.setOutputPath(wcjob, new Path("file:///E:/output3/"));
        
        wcjob.waitForCompletion(true);
    }
}
View Code

  此時代碼張貼完畢。

 5、在CentOS的本地創建一個文件,命名為testHdfs.txt(這個是我之前的測試文件,內容不重要,名字不重要,一致即可),內容如下:

    hello java

    hello Hadoop

    hello world

  創建好后,將文件上傳到hdfs文件系統的/wc/input文件夾下面

  hadoop fs -put ./testHdfs.txt /wc/input

 6、在WCRunner類中,右擊Run as -->Java Application,出現如下錯誤:

  log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
  log4j:WARN Please initialize the log4j system properly.
  log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
  Exception in thread "main" java.lang.NullPointerException
      at java.lang.ProcessBuilder.start(ProcessBuilder.java:1012)
      at org.apache.hadoop.util.Shell.runCommand(Shell.java:483)
      at org.apache.hadoop.util.Shell.run(Shell.java:456)
      at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:722)
      at org.apache.hadoop.util.Shell.execCommand(Shell.java:815)
      at org.apache.hadoop.util.Shell.execCommand(Shell.java:798)

    ……

   at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308)
     at cn.edu.nupt.hadoop.mr.wordcount.WCRunner.main(WCRunner.java:55)

  解決辦法:參考:eclipse Run on Hadoop java.lang.NullPointerException

  方法:在Hadoop的bin目錄下放winutils.exe,在環境變量中配置 HADOOP_HOME,把hadoop.dll拷貝到C:\Windows\System32下面即可

    注:此處最好將HADOOP_HOME/bin目錄添加到path中,這樣可以運行本地模式,即是上述代碼中注釋的部分

  兩個文件的下載地址:win10下hadoo2.7.2的hadoop.dll和winutils.exe  

 7、此時再次運行Run as -->Java Application,出現問題如下:  

  log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
  log4j:WARN Please initialize the log4j system properly.
  log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

  文件夾創建成功,但是文件夾下面沒有success 和 運行結果part*文件,即/wc/output3下面沒內容(輸出結果)。

  解決辦法:點擊windows-->perspective-->open perspective-->other-->MapReduce,Eclipse界面效果如下:

      

  並且在底部出現MapReduce Locations,效果如下:

    

  此時右擊黃色的Map/Reduce Locations,選擇New Had*,然后編輯如下,

    

  編輯結束點擊finish。再次運行Run as -->Java Application,出現想要的結果了,如圖:

      

  該圖出現基本代表運行成功,沒問題。但是發現MapReduce程序運行的計數器等信息沒有打印在控制台,控制台只打印了log4j三行信息。解決方法見第8條

 8、解決將輸出的信息打印到Console上。

  參考:Eclipse中運行MapReduce程序時控制台無法打印進度信息的問題

  這種情況一般是由於log4j這個日志信息打印模塊的配置信息沒有給出造成的,可以在項目的src目錄下,新建一個文件,命名為“log4j.properties”,填入以下信息:

    log4j.rootLogger=INFO, stdout  
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n  
    log4j.appender.logfile=org.apache.log4j.FileAppender  
    log4j.appender.logfile.File=target/spring.log  
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n  

 

     

 9、此時,所有的問題解決

 (1)控制台打印信息

 2016-08-05 00:56:45,209 INFO [org.apache.hadoop.conf.Configuration.deprecation] - session.id is deprecated. Instead, use dfs.metrics.session-id
  2016-08-05 00:56:45,211 INFO [org.apache.hadoop.metrics.jvm.JvmMetrics] - Initializing JVM Metrics with processName=JobTracker, sessionId=
  2016-08-05 00:56:45,856 WARN [org.apache.hadoop.mapreduce.JobResourceUploader] - Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
  2016-08-05 00:56:45,918 WARN [org.apache.hadoop.mapreduce.JobResourceUploader] - No job jar file set.  User classes may not be found. See Job or Job#setJar(String).
  2016-08-05 00:56:45,976 INFO [org.apache.hadoop.mapreduce.lib.input.FileInputFormat] - Total input paths to process : 1

 (2)/wc/outputn/part*輸出的信息

    Hadoop    1
    hello   3    

    java  1
    world    1

  至此成功實現。

四、日志分析

  分析執行日志會發現,發現Runjar啟動的是本地的JVM,使用的是Local模式,從如下幾處的日志可以得出:

   (1)啟動的JVM processName=JobTracker,此處不是yarn

   (2)JobID是job_local……而非job_直接數字

  說明運行的本地運行,只是使用了HDFS文件系統,但是執行框架是本地的,而非集群的yarn框架。

五、MR程序的幾種提交運行模式(本地、集群(windows、linux中eclipse))

以下內容為傳智播客上課筆記

本地模型運行

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.itcast.hadoop.mr.wordcount.WCRunner
2/在linux的eclipse中直接運行main方法,也可以提交到集群中去運行,但是,必須采取以下措施:
      ----在工程src目錄下加入 mapred-site.xml  和  yarn-site.xml
      ----將工程打成jar包(wc.jar),同時在main方法中添加一個conf的配置參數 conf.set("mapreduce.job.jar","wc.jar");           

3/在windows的eclipse中直接運行main方法,也可以提交給集群中運行,但是因為平台不兼容,需要做很多的設置修改
        ----要在windows中存放一份hadoop的安裝包(解壓好的)
        ----要將其中的lib和bin目錄替換成根據你的windows版本重新編譯出的文件
        ----再要配置系統環境變量 HADOOP_HOME  和 PATH
        ----修改YarnRunner這個類的源碼    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM