1. 程式人生 > >雲端計算平臺構建與實驗設計

雲端計算平臺構建與實驗設計

課程設計任務書


一、作業目的

    物聯網的核心是應用,應用的核心是雲端計算。通過構建一個雲端計算平臺,並利用這個平臺設計雲端計算實驗,將結果與普通的電腦計算比較兩者的差別,感受雲端計算的優越效能,從而對物聯網有更深刻的體驗與認識。

二、作業內容及要求

    能夠按照課程設計任務書按照相應的要求完成整個雲端計算平臺的搭建,要完成這個任務,就要對雲端計算平臺的架構和原理有一定的認識,對物聯網的應用層有深入的學習,通過查閱書籍文獻與網路資料去掌握相關知識,完成雲平臺的構建與實驗的設計。

三、作業成果形式及提交要求

做出實驗成果,並向驗收老師展示其功能和實現原理,回答老師提出的相關問題;提交實驗程式和報告。提交要求是實物驗收必須得到老師的肯定,報告必須能清晰說明實驗過程與原理,嚴謹有說服力。

四、參考文獻

[1] Hadoop權威指南,清華大學出版社,2010-5-1

[2] NIST Cloud Computing Program,http://www.nist.gov/itl/cloud/

[3] Hadoop大資料處理,人民郵電出版社,2013-09-01

[4] 虛擬化與雲端計算,電子工業出版社,2009-10-1

[5] 走近雲端計算,人民郵電出版社,2009年

[6] Hadoop實戰,人民郵電出版社,2011年10月

[7] Hadoop雲端計算實戰,清華大學出版社,2012-10

目錄

課程設計任務書

目錄

摘要

1 緒論

  1.1 雲端計算概述

    1.1.1 雲端計算的五大核心特點

    1.1.2 雲端計算的三種服務模式

  1.2 Hadoop系統概述

  1.3 雲端計算平臺搭建方法

  1.4 本次課設所用平臺與搭建方法

2.雲端計算平臺原理

  2.1 Hadoop系統原理

  2.2 ubuntu系統

3.雲端計算平臺搭建過程 

  3.1 ubuntu系統的安裝 

  3.2 Hadoop系統部署 

4.分散式雲端計算實驗 

  4.1基於MapReduce的分散式雲端計算實驗 

  4.2 普通PC機上的對比實驗 

  4.3分散式雲端計算實驗結果與總結 

5.課程設計總結

6.附錄

摘要

物聯網的核心是應用,應用的核心是雲端計算。從一開始學習物聯網這門課開始就不斷的聽到雲端計算的介紹,並且隨著學習的深入,越來越感受到雲端計算在物聯網中的重要作用,沒錯,物聯網的核心是應用,應用的核心是雲端計算。世界已經悄然進入到大資料時代,大資料的處理依靠傳統手段已經捉襟見肘,隨著雲端計算的出現,大資料的潛力才充分發掘出來,物聯網也正是接著雲端計算的東風才能夠發展到今天這種深刻改變人們生活方式的地步。

雲端計算是物聯網的應用層,做雲端計算關鍵要學會怎麼去運用物聯網,為此需要查閱與雲端計算有關的書籍,網上牛人的筆記和國外網站的資料,親手設計與實現分散式程式進行實驗,從而直觀的感受到雲端計算的強大與物聯網的無處不在。

雲端計算的重要性不言而喻,物聯網的發展離不開雲端計算,所以研究雲端計算的搭建與運用是具有極大的意義。

關鍵詞:物聯網  雲端計算 雲端計算平臺搭建 分散式計算

1,緒論

1.1 雲端計算概述

在參考文獻2裡,NIST對雲端計算定義如下:雲端計算是一種能夠通過網路以便利的、按需付費的方式獲取計算資源(包括網路、伺服器、儲存、應用和服務等)並提高其可用性的模式,這些資源來自一個共享的、可配置的資源池,並能夠以最省力和無人干預的方式獲取和釋放。這種模式具有5個關鍵功能,還包括3種服務模式和4種部署方式。

1.1.1雲端計算的五大核心特點:

按需自助服務(On Demand Self-Service):供應商的資源保持高可用和高就緒的狀態,使用者可以按需方便地自助地獲得資源。

泛在的網路訪問(Broad Network Access):可以通過各種網路渠道,以統一標準的機制(如瀏覽器,相同的API等)獲取服務,但是客戶端可以是多種多樣的瘦客戶端或富客戶端(例如行動電話、膝上型電腦、PDA等)。

