(2)Hadoop筆記:hadoop-eclipse-plugin插件的安裝和mapReduce小栗子

注:
1.eclipse所在環境爲windows
2.hadoop版本2.8.3
3.hadoop-eclipse-plugin版本2.8.3
4.eclipse版本Luna Service Release 1 (4.4.1)
5.JDK 1.7

  • 插件安裝

hadoop-eclipse-plugin編譯
因爲我本地使用的JDK爲1.7,而現在網上能找到的hadoop-eclipse-plugin-2.8.3都是基於JDK1.8編譯的,所以都不能使用,因此需要下載hadoop-eclipse-plugin的源碼然後在本地編譯,過程中需要Hadoop-2.8.3的支持。當然如果你能找到符合自己環境的插件包,這步就可以跳過了。
Hadoop-2.8.3.tar.gz
hadoop2x-eclipse-plugin (github託管的源碼)
apache-ant-1.9.11-bin.zip
下載完後解壓apache-ant-1.9.11-bin.zip,並配置環境變量。
新建ANT_HOME=E:apache-ant-1.9.4
在PATH後面加;%ANT_HOME%\bin
測試下

ant -version

這裏寫圖片描述

解壓Hadoop-2.8.3.tar.gz,hadoop2x-eclipse-plugin
編輯E:\hadoop2x-eclipse-plugin-master\src\contrib\eclipse-plugin\build.xml
添加下圖紅框中的部分,3項代表的意思應該都懂,就不多說了。
這裏寫圖片描述

然後往下翻能發現有一堆這個東西,之後編譯時大概會出錯的地方。先打開放在這,不用修改。①
這裏寫圖片描述

然後編輯E:\hadoop2x-eclipse-plugin-master\ivy\libraries.properties.xml
一般來講只要修改下紅框中的版本即可,然後這裏有一大堆版本,而上面①圖中那些都是在引用這裏的版本。這裏的版本又對應着Hadoop-2.8.3中的資源。在編譯時可能會出現這裏寫的版本和Hadoop實際用的版本不一樣導致找不到jar包的報錯,這時就可以根據報錯信息來修改下方的版本號,使得符合實際。基本都在${hadoop.home}/share/hadoop/common/lib文件夾中
這裏寫圖片描述

進入hadoop2x-eclipse-plugin-master\src\contrib\eclipse-plugin目錄,運行cmd命令行

ant jar

編譯完成,遇到錯誤就根據提示修改,最大可能遇到的就是我上面提到的問題,還有當編譯時長時間卡在ivy-resolve-common: 處時,大概率已經編譯失敗。
這裏寫圖片描述

編譯完成後的文件在
hadoop2x-eclipse-plugin-master\build\contrib\eclipse-plugin文件夾中
這裏寫圖片描述

將jar包放入eclipse/plugins文件夾中,重啓eclipse
可以看到如下圖標
這裏寫圖片描述
添加
window->show view->other
這裏寫圖片描述

配置連接,如下圖所示,隨便取個名字就行
這裏寫圖片描述

然後如果連接成功的話就如下圖所示,這裏剛新搭建的Hadoop環境的話應該一開始就是空的,所以可能會拋空指針異常,沒什麼影響的,直接新建東西就行。
這裏寫圖片描述

這裏寫圖片描述

新建後需要刷新一下,同時可以訪問http://xx.xx.xx.xx:50070/explorer.html#/網址查看是否真的新建了。
這裏寫圖片描述

通過這個我們可以輕鬆快捷的將文件上傳給Hadoop文件系統,方便本地調試。

window->preferences,選擇Hadoop文件,這裏主要目的是可以直接引用相關jar包
這裏寫圖片描述

  • 使用例子,單詞計數
    首先需要下載hadoop.dll,這個網上找找對應版本的吧,我用的是2.X的,放在C/windows/System32下。

File->New->other
next,填寫名字,finish
這裏寫圖片描述

這裏寫圖片描述

新建4個文件
這裏寫圖片描述
WordCountMapper.java

package com.hadoop.demo;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

