大數據分析技術之MapReduce實踐:詞頻統計(九)

寫在開頭:目前已經陸陸續續搭建好了Linux、Hadoop相關的環境,可以開始一些簡單的實例演示了。後面也會陸續更新這個系列了。

學習內容安排

本階段學習內容的安排的話可能沒有具體的內容規劃,不會去涉及環境配置、軟件安裝的內容,主要是以介紹使用爲主,以實例出發。大數據需要在Linux系統上進行,然後現在電腦使用的軟件如下(部分軟件由於學習原因選擇的老版本),

軟件名稱 備註
NetBeans IDE 8.2 JAVA編譯器
CentOS 6.6 Linux系統
VMware Workstation11 桌面版虛擬機
SecureCRT 7.0.0 終端仿真程序
Hadoop 2.6.5 分佈式框架
Hive 1.2.2 數據倉庫

電腦配置和虛擬機分配方面,因爲資金有限,筆記本配置只有16個g,創建了4臺虛擬機組建了僞分佈式,配置這些已經調整好了,可能還沒有安裝的朋友在這個安裝過程中可能需要費電功夫了,下面開始今天的Mapreduce實戰講解吧。

MapReduce之詞頻統計

MapReduce的介紹一時半會兒可能解釋不清楚,這裏大家可以參考學習一下這篇MapReduce過程總結,講得還是比較清楚了,好了讓我們正式開始吧。
今天要完成的目標是對一個本地txt文檔利用MapReduce進行統計分析,所需的流程1.上傳數據2.編寫MapReduce Java代碼3.輸出結果
1.上傳數據
其實數據就是自己隨意編寫的一段話,首先需要從本地上傳數據,假設我們本地數據放在c盤,然後需要知道自己的master主節點ip地址(可在linux中使用ifconfig進行查看)和上傳的文件的目標文件夾,這裏上傳數據不是上傳到linux裏,而是直接上傳到HDFS裏,代碼如下,

// 本地上傳數據到HDFS
package com.mycompany.mavenproject1;

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class NewClass {
    public static void main(String[] args) throws IOException {
        Configuration conf = new Configuration(); //初始化配置
        conf.set("fs.defaultFS", "hdfs://192.168.0.23:9000"); //連接數據庫fs.defaultFS爲配置文件、9000爲端口號
        FileSystem file = FileSystem.get(conf);// 設置文件配置
        file.copyFromLocalFile(new Path("c:/t1.txt"), new Path("/user/root/input/")); //確定輸入與輸出路徑
        file.close();
    }
}

上傳完數據後可以在網頁版Hadoop窗口進行查看,網址爲http://你的主節點ip:50070/explorer.html在這裏插入圖片描述
2.編寫MapReduce Java代碼
然後就來通過java編寫MapReduce的整個流程代碼吧,首先編寫Map代碼
Map編寫思路
1)需要在類上定義Map輸入鍵值對於輸出到Reduce的鍵值對類別,這裏,這裏定義輸入的鍵值對爲每一行的數據,所有就有行號和值,於是定義其類別爲LongWritable和Text,然後輸出的應該是每個單詞和數值1,類別是Text和LongWritable,所以定義Mapper<LongWritable, Text, Text, LongWritable>;
2)然後編寫map函數:首先需要對每次輸入的值轉爲字符型並全爲小寫,然後利用split進行分詞,最後將分好的詞通過循環,輸出值與個數1的鍵值對。

package test;

import java.io.IOException;

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

public class WcMapper extends Mapper<LongWritable, Text, Text, LongWritable>{//框架傳過來是什麼、寫回去的是什麼類型

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString().toLowerCase(); //得到了每一行的數據
        String[] words = line.split("[\\s\\d\\pP]+");
        for (String word: words) {
            context.write(new Text(word), new LongWritable(1));
        }
    }
}

Reduce編寫思路
將Map輸出的值傳入Reduce進行自動計算,最後輸出我們想要的詞頻統計,
1)首先接受從Map傳過來的對應數據類型然後再輸出單詞和詞頻,也就是Text和Longwritable;
2)編寫reduce函數,將value設置爲LongWritable可進行數值循環,然後初始化count用於技術,通過強制轉換value進行值的統計,最後將值傳入最後的工作文檔進行輸出。

package test;

import java.io.IOException;

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

public class WcReduce extends Reducer<Text, LongWritable, Text, LongWritable>{

    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
        int count = 0;
        for (LongWritable value : values) {
            count = count + (int)value.get();
        }
        context.write(key, new LongWritable(count));
    } 
}

執行代碼編輯思路
首先需要連接HDFS,定義Job作業,然後依次配置Map、Reduce、Map輸出類別,整體輸出類別,文件讀取/輸出路徑,其他的都是程序進程類信息,這樣再Hadoop啓動後,運行程序就可以實現詞頻統計啦。


package test;

import java.io.IOException;

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;
import org.apache.log4j.BasicConfigurator;


public class WordCount {
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        BasicConfigurator.configure();
        Configuration conf = new Configuration();
        conf.set("fs.defaultPS", "hdfs://192.168.0.23:9000");//hadoop集羣下的配置core-site.xml
        Job job = Job.getInstance(conf);
        job.setJarByClass(WordCount.class);
        
        job.setMapperClass(WcMapper.class);
        job.setReducerClass(WcReduce.class);
        
         job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);    
           
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        
        FileInputFormat.setInputPaths(job, new Path("hdfs://192.168.0.23:9000/user/root/input"));
        FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.0.23:9000/user/root/output"));
        
        job.waitForCompletion(true);
        System.setProperty("hadoop.home.dir", "D:\\hadoop-common-2.2.0-bin-master\\hadoop-common-2.2.0-bin-master");
        
    }
}

3.輸出結果.
最後來看一看輸出的結果,不錯,確實是我們需要的詞頻統計。
在這裏插入圖片描述


結語

詞頻統計在之前也用個Java寫過,但是Hadoop最明顯的優點就是速度快,此次使用的文件比較小,還體現不出來Hadoop的優越性,後續如果有機會優化,還可以把Hadoop分詞嵌入到可視化界面進行,不過現在先學習一下後續的內容。
謝謝閱讀。

參考

1.MapReduce過程總結

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