day06.Hadoop快速入門&云服務三種模式IaaS,PaaS和SaaS【大數據教程】
1. HADOOP背景介紹
1.1?什么是HADOOP
1).?HADOOP是apache旗下的一套開源軟件平臺
2).?HADOOP提供的功能:利用服務器集群,根據用戶的自定義業務邏輯,對海量數據進行分布式處理
3).?HADOOP的核心組件有
A.?HDFS(分布式文件系統)
B.?YARN(運算資源調度系統)
C.?MAPREDUCE(分布式運算編程框架)
4).廣義上來說,HADOOP通常是指一個更廣泛的概念——HADOOP生態圈
1.2?HADOOP產生背景
1).?HADOOP最早起源于Nutch。
Nutch的設計目標是構建一個大型的全網搜索引擎,包括網頁抓取、索引、查詢等功能,但隨著抓取網頁數量的增加,遇到了嚴重的可擴展性問題——如何解決數十億網頁的存儲和索引問題。
2).?2003年、2004年谷歌發表的兩篇論文為該問題提供了可行的解決方案。
——分布式文件系統(GFS),可用于處理海量網頁的存儲
——分布式計算框架MAPREDUCE,可用于處理海量網頁的索引計算問題。
3).?Nutch的開發人員完成了相應的開源實現HDFS和MAPREDUCE,并從Nutch中剝離成為獨立項目HADOOP,到2008年1月,HADOOP成為Apache頂級項目,迎來了它的快速發展期。
1.3?HADOOP在大數據、云計算中的位置和關系
1).云計算是分布式計算、并行計算、網格計算、多核計算、網絡存儲、虛擬化、負載均衡等傳統計算機技術和互聯網技術融合發展的產物。借助IaaS(基礎設施即服務)、PaaS(平臺即服務)、SaaS(軟件即服務)等業務模式,把強大的計算能力提供給終端用戶。
2).現階段,云計算的兩大底層支撐技術為“虛擬化”和“大數據技術”
3).而HADOOP則是云計算的PaaS層的解決方案之一,并不等同于PaaS,更不等同于云計算本身。
1.4?國內外HADOOP應用案例介紹
1).HADOOP應用于數據服務基礎平臺建設
2).HADOOP用于用戶畫像
3).HADOOP用于網站點擊流日志數據挖掘
1.5?國內HADOOP的就業情況分析
1).HADOOP就業整體情況
A.大數據產業已納入國家十三五規劃
B.各大城市都在進行智慧城市項目建設,而智慧城市的根基就是大數據綜合平臺
C.互聯網時代數據的種類,增長都呈現爆發式增長,各行業對數據的價值日益重視
D.相對于傳統JAVAEE技術領域來說,大數據領域的人才相對稀缺
E.隨著現代社會的發展,數據處理和數據挖掘的重要性只會增不會減,因此,大數據技術是一個尚在蓬勃發展且具有長遠前景的領域
2).HADOOP就業職位要求
大數據是個復合專業,包括應用開發、軟件平臺、算法、數據挖掘等,因此,大數據技術領域的就業選擇是多樣的,但就HADOOP而言,通常都需要具備以下技能或知識:
A.?HADOOP分布式集群的平臺搭建
B.?HADOOP分布式文件系統HDFS的原理理解及使用
C.?HADOOP分布式運算框架MAPREDUCE的原理理解及編程
D.?Hive數據倉庫工具的熟練應用
E.?Flume、sqoop、oozie等輔助工具的熟練使用
F.?Shell/python等腳本語言的開發能力
3).HADOOP相關職位的薪資水平
大數據技術或具體到HADOOP的就業需求目前主要集中在北上廣深一線城市,薪資待遇普遍高于傳統JAVAEE開發人員,以北京為例:
1.6?HADOOP生態圈以及各組成部分的簡介
各組件簡介
HADOOP(hdfs、MAPREDUCE、yarn)元老級大數據處理技術框架,擅長離線數據分析
Zookeeper分布式協調服務基礎組件
Hbase?分布式海量數據庫,離線分析和在線業務通吃
Hive sql數據倉庫工具,使用方便,功能豐富,基于MR延遲大
Sqoop數據導入導出工具
Flume數據采集框架
重點組件:
HDFS:分布式文件系統
MAPREDUCE:分布式運算程序開發框架
HIVE:基于大數據技術(文件系統+運算框架)的SQL數據倉庫工具
HBASE:基于HADOOP的分布式海量數據庫
ZOOKEEPER:分布式協調服務基礎組件
Mahout:基于mapreduce/spark/flink等分布式運算框架的機器學習算法庫
Oozie:工作流調度框架
Sqoop:數據導入導出工具
Flume:日志數據采集框架
2?分布式系統概述
注:由于大數據技術領域的各類技術框架基本上都是分布式系統,因此,理解hadoop、storm、spark等技術框架,都需要具備基本的分布式系統概念
2.1?分布式軟件系統(Distributed Software Systems)
該軟件系統會劃分成多個子系統或模塊,各自運行在不同的機器上,子系統或模塊之間通過網絡通信進行協作,實現最終的整體功能
比如分布式操作系統、分布式程序設計語言及其編譯(解釋)系統、分布式文件系統和分布式數據庫系統等。
2.2?分布式軟件系統舉例:solrcloud?
A.一個solrcloud集群通常有多臺solr服務器
B.每一個solr服務器節點負責存儲整個索引庫的若干個shard(數據分片)
C.每一個shard又有多臺服務器存放若干個副本互為主備用
D.索引的建立和查詢會在整個集群的各個節點上并發執行
E.?solrcloud集群作為整體對外服務,而其內部細節可對客戶端透明
總結:利用多個節點共同協作完成一項或多項具體業務功能的系統就是分布式系統。
2.3?分布式應用系統模擬開發
需求:可以實現由主節點將運算任務發往從節點,并將各從節點上的任務啟動;
程序清單:
AppMaster
AppSlave/APPSlaveThread
Task
程序運行邏輯流程:
3.?離線數據分析流程介紹
注:本環節主要感受數據分析系統的宏觀概念及處理流程,初步理解hadoop等框架在其中的應用環節,不用過于關注代碼細節
一個應用廣泛的數據分析系統:“web日志數據挖掘”
3.1?需求分析
3.1.1?案例名稱
“網站或APP點擊流日志數據挖掘系統”。
一般中型的網站(10W的PV以上),每天會產生1G以上Web日志文件。大型或超大型的網站,可能每小時就會產生10G的數據量。
具體來說,比如某電子商務網站,在線團購業務。每日PV數100w,獨立IP數5w。用戶通常在工作日上午10:00-12:00和下午15:00-18:00訪問量最大。日間主要是通過PC端瀏覽器訪問,休息日及夜間通過移動設備訪問較多。網站搜索瀏量占整個網站的80%,PC用戶不足1%的用戶會消費,移動用戶有5%會消費。
對于日志的這種規模的數據,用HADOOP進行日志分析,是最適合不過的了。
3.1.2?案例需求描述
“Web點擊流日志”包含著網站運營很重要的信息,通過日志分析,我們可以知道網站的訪問量,哪個網頁訪問人數最多,哪個網頁最有價值,廣告轉化率、訪客的來源信息,訪客的終端信息等。
3.1.3?數據來源
本案例的數據主要由用戶的點擊行為記錄
獲取方式:在頁面預埋一段js程序,為頁面上想要監聽的標簽綁定事件,只要用戶點擊或移動到標簽,即可觸發ajax請求到后臺servlet程序,用log4j記錄下事件信息,從而在web服務器(nginx、tomcat等)上形成不斷增長的日志文件。
形如:
58.215.204.118 - - [18/Sep/2013:06:51:35 +0000] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" 304 0 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"
3.2?數據處理流程
3.2.1?流程圖解析
本案例跟典型的BI系統極其類似,整體流程如下:
但是,由于本案例的前提是處理海量數據,因而,流程中各環節所使用的技術則跟傳統BI完全不同,后續課程都會一一講解:
1)數據采集:定制開發采集程序,或使用開源框架FLUME
2)數據預處理:定制開發mapreduce程序運行于hadoop集群
3)數據倉庫技術:基于hadoop之上的Hive
4)數據導出:基于hadoop的sqoop數據導入導出工具
5)數據可視化:定制開發web程序或使用kettle等產品
6)整個過程的流程調度:hadoop生態圈中的oozie工具或其他類似開源產品
3.2.2?項目技術架構圖
3.2.3?項目相關截圖(感性認識,欣賞即可)
a)?Mapreudce程序運行
b)在Hive中查詢數據
c)將統計結果導入mysql
./sqoop export --connect jdbc:mysql://localhost:3306/weblogdb --username root --password root ?--table t_display_xx ?--export-dir /user/hive/warehouse/uv/dt=2014-08-03
3.3?項目最終效果
經過完整的數據處理流程后,會周期性輸出各類統計指標的報表,在生產實踐中,最終需要將這些報表數據以可視化的形式展現出來,本案例采用web程序來實現數據可視化
效果如下所示:
4.?集群搭建
4.1 HADOOP集群搭建
4.1.1集群簡介
HADOOP集群具體來說包含兩個集群:HDFS集群和YARN集群,兩者邏輯上分離,但物理上常在一起
HDFS集群:
負責海量數據的存儲,集群中的角色主要有?NameNode / DataNode
YARN集群:
負責海量數據運算時的資源調度,集群中的角色主要有?ResourceManager /NodeManager
(那mapreduce是什么呢?它其實是一個應用程序開發包)
?
本集群搭建案例,以5節點為例進行搭建,角色分配如下:
hdp-node-01 ???NameNode ?SecondaryNameNode
hdp-node-02 ???ResourceManager
hdp-node-03?DataNode ???NodeManager
hdp-node-04?DataNode ???NodeManager
hdp-node-05?DataNode ???NodeManager
部署圖如下:
4.1.2服務器準備
本案例使用虛擬機服務器來搭建HADOOP集群,所用軟件及版本:
Vmware 11.0
Centos ?6.5 ?64bit
4.1.3網絡環境準備
采用NAT方式聯網
網關地址:192.168.33.1
3個服務器節點IP地址:192.168.33.101、192.168.33.102、192.168.33.103
子網掩碼:255.255.255.0
4.1.4服務器系統設置
添加HADOOP用戶
為HADOOP用戶分配sudoer權限
同步時間
設置主機名
hdp-node-01
hdp-node-02
hdp-node-03
配置內網域名映射:
192.168.33.101??????????hdp-node-01
192.168.33.102??????????hdp-node-02
192.168.33.103??????????hdp-node-03
配置ssh免密登陸
配置防火墻
4.1.5?Jdk環境安裝
上傳jdk安裝包
規劃安裝目錄 ?/home/hadoop/apps/jdk_1.7.65
解壓安裝包
配置環境變量 /etc/profile
4.1.6?HADOOP安裝部署
上傳HADOOP安裝包
規劃安裝目錄 ?/home/hadoop/apps/hadoop-2.6.1
解壓安裝包
修改配置文件??$HADOOP_HOME/etc/hadoop/
最簡化配置如下:
vi??hadoop-env.sh
# The java implementation to use.
export JAVA_HOME=/home/hadoop/apps/jdk1.7.0_51
vi??core-site.xml
fs.defaultFS
hdfs://hdp-node-01:9000
hadoop.tmp.dir
/home/HADOOP/apps/hadoop-2.6.1/tmp
vi??hdfs-site.xml
dfs.namenode.name.dir
/home/hadoop/data/name
dfs.datanode.data.dir
/home/hadoop/data/data
dfs.replication
3
dfs.secondary.http.address
hdp-node-01:50090
vi??mapred-site.xml
mapreduce.framework.name
yarn
vi??yarn-site.xml
yarn.resourcemanager.hostname
hadoop01
yarn.nodemanager.aux-services
mapreduce_shuffle
vi??salves
hdp-node-01
hdp-node-02
hdp-node-03
4.1.7?啟動集群
初始化HDFS
bin/hadoop??namenode ?-format?
啟動HDFS
sbin/start-dfs.sh
啟動YARN
sbin/start-yarn.sh
4.1.8?測試
1.上傳文件到HDFS
從本地上傳一個文本文件到hdfs的/wordcount/input目錄下
[HADOOP@hdp-node-01 ~]$ HADOOP fs -mkdir -p /wordcount/input
[HADOOP@hdp-node-01 ~]$ HADOOP fs -put /home/HADOOP/somewords.txt ?/wordcount/input
2.運行一個mapreduce程序
在HADOOP安裝目錄下,運行一個示例mr程序
cd $HADOOP_HOME/share/hadoop/mapreduce/
hadoop jar mapredcue-example-2.6.1.jar wordcount /wordcount/input ?/wordcount/output
5?集群使用初步
5.1 HDFS使用
1).查看集群狀態
命令:?hdfs ?dfsadmin ?–report
可以看出,集群共有3個datanode可用
也可打開web控制臺查看HDFS集群信息,在瀏覽器打開http://hdp-node-01:50070/
2).上傳文件到HDFS
查看HDFS中的目錄信息
命令: ??hadoop??fs ?–ls ?/
上傳文件
命令: ??hadoop ?fs ?-put ?./?scala-2.10.6.tgz??to ?/
從HDFS下載文件
命令: ?hadoop ?fs ?-get ?/yarn-site.xml
5.2 MAPREDUCE使用
mapreduce是hadoop中的分布式運算編程框架,只要按照其編程規范,只需要編寫少量的業務邏輯代碼即可實現一個強大的海量數據并發處理程序
5.2.1 Demo開發——wordcount
1.需求
從大量(比如T級別)文本文件中,統計出每一個單詞出現的總次數
2.mapreduce實現思路
Map階段:
a)?從HDFS的源數據文件中逐行讀取數據
b)?將每一行數據切分出單詞
c)?為每一個單詞構造一個鍵值對(單詞,1)
d)?將鍵值對發送給reduce
Reduce階段:
a)?接收map階段輸出的單詞鍵值對
b)?將相同單詞的鍵值對匯聚成一組
c)?對每一組,遍歷組中的所有“值”,累加求和,即得到每一個單詞的總次數
d)?將(單詞,總次數)輸出到HDFS的文件中
3.具體編碼實現
(1)定義一個mapper類
//首先要定義四個泛型的類型
//keyin: ?LongWritable ???valuein: Text
//keyout: Text ???????????valueout:IntWritable
public class WordCountMapper extends Mapper{
//map方法的生命周期: ?框架每傳一行數據就被調用一次
//key :這一行的起始點在文件中的偏移量
//value:?這一行的內容
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//拿到一行數據轉換為string
String line = value.toString();
//將這一行切分出各個單詞
String[] words = line.split(" ");
//遍歷數組,輸出<單詞,1>
for(String word:words){
context.write(new Text(word), new IntWritable(1));
}
}
}
(2)定義一個reducer類
//生命周期:框架每傳遞進來一個kv?組,reduce方法被調用一次
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
//定義一個計數器
int count = 0;
//遍歷這一組kv的所有v,累加到count中
for(IntWritable value:values){
count += value.get();
}
context.write(key, new IntWritable(count));
}
}
(3)定義一個主類,用來描述job并提交job
public class WordCountRunner {
//把業務邏輯相關的信息(哪個是mapper,哪個是reducer,要處理的數據在哪里,輸出的結果放哪里。。。。。。)描述成一個job對象
//把這個描述好的job提交給集群去運行
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job wcjob = Job.getInstance(conf);
//指定我這個job所在的jar包
//?wcjob.setJar("/home/hadoop/wordcount.jar");
wcjob.setJarByClass(WordCountRunner.class);
wcjob.setMapperClass(WordCountMapper.class);
wcjob.setReducerClass(WordCountReducer.class);
//設置我們的業務邏輯Mapper類的輸出key和value的數據類型
wcjob.setMapOutputKeyClass(Text.class);
wcjob.setMapOutputValueClass(IntWritable.class);
//設置我們的業務邏輯Reducer類的輸出key和value的數據類型
wcjob.setOutputKeyClass(Text.class);
wcjob.setOutputValueClass(IntWritable.class);
//指定要處理的數據所在的位置
FileInputFormat.setInputPaths(wcjob, "hdfs://hdp-server01:9000/wordcount/data/big.txt");
//指定處理完成之后的結果所保存的位置
FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://hdp-server01:9000/wordcount/output/"));
//向yarn集群提交這個job
boolean res = wcjob.waitForCompletion(true);
System.exit(res?0:1);
}
5.2.2?程序打包運行
1.?將程序打包
2.?準備輸入數據
vi??/home/hadoop/test.txt
Hello tom
Hello jim
Hello ketty
Hello world
Ketty tom
在hdfs上創建輸入數據文件夾:
hadoop???fs ?mkdir ?-p ?/wordcount/input
將words.txt上傳到hdfs上
hadoop??fs ?–put ?/home/hadoop/words.txt ?/wordcount/input
3.?將程序jar包上傳到集群的任意一臺服務器上
4.?使用命令啟動執行wordcount程序jar包
$ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out
5.?查看執行結果
$ hadoop?fs –cat /wordcount/out/part-r-00000
擴展:
云計算的三種服務模式:IaaS,PaaS和SaaS(公司普遍軟件服務模式)
? ? ? ?”云服務”現在已經快成了一個家喻戶曉的詞了。如果你不知道PaaS, IaaS?和SaaS的區別,那么也沒啥,因為很多人確實不知道。“云”其實是互聯網的一個隱喻,“云計算”其實就是使用互聯網來接入存儲或者運行在遠程服務器端的應用,數據,或者服務。? ?任何一個使用基于互聯網的方法來計算,存儲和開發的公司,都可以從技術上叫做從事云的公司。然而,不是所有的云公司都一樣。不是所有人都是CTO,所以有時候看到云技術背后的一些詞可能會比較頭疼。
云也是分層的
任何一個在互聯網上提供其服務的公司都可以叫做云計算公司。其實云計算分幾層的,分別是
Infrastructure(基礎設施)-as-a-Service,
Platform(平臺)-as-a-Service,
Software(軟件)-as-a-Service。
基礎設施在最下端,平臺在中間,軟件在頂端。別的一些“軟”的層可以在這些層上面添加。
?IaaS: Infrastructure-as-a-Service(基礎設施即服務)
第一層叫做IaaS,有時候也叫做Hardware-as-a-Service,幾年前如果你想在辦公室或者公司的網站上運行一些企業應用,你需要去買服務器,或者別的高昂的硬件來控制本地應用,讓你的業務運行起來。 但是現在有IaaS,你可以將硬件外包到別的地方去。IaaS公司會提供場外服務器,存儲和網絡硬件,你可以租用。節省了維護成本和辦公場地,公司可以在任何時候利用這些硬件來運行其應用。 一些大的IaaS公司包括Amazon, Microsoft, VMWare, Rackspace和Red Hat.不過這些公司又都有自己的專長,比如Amazon和微軟給你提供的不只是IaaS,他們還會將其計算能力出租給你來host你的網站。
PaaS: Platform-as-a-Service(平臺即服務)
第二層就是所謂的PaaS,某些時候也叫做中間件。你公司所有的開發都可以在這一層進行,節省了時間和資源。PaaS公司在網上提供各種開發和分發應用的解決方案,比如虛擬服務器和操作系統。這節省了你在硬件上的費用,也讓分散的工作室之間的合作變得更加容易。網頁應用管理,應用設計,應用虛擬主機,存儲,安全以及應用開發協作工具等。 一些大的PaaS提供者有Google App Engine,Microsoft Azure,Force.com,Heroku,Engine Yard。最近興起的公司有AppFog,?Mendix和?Standing Cloud
SaaS: Software-as-a-Service(軟件即服務)
第三層也就是所謂SaaS。這一層是和你的生活每天接觸的一層,大多是通過網頁瀏覽器來接入。任何一個遠程服務器上的應用都可以通過網絡來運行,就是SaaS了。 你消費的服務完全是從網頁如Netflix, MOG, Google Apps, Box.net, Dropbox或者蘋果的iCloud那里進入這些分類。盡管這些網頁服務是用作商務和娛樂或者兩者都有,但這也算是云技術的一部分。 一些用作商務的SaaS應用包括Citrix的GoToMeeting,Cisco的WebEx,Salesforce的CRM,ADP,Workday和SuccessFactors。
Iaas和Paas之間的比較
PaaS的主要作用是將一個開發和運行平臺作為服務提供給用戶,而IaaS的主要作用是提供虛擬機或者其他資源作為服務提供給用戶。接下來,將在七個方面對PaaS和IaaS進行比較:
?1)?開發環境:PaaS基本都會給開發者提供一整套包括IDE在內的開發和測試環境,而IaaS方面用戶主要還是沿用之前比較熟悉那套開發環境,但是因為之前那套開發環境在和云的整合方面比較欠缺,所以使用起來不是很方便。?2)?支持的應用:因為IaaS主要是提供虛擬機,而且普通的虛擬機能支持多種操作系統,所以IaaS支持的應用的范圍是非常廣泛的。但如果要讓一個應用能跑在某個PaaS平臺不是一件輕松的事,因為不僅需要確保這個應用是基于這個平臺所支持的語言,而且也要確保這個應用只能調用這個平臺所支持的API,如果這個應用調用了平臺所不支持的API,那么就需要對這個應用進行修改。3)?開放標準:雖然很多IaaS平臺都存在一定的私有功能,但是由于OVF等協議的存在,使得IaaS在跨平臺和避免被供應商鎖定這兩面是穩步前進的。而PaaS平臺的情況則不容樂觀,因為不論是Google的App Engine,還是Salesforce的Force.com都存在一定的私有API。?4)?可伸縮性:PaaS平臺會自動調整資源來幫助運行于其上的應用更好地應對突發流量。而IaaS平臺則需要開發人員手動對資源進行調整才能應對。?5)?整合率和經濟性:PaaS平臺整合率是非常高,比如PaaS的代表Google App Engine能在一臺服務器上承載成千上萬的應用,而普通的IaaS平臺的整合率最多也不會超過100,而且普遍在10左右,使得IaaS的經濟性不如PaaS。?6)?計費和監管:因為PaaS平臺在計費和監管這兩方面不僅達到了IaaS平臺所能企及的操作系統層面,比如,CPU和內存的使用量等,而且還能做到應用層面,比如,應用的反應時間(Response Time)或者應用所消耗的事務多少等,這將提高計費和管理的精確性。?7)?學習難度:因為在IaaS上面開發和管理應用和現有的方式比較接近,而PaaS上面開發則有可能需要學一門新的語言或者新的框架,所以IaaS學習難度更低。
PaaSIaaS
開發環境完善普通
支持的應用有限廣
通用性欠缺稍好
可伸縮性自動伸縮手動伸縮
整合率和經濟性高整合率,更經濟低整合率
計費和監管精細簡單
學習難度略難低
表1. PaaS和IaaS之間的比較
未來的PK
?在當今云計算環境當中,IaaS是非常主流的,無論是Amazon EC2還是Linode或者Joyent等,都占有一席之地,但是隨著Google的App Engine,Salesforce的Force.com還是微軟的Windows Azure等PaaS平臺的推出,使得PaaS也開始嶄露頭角。談到這兩者的未來,特別是這兩者之間的競爭關系,我個人認為,短期而言,因為IaaS模式在支持的應用和學習難度這兩方面的優勢,使得IaaS將會在短期之內會成為開發者的首選,但是從長期而言,因為PaaS模式的高整合率所帶來經濟型使得如果PaaS能解決諸如通用性和支持的應用等方面的挑戰,它將會替代IaaS成為開發者的“新寵”。