動態的資源池(Resource Pooling):供應商的計算資源可以被整合為一個動態資源池,以多租戶模式服務所有客戶,不同的物理和虛擬資源可根據客戶需求動態分配。服務商需實現資源的位置無關性,客戶一般不需要知道所使用的資源的確切地理位置,但在需要的時候客戶可以指定資源位置(如哪個國家,哪個資料中心等)的要求。

快速彈性(Rapid Elasticity):可以迅速、彈性地提供服務,能快速擴充套件,也可以快速釋放實現快速縮小。對客戶來說,可以租用的資源看起來似乎是無限的,可在任何時間購買任何數量的資源。

可計量的服務(Measured Service):服務的收費可以是基於計量的一次一付,或基於廣告的收費模式。系統以針對不同服務需求(例如,CPU時間、儲存空間、頻寬、甚至按使用者賬號的使用率高低)來計量資源的使用情況和定價,以提高資源的管控能力和促進優化利用。整個系統資源可以通過監控和報表的方式對服務提供者和使用者透明化。

1.1.2雲端計算的三種服務模式

雲端計算的三個服務模式(Delivery Models)是:SaaS、PaaS和IaaS。

SaaS:提供給客戶的服務是運營商執行在雲端計算基礎設施上的應用程式,使用者可以在各種裝置上通過瘦客戶端介面訪問,如瀏覽器。消費者不需要管理或控制任何雲端計算基礎設施,包括網路、伺服器、作業系統、儲存,等等。

PaaS:提供給消費者的服務是把客戶採用提供的開發語言和工具(例如Java、Python、.Net等)開發的或收購的應用程式部署到供應商的雲端計算基礎設施上。客戶不需要管理或控制底層的雲基礎設施,包括網路、伺服器、作業系統、儲存等,但客戶能控制部署的應用程式,也可能控制執行應用程式的託管環境配置。

IaaS: 提供給消費者的服務是對所有設施的利用,包括處理、儲存、網路和其他基本的計算資源,使用者能夠部署和執行任意軟體,包括作業系統和應用程式。消費者不管理或控制任何雲端計算基礎設施,但能控制作業系統的選擇、儲存空間、部署的應用,也有可能獲得有限制的網路元件(例如,防火牆、負載均衡器等)的控制。

目前世界大多數網際網路公司都開始佈局雲端計算,Google,華為,BAT,亞馬遜也都已經將雲端計算成熟運用與自己的生態系統,併產生巨大的效益。國內外關於雲端計算的研究都在火熱的進行中。無論是收費的雲端計算服務還是開源雲端計算研究都趨於白熱化,可見雲端計算在未來各個領域非同一般的潛力。

1.2 Hadoop系統概述

Hadoop是一個由Apache基金會所開發的分散式系統基礎架構。 Hadoop實現了一個分散式檔案系統(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬體上;而且它提供高吞吐量(high throughput)來訪問應用程式的資料,適合那些有著超大資料集(large data set)的應用程式。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)檔案系統中的資料。

Hadoop的框架最核心的設計就是:HDFS和Map Reduce。HDFS為海量的資料提供了儲存,則Map Reduce為海量的資料提供了計算。

 

圖1-1 HDFS檔案系統結構

 

圖1-2 Map Reduce工作流程

Hadoop技術已經無處不在。不管是好是壞,Hadoop已經成為大資料的代名詞。短短几年間,Hadoop從一種邊緣技術成為事實上的標準,不僅現在Hadoop是企業大資料的標準,而且在未來,它的地位似乎一時難以動搖。

1.3 雲端計算平臺搭建方法

目前開源的雲端計算平臺的搭建都要依託Linux系統,因此我們有2種辦法搭建雲端計算平臺:安裝Linux系統和在其他作業系統下安裝Linux虛擬機器後搭建雲平臺。目前主流的虛擬機器有:

Virtual Box

Vmware

有了Linux系統環境後就能搭建雲端計算平臺了,幾大開源雲平臺系統有:

Hadoop系統

Open Stack

雲端計算平臺的搭建=Linux系統+開源雲平臺+SSH框架。

1.4 本次課設所用平臺與搭建方法

一開始本設計採用的是虛擬機器+Hadoop系統+SSH框架搭建自己的雲端計算平臺,發現在虛擬機器下的Linux系統無法下載一些系統關鍵應用導致雲平臺無法搭建,前後實驗多次後直接給在純Linux系統部署雲端計算平臺從而成功搭建好雲平臺,本次課程設計所採用的搭建辦法是:

Ubuntu14.04系統+Hadoop系統+SSH框架。

2,雲端計算平臺原理

2.1Hadoop系統原理

