1. 程式人生 > >Hadoop單點部署與案例開發(微博用戶數據分析)

Hadoop單點部署與案例開發(微博用戶數據分析)

環境搭建 hadoop 數據分析 微博用戶

一、環境搭建

1Hadoop運行環境搭建

1.1 安裝虛擬機

1)下載並安裝VMware虛擬機軟件。

2)創建虛擬機,實驗環境虛擬機配置如下圖所示。

技術分享

3)安裝Ubuntu系統,安裝結果如下圖所示。

技術分享

1.2 配置JDK環境

下載並安裝JDK,安裝結束後需對java環境進行配置,配置成功結果如下所示。

技術分享

2Hadoop安裝和部署

1)創建Hadoop安裝文件夾,並切到到此路徑下。

技術分享

2)從 hadoop.apache.org 下載Hadoop 安裝文件,並復制文件到安裝Hadoop的文件夾中。下載地址如下圖所示,本次試驗選取較為穩定的最新版,即2.7.3版。

技術分享

3)解壓

Hadoop文件。

技術分享

4)修改配置文件

下面來寫配置文件core-site.xmlhdfs-site.xmlhadoop-env.sh三個文件這三個文件都在~/hadoop/hadoop-2.7.3/etc/hadoop/下,在前兩個文件中的和中寫入如下內容。

第一個文件core-site.xml

技術分享

請註意/home/ealon/hadoop/tmp文件夾要被替換為計算機當前的用戶目錄中的tmp文件夾沒有請創建。

第二個文件hdfs-site.xml

技術分享

第三個文件hadoop-env.sh中找到如下行然後寫入內容。

技術分享

接下來在系統環境變量中寫入Hadoop的環境變量gedit /etc/environment

#在文件的結尾""之內加上

:/home/ealon/hadoop/hadoop-2.7.3/bin

:/home/ealon/hadoop/hadoop-2.7.3/sbin

5)重啟虛擬機

首先重啟系統,待開機後,輸入如下命令hadoop version,驗證Hadoop環境是否安裝成功。當看到屏幕上顯示Hadoop的版本號即說明單機模式已經配置完成。如下圖所示。


技術分享

6)啟動HDFS

通過使用偽分布模式,啟動HDFS服務。首先需對HDFS進行格式化處理。

技術分享

顯示如下內容即成功格式化。

技術分享

7)啟動HDFS

技術分享

8)查看進程

運行jps命令。如看到屏幕上顯示如下內容即說明HDFS已經成功

技術分享

9)停止HDFS

技術分享

通過以上操作,Hadoop環境就基本搭建完畢。

3Hadoop-Eclipse-Plugin安裝與配置

3.1 插件安裝

要在 Eclipse 上編譯和運行 MapReduce 程序,需要安裝 hadoop-eclipse-plugin,可下載 Github 上的 hadoop2x-eclipse-plugin

下載後,將 release 中的hadoop-eclipse-kepler-plugin-2.6.0.jar復制到 Eclipse 安裝目錄的 plugins 文件夾中,運行 eclipse -clean 重啟 Eclipse 即可。

unzip-qo ~/下載/hadoop2x-eclipse-plugin-master.zip -d ~/下載 # 解壓到 ~/下載

sudocp ~/下載/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-plugin-2.6.0.jar/usr/lib/eclipse/plugins/ # 復制到 eclipse 安裝目錄的 plugins 目錄下

/usr/lib/eclipse/eclipse-clean # 添加插件後需要用這種方式使插件生效

3.2 插件配置

在繼續配置前請確保已經開啟了 Hadoop

啟動 Eclipse 後就可以在左側的Project Explorer中看到 DFS Locations(若看到的是 welcome 界面,點擊左上角的 x 關閉就可以看到了。

技術分享

插件需要進一步的配置

第一步:選擇 Window 菜單下的 Preference

技術分享

打開Preference打開Preference

此時會彈出一個窗體,窗體的左側會多出 Hadoop Map/Reduce 選項,點擊此選項,選擇 Hadoop 的安裝目錄(如/usr/local/hadoopUbuntu不好選擇目錄,直接輸入就行)。

技術分享

選擇 Hadoop 的安裝目錄選擇Hadoop 的安裝目錄

第二步:切換 Map/Reduce 開發視圖,選擇 Window 菜單下選擇 Open Perspective ->OtherCentOS Window -> Perspective-> Open Perspective -> Other),彈出一個窗體,從中選擇 Map/Reduce 選項即可進行切換。