/*
 * KEYIN:輸入kv數據對中key的數據類型
 * VALUEIN:輸入kv數據對中value的數據類型
 * KEYOUT:輸出kv數據對中key的數據類型
 * VALUEOUT:輸出kv數據對中value的數據類型
 */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

    /*
     * map方法是提供給map task進程來調用的,map task進程是每讀取一行文本來調用一次我們自定義的map方法
     * map task在調用map方法時,傳遞的參數:
     *      一行的起始偏移量LongWritable作爲key
     *      一行的文本內容Text作爲value
     */
    @Override
    protected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException {
        //拿到一行文本內容,轉換成String 類型
        String line = value.toString();
        //將這行文本切分成單詞
        String[] words=line.split(" ");

        //輸出<單詞,1>
        for(String word:words){
            context.write(new Text(word), new IntWritable(1));
        }
    }
}

WordCountReducer.java

package com.hadoop.demo;

import java.io.IOException;

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

/*
 * KEYIN:對應mapper階段輸出的key類型
 * VALUEIN:對應mapper階段輸出的value類型
 * KEYOUT:reduce處理完之後輸出的結果kv對中key的類型
 * VALUEOUT:reduce處理完之後輸出的結果kv對中value的類型
 */
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
    @Override
    /*
     * reduce方法提供給reduce task進程來調用
     * 
     * reduce task會將shuffle階段分發過來的大量kv數據對進行聚合,聚合的機制是相同key的kv對聚合爲一組
     * 然後reduce task對每一組聚合kv調用一次我們自定義的reduce方法
     * 比如:<hello,1><hello,1><hello,1><tom,1><tom,1><tom,1>
     *  hello組會調用一次reduce方法進行處理,tom組也會調用一次reduce方法進行處理
     *  調用時傳遞的參數:
     *          key:一組kv中的key
     *          values:一組kv中所有value的迭代器
     */
    protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
        //定義一個計數器
        int count = 0;
        //通過value這個迭代器,遍歷這一組kv中所有的value,進行累加
        for(IntWritable value:values){
            count+=value.get();
        }

        //輸出這個單詞的統計結果
        context.write(key, new IntWritable(count));
    }
}

WordCountJobSubmitter.java

package com.hadoop.demo;

import java.io.IOException;
import java.util.Date;

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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCountJobSubmitter {

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration conf = new Configuration();
        Job wordCountJob = Job.getInstance(conf);

        //重要:指定本job所在的jar包
        wordCountJob.setJarByClass(WordCountJobSubmitter.class);

        //設置wordCountJob所用的mapper邏輯類爲哪個類
        wordCountJob.setMapperClass(WordCountMapper.class);
        //設置wordCountJob所用的reducer邏輯類爲哪個類
        wordCountJob.setReducerClass(WordCountReducer.class);

        //設置map階段輸出的kv數據類型
        wordCountJob.setMapOutputKeyClass(Text.class);
        wordCountJob.setMapOutputValueClass(IntWritable.class);

        //設置最終輸出的kv數據類型
        wordCountJob.setOutputKeyClass(Text.class);
        wordCountJob.setOutputValueClass(IntWritable.class);

        Long fileName = (new Date()).getTime();

        //設置要處理的文本數據所存放的路徑
        FileInputFormat.setInputPaths(wordCountJob, "hdfs://xx.xx.xx.xx:9002/test/1.data");
        FileOutputFormat.setOutputPath(wordCountJob, new Path("hdfs://xx.xx.xx.xx:9002/test/"+fileName));

        //提交job給hadoop集羣
        wordCountJob.waitForCompletion(true);
    }
}

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

然後準備下1.data的數據(就是個txt編輯後修改後綴爲data的文件),將該文件通過DFS上傳

hello tom
hello jim
how are you
i love you
i miss you
i love you

這裏寫圖片描述

因爲我這裏放的路徑是test下,實際使用時請在WordCountJobSubmitter .java中替換爲自己的路徑和文件名。

運行,選中WordCountJobSubmitter.java(有main函數的),右鍵run as ->run configurations。hdfs第一行爲輸入,第二行爲輸出
這裏寫圖片描述

運行,可以看見生成了新的文件,點擊查看,可以看到單詞計數的結果了。
這裏寫圖片描述

因爲大部分都是根據記憶寫的,所以過程中如果出現錯誤,望指正 _ (:з」∠*)_。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章