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

一、環境搭建

1Hadoop運行環境搭建

1.1 安裝虛擬機

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

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

wKioL1kw0B3yG_YYAABETwzPGlQ786.png-wh_50

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

wKiom1kw0DbhyzMkABGdV8Za9uM163.png-wh_50

1.2  配置JDK環境

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

wKioL1kw0DbhDGYuAABFrB1WarQ260.png-wh_50

2Hadoop安裝和部署

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

wKiom1kw0DfzWWKNAAAOfnOx2To901.png-wh_50

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

wKioL1kw0Dez2x5AAAAX9Ict6so641.png-wh_50

3)解壓Hadoop文件。

wKiom1kw0Djz7fGLAAAet-yrOrY232.png-wh_50

4)修改配置文件

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

第一個文件core-site.xml

wKioL1kw0DjxJN9QAABQx2sG4AA649.png-wh_50

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

第二個文件hdfs-site.xml

wKiom1kw0DnDrGJaAAA8M186zDU042.png-wh_50

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

wKioL1kw0DqgySjbAAAyZ-55eq8936.png-wh_50

接下來在系統環境變量中寫入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的版本號即說明單機模式已經配置完成。如下圖所示。


wKioL1kw0Dqi1SMlAACEPSqWrrc650.png-wh_50

6)啓動HDFS

通過使用僞分佈模式,啓動HDFS服務。首先需對HDFS進行格式化處理。

wKiom1kw0Dqw6Z2hAAAU_j3PN5M792.png-wh_50

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

wKiom1kw0D7xa_x5AAZ1wW3vQgs855.png-wh_50

7)啓動HDFS

wKioL1kw0D7S8vF8AAAx8vzeeCk539.png-wh_50

8)查看進程

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

wKiom1kw0D_ztBvIAABEinj_cvU921.png-wh_50

9)停止HDFS

wKioL1kw0D-RYY3KAAAYgxTDqo8301.png-wh_50

通過以上操作,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 關閉就可以看到了。

wKioL1kw0EDy4HUmAAAmeWsdVYQ086.png-wh_50

插件需要進一步的配置

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

wKiom1kw0EDgaZJGAABx7Lrq8Lg392.png-wh_50

打開Preference打開Preference

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

wKiom1kw0EGBzoi0AAA2Y4W03BE403.png-wh_50

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

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

wKioL1kw0EKSgWaiAAAiJFxRjx4962.png-wh_50

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

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

wKiom1kw0ELQIQChAAA6U5Wxl2k490.jpg-wh_50

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

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

最後的設置如下圖所示:

wKioL1kw0ELhEt_hAAB66fmkDX0917.jpg-wh_50

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 等命令進行操作了。

wKioL1kw0EPC8Y_gAABVJb-NU9s251.jpg-wh_50


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

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

3.4 Eclipse 中創建 MapReduce 項目

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

wKiom1kw0EOQMX2kAAAqeiq0F6U081.jpg-wh_50

創建Project

選擇 Map/ReduceProject,點擊 Next。

wKioL1kw0EThorQ5AABHG1ftbfY855.jpg-wh_50

創建MapReduce項目

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

wKioL1kw0ESi6ZWoAABPy6vayxs116.jpg-wh_50

填寫項目名

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

wKiom1kw0EWB5N26AACgyGkC7ug570.jpg-wh_50

項目創建完成

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

wKiom1kw1DvCLv98AABrA-m5zO0255.jpg-wh_50

新建Class

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

wKiom1kw0EWjfrTRAABgLHOg6w4681.png-wh_50

填寫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 進行刷新(不會自動刷新,需要手動刷新),可以看到文件結構如下所示:

wKioL1kw0EbCZR5WAAAgDUwa08o710.png-wh_50

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” 就可以了。

wKiom1kw1H3TsaIJAAF7rcHK558070.png-wh_50

設置程序運行參數

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

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

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

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

wKiom1kw1JnC-pZoAABlJaTclMo405.png-wh_50

WordCount 運行結果

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

二、實驗內容

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

wKioL1kw1PfS47r5AACN-5-CBeQ327.png-wh_50


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

wKioL1kw1Pjg8D_sAAB6qoN_Smc064.png-wh_50

1、用戶性別分佈

Maper函數:

wKiom1kw1PnTqcm4AABZQqf4cDM456.png-wh_50

Reducer函數:

wKiom1kw1PmRsWrnAABojlHpALM489.png-wh_50

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

wKioL1kw1PmzRbrmAAAluOSHubk505.png-wh_50

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

2、用戶省份分佈

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

wKiom1kw1PqRRFVrAADdMwUA0So448.png-wh_50

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

3、用戶實名驗證分佈

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

wKioL1kw1P6ikQWtAAAfxTtu65c920.png-wh_50

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

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

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

wKiom1kw1P-AjYbSAABI_eJtIVc123.png-wh_50

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

三、總結

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

wKioL1kw1P_gaajdAAFx4j0bCgI605.png-wh_50

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

wKiom1kw1QCwcsDmAAFQSlq7NKE519.png-wh_50

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

wKioL1kw1QHAEueVAADghDAfz_M091.png-wh_50

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


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