技術分享

切換 Map/Reduce 開發視圖切換Map/Reduce 開發視圖

第三步:建立與 Hadoop 集群的連接,點擊 Eclipse軟件右下角的 Map/Reduce Locations 面板,在面板中單擊右鍵,選擇 New Hadoop Location

技術分享

建立與 Hadoop 集群的連接建立與Hadoop 集群的連接

在彈出來的 General 選項面板中,General 的設置要與 Hadoop 的配置一致。一般兩個 Host 值是一樣的,如果是偽分布式,填寫 localhost 即可,另外我使用的Hadoop偽分布式配置,設置 fs.defaultFS hdfs://localhost:9000,則 DFS Master Port 要改為 9000Map/Reduce(V2) Master Port 用默認的即可,Location Name 隨意填寫。

最後的設置如下圖所示:

技術分享

Hadoop Location 的設置HadoopLocation 的設置

Advancedparameters 選項面板是對 Hadoop 參數進行配置,實際上就是填寫 Hadoop 的配置項(/usr/local/hadoop/etc/hadoop中的配置文件),如我配置了 hadoop.tmp.dir ,就要進行相應的修改。但修改起來會比較繁瑣,我們可以通過復制配置文件的方式解決(下面會說到)。

總之,我們只要配置 General 就行了,點擊 finishMap/Reduce Location 就創建好了。

3.3 Eclipse 中操作 HDFS 中的文件

配置好後,點擊左側 Project Explorer 中的 MapReduce Location (點擊三角形展開)就能直接查看 HDFS 中的文件列表了(HDFS 中要有文件,如下圖是 WordCount 的輸出結果),雙擊可以查看內容,右鍵點擊可以上傳、下載、刪除 HDFS 中的文件,無需再通過繁瑣的 hdfs dfs -ls 等命令進行操作了。

技術分享


使用Eclipse查看HDFS中的文件內容

如果無法查看,可右鍵點擊 Location 嘗試 Reconnect 或重啟 Eclipse

3.4 Eclipse 中創建 MapReduce 項目

點擊 File 菜單,選擇 New -> Project…:

技術分享

創建Project

選擇 Map/ReduceProject,點擊 Next。

技術分享

創建MapReduce項目

填寫 Projectname 為 WordCount 即可,點擊 Finish 就創建好了項目。

技術分享

填寫項目名

此時在左側的Project Explorer 就能看到剛才建立的項目了。

技術分享

項目創建完成

接著右鍵點擊剛創建的WordCount 項目,選擇 New -> Class

技術分享

新建Class

需要填寫兩個地方:在 Package 處填寫org.apache.hadoop.examples;在 Name 處填寫 WordCount

技術分享

填寫Class信息

創建 Class 完成後,在 Project src 中就能看到 WordCount.java 這個文件。將如下 WordCount 的代碼復制到該文件中。

package org.apache.hadoop.examples;
import java.io.IOException;
import java.util.StringTokenizer;
importorg.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;
importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
importorg.apache.hadoop.util.GenericOptionsParser;
public class WordCount {
 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);
     }
    }
  }
 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();
   String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
    if(otherArgs.length != 2) {
     System.err.println("Usage: wordcount <in> <out>");
     System.exit(2);
    }
   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(otherArgs[0]));
    FileOutputFormat.setOutputPath(job,new Path(otherArgs[1]));
   System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

3.5 通過 Eclipse 運行 MapReduce

在運行 MapReduce 程序前,還需要執行一項重要操作(也就是上面提到的通過復制配置文件解決參數設置問題):將/usr/local/hadoop/etc/hadoop 中將有修改過的配置文件(如偽分布式需要 core-site.xml hdfs-site.xml),以及 log4j.properties 復制到 WordCount 項目下的 src 文件夾(~/workspace/WordCount/src)中:

cp/usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src

cp/usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src

cp/usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src

沒有復制這些文件的話程序將無法正確運行,本教程最後再解釋為什麽需要復制這些文件。

復制完成後,務必右鍵點擊 WordCount 選擇 refresh 進行刷新(不會自動刷新,需要手動刷新),可以看到文件結構如下所示:

技術分享

WordCount項目文件結構

點擊工具欄中的 Run 圖標,或者右鍵點擊 Project Explorer 中的 WordCount.java,選擇 Run As -> Run onHadoop,就可以運行 MapReduce 程序了。不過由於沒有指定參數,運行時會提示 “Usage: wordcount “,需要通過Eclipse設定一下運行參數。

右鍵點擊剛創建的 WordCount.java,選擇 Run As -> RunConfigurations,在此處可以設置運行時的相關參數(如果 Java Application 下面沒有 WordCount,那麽需要先雙擊 Java Application)。切換到 “Arguments” 欄,在 Program arguments 處填寫 “input output” 就可以了。

技術分享

設置程序運行參數

或者也可以直接在代碼中設置好輸入參數。可將代碼 main() 函數的 String[] otherArgs= new GenericOptionsParser(conf, args).getRemainingArgs(); 改為:

//String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();

String[]otherArgs=new String[]{"input","output"}; /* 直接設置輸入參數 */

設定參數後,再次運行程序,可以看到運行成功的提示,刷新 DFS Location 後也能看到輸出的 output 文件夾。

技術分享

WordCount 運行結果

至此,你就可以使用 Eclipse 方便的進行 MapReduce程序的開發了。

二、實驗內容

通過網絡下載userdata.csv微博用戶數據,共有14388385條用戶數據,包含:用戶id,所在省份,性別,是否認證信息。數據截圖如下圖所示。

技術分享


項目代碼結構如下圖所示:

技術分享

1、用戶性別分布

Maper函數:

技術分享

Reducer函數:

技術分享

計算結果分布如下圖所示:

技術分享

從圖中可以觀察到,微博用戶中女性所占比例較大,多余男性用戶。

2、用戶省份分布

該部分Maper函數、Reducer函數與性別統計算法相同,不再贅述,計算結果如下圖所示:

技術分享

從圖中可以看出,廣東、北京、上海、江蘇、浙江等地微博用戶量較大。

3、用戶實名驗證分布

該部分Maper函數、Reducer函數與性別統計算法相同,不再贅述,計算結果如下圖所示:

技術分享

從圖中可以看出,非實名用戶在微博用戶中占絕大部分。

4、主要省市男女比例分布

該部分Maper函數、Reducer函數與性別統計算法基本相同,不再贅述,計算結果如下圖所示:

技術分享

各省市女性用戶數量均占所在省市總用戶數的一半以上。

三、總結

通過瀏覽控制臺和Web管理端輸出結果,算法執行過程未見明顯異常或報錯。控制臺輸出結果如下圖所示:

技術分享

Web端面板統計結果如下圖所示:

技術分享

任務執行結果統計如下圖所示:

技術分享

結合水運行業實際需求,智慧港口建設作為我國港口轉型升級的重要途徑,其所涉及的關鍵技術就包含港口數據分析與處理。Hadoop技術在互聯網行業已廣泛應用,但在港口自動化、智能化建設中還未起到關鍵、核心作用。因此,大數據分析與挖掘技術在港口領域的深度應用,是港口發展的高級階段。對我國港口而言,通過打造智慧港口,優化提升港口基礎設施和管理模式,實現港口功能創新、技術創新和服務創新,已成為我國港口提高國際競爭力,完成轉型升級的重要途徑。通過對大數據技術在智慧港口中應用研究,是我國港口信息化積累的海量數據發揮其巨大優勢,為我國港口管理部門以及港口企業提供決策支撐,具有重要的顯示意義。


本文出自 “夢工廠” 博客,請務必保留此出處http://limlee.blog.51cto.com/6717616/1931581

Hadoop單點部署與案例開發(微博用戶數據分析)