Hadoop單點部署與案例開發(微博用戶數據分析)
一、環境搭建
1、Hadoop運行環境搭建
1.1 安裝虛擬機
(1)下載並安裝VMware虛擬機軟件。
(2)創建虛擬機,實驗環境虛擬機配置如下圖所示。
(3)安裝Ubuntu系統,安裝結果如下圖所示。
1.2 配置JDK環境
下載並安裝JDK,安裝結束後需對java環境進行配置,配置成功結果如下所示。
2、Hadoop安裝和部署
(1)創建Hadoop安裝文件夾,並切到到此路徑下。
(2)從 hadoop.apache.org 下載Hadoop 安裝文件,並復制文件到安裝Hadoop的文件夾中。下載地址如下圖所示,本次試驗選取較為穩定的最新版,即2.7.3版。
(3)解壓
(4)修改配置文件
下面來寫配置文件core-site.xml、hdfs-site.xml、hadoop-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環境就基本搭建完畢。
3、Hadoop-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/hadoop,Ubuntu不好選擇目錄,直接輸入就行)。
選擇 Hadoop 的安裝目錄選擇Hadoop 的安裝目錄
第二步:切換 Map/Reduce 開發視圖,選擇 Window 菜單下選擇 Open Perspective ->Other(CentOS 是 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 要改為 9000。Map/Reduce(V2) Master 的 Port 用默認的即可,Location Name 隨意填寫。
最後的設置如下圖所示:
Hadoop Location 的設置HadoopLocation 的設置
Advancedparameters 選項面板是對 Hadoop 參數進行配置,實際上就是填寫 Hadoop 的配置項(/usr/local/hadoop/etc/hadoop中的配置文件),如我配置了 hadoop.tmp.dir ,就要進行相應的修改。但修改起來會比較繁瑣,我們可以通過復制配置文件的方式解決(下面會說到)。
總之,我們只要配置 General 就行了,點擊 finish,Map/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單點部署與案例開發(微博用戶數據分析)