Hadoop是一個開源的可運行於大規模叢集上的分散式並行程式設計框架,其最核心的設計包括:Map Reduce和HDFS。基於 Hadoop,你可以輕鬆地編寫可處理海量資料的分散式並行程式,並將其運行於由成百上千個結點組成的大規模計算機叢集上。

簡單的說:Map Reduce框架的核心步驟主要分兩部分:Map和Reduce。當你向Map Reduce框架提交一個計算作業時,它會首先把計算作業拆分成若干個Map任務,然後分配到不同的節點上去執行,每一個Map任務處理輸入資料中的一部分,當Map任務完成後,它會生成一些中間檔案,這些中間檔案將會作為Reduce任務的輸入資料。Reduce對資料做進一步處理之後,輸出最終結果。

Map Reduce是Hadoop的核心技術之一,為分散式計算的程式設計提供了良好的程式設計介面,並且遮蔽了底層通訊原理,使得程式設計師只需關心業務邏輯本事,就可輕易的編寫出基於叢集的分散式並行程式。從它名字上來看,大致可以看出個兩個動詞Map和Reduce,“Map(展開)”就是將一個任務分解成為多個子任務並行的執行,“Reduce”就是將分解後多工處理的結果彙總起來,得出最後的分析結果並輸出。

適合用 Map Reduce來處理的資料集(或任務)有一個基本要求:待處理的資料集可以分解成許多小的資料集,而且每一個小資料集都可以完全並行地進行處理。

想要徹底瞭解Hadoop系統的原理是十分困難的,由於篇幅有限,知識水平也不高,我只能描寫其大概面貌,本次課程設計的核心是學習搭建與運用雲端計算平臺,沒有足夠的時間與精力去完全瞭解Hadoop的原理,在這裡我們不妨就理解為:

Hadoop系統=HDFS分散式檔案系統+Map Reduce運算機制。

這樣就能很好的明白它們的大致關係,有助於對後面實驗的理解。

 

圖2-1 Hadoop系統架構

2.2 Ubuntu系統

本次課程設計所使用的Linux統是ubuntu14。

Ubuntu烏班圖)是一個以桌面應用為主的Linux作業系統,其名稱來自非洲南部祖魯語或豪薩語的“Ubuntu”一詞,意思是“人性”、“我的存在是因為大家的存在”,是非洲傳統的一種價值觀,類似華人社會的“仁愛”思想。Ubuntu基於Debian發行版和GNOME桌面環境,而從11.04版起,Ubuntu發行版放棄了Gnome桌面環境,改為Unity,與Debian的不同在於它每6個月會發佈一個新版本。Ubuntu的目標在於為一般使用者提供一個最新的、同時又相當穩定的主要由自由軟體構建而成的作業系統。

LTS 是 Ubuntu 的長期支援版,因此 Ubuntu 14.04 支援週期長達 3-5 年。因此 Ubuntu 14.04 是追求穩定的使用者和企業的最佳選擇。所以本次課程設計選擇ubuntu14.04LTS版本完全能夠應付雲平臺搭建與相關實驗的任務。


圖2-2 ubuntu14.04LTS系統

3,雲端計算平臺搭建過程

3.1 Ubuntu系統的安裝

去Ubuntu官網下載好對應版本的系統映象,並用虛擬光碟機軟體載入映象,選擇安裝Ubuntu系統,一路點選繼續後大約10來分鐘就可以安裝好Ubuntu系統了。

3.2 Hadopp系統部署

修改機器名:

開啟/etc/hostname檔案,將/etc/hostname檔案中的Ubuntu改為你想取的機器名。這裡我取“s15“。重啟系統後才會生效。

安裝ssh服務:

在terminal視窗中輸入:Sudoa apt-get install open ssh-server

建立ssh無密碼登入本機

在terminal口中輸入:

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa   

 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

得到如下圖說明操作正確:

 

圖3-1 建立ssh無密碼登入本機

登入local host

在terminal口中輸入:bin/start-all.sh

安裝Hadoop :

下載Hadoop 安裝包並解壓,開啟Hadoop/conf/Hadoop.sh檔案,配置conf/Hadoop.sh找到#export JAVA_HOME=...一行,去掉#,然後加上本機JDK的路徑。

開啟conf/core-site.XML檔案,加入如下程式碼:

<configuration>  

<property>    

  <name>fs.default.name</name>    

  <value>hdfs://localhost:9000</value>     

 </property>    

</configuration>  

開啟conf/map red-site.XML檔案,編輯如下:

<configuration>    

     <property>     

      <name>mapred.job.tracker</name>    

      <value>localhost:9001</value>     

     </property>    

    </configuration>    

開啟conf/masters檔案和conf/slaves件,新增secondary的主機名,作為單機版環境,這裡只需填寫local host就Ok了。

到這裡Hadoop系統就部署完畢了。呼叫bin/start-all.sh 命令即可以啟動Hadoop,用JSP命令檢視系統狀態,出現如下資訊說明系統部署成功:

 

圖3-2 用jsp命令檢視系統狀態

4,分散式雲端計算實驗

 雲平臺已經搭建完畢,那麼這只是第一步,關鍵還得學會怎麼用它,為了能夠體現雲端計算與普通PC機計算能力的差異我特意為本次課設設計了一個專門用於對比的實驗程式。

雲端計算的能力在於飛速處理大資料,為了模擬大資料,在一個TXT文字中迴圈寫入了七百多萬單詞,為了便於寫入這麼多單詞,在TXT文字中填充了7094304個“for”來模擬大資料。

接下來分別設計一個用於分散式計算的Map Reduce程式和在普通PC機上執行的JAVA程式,該程式的功能是統計一個文字中的單詞數量,並輸出整個程式執行耗費時間。對比兩個程式在兩個環境中的運算耗費時間即可比較出二者的差異。

4.1 基於Map Reduce的分散式雲端計算實驗

用於分散式計算的程式核心設計如下:

public static void main(String[] Argus) throws Conception {
           Date d = new Date();
  	  long begintime = d.getTime();
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");
   conf.setNumMapTasks(3);
conf.setNumReduceTasks(2);	    
      conf.outspokenness(Text.class);
conf.outclass(Inequitable.class);
   	conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);	JobClient.runJob(conf);
                Date d2 = new Date();
        	long endtime = d2.getTime();
       	 System.out.println("用時:");
       	 System.out.print(endtime-begintime);
      	         System.out.println(" 毫秒"); }

其中 Date d1d2用於捕獲程式執行開始和結束的時間其時間差即為程式運算所耗費的時間;conf.setNumMapTasks(3)設定分散式運算時所以的map數量為3個,conf.setNumReduceTasks(2);設定運算中所以的reduce數量為2個,其他的設定為配置Map Reduce的其他必要引數,在這裡對本實驗無影響就不解析了。

想要利用雲平臺來為我們做計算服務還要把寫好的Map Reduce程式進行編譯,打包成庫檔案,然後將模擬大資料的TXT文件提交到HDFS間,執行以下命令就能啟動雲計算了:

bin/Hadoop as -put input/ input 把檔案提交到HDFS空間

bin/hadoop jar WordCount.jar WordCount input output 啟動雲端計算

得到的結果如下:

 

圖4-1 雲端計算實驗結果

可以看到輸出結果為單詞”for”7094304個,耗時49882毫秒。

4.2 普通PC機上的對比實驗

在普通PC機上執行的對比實驗程式十分簡單,就是對一個文字進行讀取,然後逐行識別出單詞進行統計,其實現過程與Map Reduce程式中統計單詞部分所實現的功能一樣,詳情參見附錄。

該程式在非分散式雲端計算環境中的實驗結果如下:

 

圖4-2 普通PC機實驗結果

可以看到輸出結果為單詞”for”也是7094304個,耗時259973毫秒。

4.3 分散式雲端計算實驗結果與總結

從兩個對比實驗中我們非常清楚的看到同樣都是統計7094304個單詞的運算普通PC機程式耗費了259973毫秒,而分散式雲端計算只用了49882毫秒,分散式雲端計算比普通的計算快了足足5倍有餘,並且由於計算速度受伺服器好壞的影響,這個資料也只是在我的破電腦上的結果,如果在更強大的伺服器上執行那就會有更大的差距。

本設計做的這個對比實驗雖然簡陋,但是麻雀雖小,五臟齊全,同樣能夠很好的對比出兩種運算的優劣。除此之外,在相關的文獻檢視過程中發現雲端計算在資料越大優越性越能體現出來。事實上真正搭建好的叢集式雲端計算平臺對於上GB的大資料都是秒內完成的,這就是雲端計算的強大!

經過這次實驗可以看出,雲端計算有足夠的能力處理物聯網中龐大的資料,在萬物互聯中產生的無數的資料就可以用雲端計算技術加以綜合分析從而來更好的服務於物聯網。

 5, 課程設計總結

本次課程設計總的來說進行的還是很順利的,一開始在本設計中採用主流的虛擬機器加開源雲平臺的方法進行雲平臺搭建,但是在反覆試了多種辦法後都失敗了,之後選擇直接安裝Ubuntu系統來搭建雲平臺,後來回想起來這果然是個聰明的決定,因為在純Linux系統下部署雲平臺的所有操作都進行的十分順利沒有出現任何意外。

部署雲平臺進行的十分順利從而有了更多的時間來學習和設計對比實驗。本以為這個對比實驗不就是寫一個普通的統計單詞的JAVA程式嘛,後來才知道提交到雲端計算平臺的程式結構是有一定語法結構的,並且需要在程式程式碼中手動設定Map Reduce的各項引數,如果不學一學Map Reduce程式的相關知識根本沒法寫出一個簡單的Map Reduce程式,於是借閱了《Hadoop大資料處理》和《Hadoop權威指南》等書籍,學習了幾天後才出步瞭解Map Reduce程式的基本結構和語法,設計的對比實驗程式也就順利出爐了。

普通的PC機計算能力統計了七百多萬個單詞整整耗費了約4分鐘的時間,當用雲端計算來做這個運算時真正的被它的處理速度震撼到了,它竟然只用了不到50秒!第一次真正直觀體驗到到雲端計算的強大就在這一刻開始了!

後來又做了更多的實驗,發現數據越大,兩種處理方法的對比也就越明顯,怪不得現在主流的網際網路公司都要部署雲端計算,沒有這麼強大的計算能力,世界與日俱增的大資料怎麼處理的過來呢!

6,附錄

Map Reduce程式:

import java.util.*;
import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;
import java.text.SimpleDateFormat;
public class WordCount {

	public static class Map extends MapReduceBase implements //map
			Mapper<LongWritable, Text, Text, IntWritable> {
		private final static IntWritable one = new IntWritable(1);  
		private final Text word = new Text();
		@Override
		public void map(LongWritable key, Text value,
				OutputCollector<Text, IntWritable> output, Reporter reporter)
				throws IOException {
			String line = value.toString();
			StringTokenizer tokenizer = new StringTokenizer(line);  //讀取文字內容
			while (tokenizer.hasMoreTokens()) {      //對每個MAP開始各自計數
				word.set(tokenizer.nextToken());
				output.collect(word, one);
			}
		}
	}

	public static class Reduce extends MapReduceBase implements  //Reduce
			Reducer<Text, IntWritable, Text, IntWritable> {
		@Override
		public void reduce(Text key, Iterator<IntWritable> values,
				OutputCollector<Text, IntWritable> output, Reporter reporter)
				throws IOException {
			int sum = 0;
			while (values.hasNext()) {
				sum += values.next().get();   //將所有MAP記得數相加
			}
			output.collect(key, new IntWritable(sum));  //彙總
		}
	}
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
              Date d = new Date();
  	     long begintime = d.getTime();	
		JobConf conf = new JobConf(WordCount.class);
		conf.setJobName("wordcount");
		
		//設定MAP數	
		conf.setNumMapTasks(3);
		//設定REDUCE數
		conf.setNumReduceTasks(2);
		// 設定輸出的key和value型別
		conf.setOutputKeyClass(Text.class);
		conf.setOutputValueClass(IntWritable.class);
		// 設定各個作業的類
		conf.setMapperClass(Map.class);
		conf.setCombinerClass(Reduce.class);
		conf.setReducerClass(Reduce.class);
		// 設定輸入輸出的格式
		conf.setInputFormat(TextInputFormat.class);
		conf.setOutputFormat(TextOutputFormat.class);
		FileInputFormat.setInputPaths(conf, new Path(args[0]));
		FileOutputFormat.setOutputPath(conf, new Path(args[1]));
		JobClient.runJob(conf);
                Date d2 = new Date();
        	long endtime = d2.getTime();	
       		 System.out.println("用時:");
       		 System.out.print(endtime-begintime);
      	         System.out.println(" 毫秒");

用於對比的統計單詞程式:import java.io.File;

import java.io.FileNotFoundException;
import java.util.Scanner;
 import java.util.*;
import java.text.SimpleDateFormat;
public class Readtxt {
    public static void main(String[] args) {
        Date d = new Date();
  	long begintime = d.getTime();	
	int count = 0;
        try {
            Scanner in = new Scanner(new File("testtxt.txt"));
  
            while (in.hasNext()) {
                String str = in.next();
                splitt(str);
                count++;   
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("這個文字內單詞的個數是:"+count);
        Date d2 = new Date();
        long endtime = d2.getTime();	
        System.out.println("用時:");
        System.out.print(endtime-begintime);
        System.out.println(" 毫秒");
    }
    public static void splitt(String str){
        String strr = str.trim();
        String[] abc = strr.split("[\\p{Space}]+");
        for(int i=0;i<abc.length;i++)
	{
	System.out.println(abc[i]);
		}
    }
     
}