1. HADOOP****背景介紹
** 1.1 ****什么是HADOOP**
HADOOP是apache旗下的一套開源軟件平臺
HADOOP提供的功能:利用服務器集群,根據(jù)用戶的自定義業(yè)務邏輯,對海量數(shù)據(jù)進行分布式處理
HADOOP的核心組件有
A. HDFS(分布式文件系統(tǒng))
B. YARN(運算資源調(diào)度系統(tǒng))
C. MAPREDUCE(分布式運算編程框架)
- 廣義上來說,HADOOP通常是指一個更廣泛的概念——HADOOP生態(tài)圈
1.2 ****HADOOP產(chǎn)生背景
HADOOP最早起源于Nutch。Nutch的設計目標是構建一個大型的全網(wǎng)搜索引擎,包括網(wǎng)頁抓取、索引、查詢等功能,但隨著抓取網(wǎng)頁數(shù)量的增加,遇到了嚴重的可擴展性問題——如何解決數(shù)十億網(wǎng)頁的存儲和索引問題。
2003年、2004年谷歌發(fā)表的兩篇論文為該問題提供了可行的解決方案。
——分布式文件系統(tǒng)(GFS),可用于處理海量網(wǎng)頁的存儲
——分布式計算框架MAPREDUCE,可用于處理海量網(wǎng)頁的索引計算問題。
- Nutch的開發(fā)人員完成了相應的開源實現(xiàn)HDFS和MAPREDUCE,并從Nutch中剝離成為獨立項目HADOOP,到2008年1月,HADOOP成為Apache頂級項目,迎來了它的快速發(fā)展期。
1.3 ****HADOOP在大數(shù)據(jù)、云計算中的位置和關系
云計算是分布式計算、并行計算、網(wǎng)格計算、多核計算、網(wǎng)絡存儲、虛擬化、負載均衡等傳統(tǒng)計算機技術和互聯(lián)網(wǎng)技術融合發(fā)展的產(chǎn)物。借助IaaS(基礎設施即服務)、PaaS(平臺即服務)、SaaS(軟件即服務)等業(yè)務模式,把強大的計算能力提供給終端用戶。
現(xiàn)階段,云計算的兩大底層支撐技術為“虛擬化”和“大數(shù)據(jù)技術”
而HADOOP則是云計算的PaaS層的解決方案之一,并不等同于PaaS,更不等同于云計算本身。
1.4 ****國內(nèi)外HADOOP應用案例介紹
1、HADOOP應用于數(shù)據(jù)服務基礎平臺建設
2/HADOOP用于用戶畫像
3、HADOOP用于網(wǎng)站點擊流日志****數(shù)據(jù)****挖掘
1.6 ****HADOOP生態(tài)圈以及各組成部分的簡介
各組件簡介
HADOOP(hdfs、MAPREDUCE、yarn) 元老級大數(shù)據(jù)處理技術框架,擅長離線數(shù)據(jù)分析
Zookeeper 分布式協(xié)調(diào)服務基礎組件
Hbase 分布式海量數(shù)據(jù)庫,離線分析和在線業(yè)務通吃
Hive sql 數(shù)據(jù)倉庫工具,使用方便,功能豐富,基于MR延遲大
Sqoop數(shù)據(jù)導入導出工具
Flume數(shù)據(jù)采集框架
重點組件:
HDFS:分布式文件系統(tǒng)
MAPREDUCE:分布式運算程序開發(fā)框架
HIVE:基于大數(shù)據(jù)技術(文件系統(tǒng)+運算框架)的SQL數(shù)據(jù)倉庫工具
HBASE:基于HADOOP的分布式海量數(shù)據(jù)庫
ZOOKEEPER:分布式協(xié)調(diào)服務基礎組件
Mahout:基于mapreduce/spark/flink等分布式運算框架的機器學習算法庫
Oozie:工作流調(diào)度框架
Sqoop:數(shù)據(jù)導入導出工具
Flume:日志數(shù)據(jù)采集框架
2 ****分布式系統(tǒng)概述
注:由于大數(shù)據(jù)技術領域的各類技術框架基本上都是分布式系統(tǒng),因此,理解hadoop、storm、spark等技術框架,都需要具備基本的分布式系統(tǒng)概念
2.1 ****分布式軟件系統(tǒng)(Distributed Software Systems)
2 該軟件系統(tǒng)會劃分成多個子系統(tǒng)或模塊,各自運行在不同的機器上,子系統(tǒng)或模塊之間通過網(wǎng)絡通信進行協(xié)作,實現(xiàn)最終的整體功能
2 比如分布式操作系統(tǒng)、分布式程序設計語言及其編譯(解釋)系統(tǒng)、分布式文件系統(tǒng)和分布式數(shù)據(jù)庫系統(tǒng)等。
2.2 ****分布式軟件系統(tǒng)舉例:solrcloud
A. 一個solrcloud集群通常有多臺solr服務器
B. 每一個solr服務器節(jié)點負責存儲整個索引庫的若干個shard(數(shù)據(jù)分片)
C. 每一個shard又有多臺服務器存放若干個副本互為主備用
D. 索引的建立和查詢會在整個集群的各個節(jié)點上并發(fā)執(zhí)行
E. solrcloud集群作為整體對外服務,而其內(nèi)部細節(jié)可對客戶端透明
總結:利用多個節(jié)點共同協(xié)作完成一項或多項具體業(yè)務功能的系統(tǒng)就是分布式系統(tǒng)。
2.3 分布式應用系統(tǒng)模擬開發(fā)
需求:可以實現(xiàn)由主節(jié)點將運算任務發(fā)往從節(jié)點,并將各從節(jié)點上的任務啟動;
程序清單:
AppMaster
AppSlave/APPSlaveThread
Task
程序運行邏輯流程:
3. ****離線****數(shù)據(jù)分析****流程介紹
注:本環(huán)節(jié)主要感受數(shù)據(jù)分析系統(tǒng)的宏觀概念及處理流程,初步理解hadoop等框架在其中的應用環(huán)節(jié),不用過于關注代碼細節(jié)
一個應用廣泛的數(shù)據(jù)分析系統(tǒng):“web日志數(shù)據(jù)挖掘”
3.1 需求分析
3.1.1 案例名稱
“網(wǎng)站或APP點擊流日志數(shù)據(jù)挖掘系統(tǒng)”。
3.1.2 案例需求描述
“Web點擊流日志”包含著網(wǎng)站運營很重要的信息,通過日志分析,我們可以知道網(wǎng)站的訪問量,哪個網(wǎng)頁訪問人數(shù)最多,哪個網(wǎng)頁最有價值,廣告轉化率、訪客的來源信息,訪客的終端信息等。
3.1.3 數(shù)據(jù)來源
本案例的數(shù)據(jù)主要由用戶的點擊行為記錄
獲取方式:在頁面預埋一段js程序,為頁面上想要監(jiān)聽的標簽綁定事件,只要用戶點擊或移動到標簽,即可觸發(fā)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 數(shù)據(jù)處理流程
3.2.1 流程圖解析
本案例跟典型的BI系統(tǒng)極其類似,整體流程如下:
但是,由于本案例的前提是處理海量數(shù)據(jù),因而,流程中各環(huán)節(jié)所使用的技術則跟傳統(tǒng)BI完全不同,后續(xù)課程都會一一講解:
數(shù)據(jù)采集:定制開發(fā)采集程序,或使用開源框架FLUME
數(shù)據(jù)預處理:定制開發(fā)mapreduce程序運行于hadoop集群
數(shù)據(jù)倉庫技術:基于hadoop之上的Hive
數(shù)據(jù)導出:基于hadoop的sqoop數(shù)據(jù)導入導出工具
數(shù)據(jù)可視化:定制開發(fā)web程序或使用kettle等產(chǎn)品
整個過程的流程調(diào)度:hadoop生態(tài)圈中的oozie工具或其他類似開源產(chǎn)品
3.2.2 項目技術架構圖
3.2.3 項目相關截圖(感性認識,欣賞即可)
a) Mapreudce程序運行
b) 在Hive中查詢數(shù)據(jù)
c) 將統(tǒng)計結果導入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 項目最終效果
經(jīng)過完整的數(shù)據(jù)處理流程后,會周期性輸出各類統(tǒng)計指標的報表,在生產(chǎn)實踐中,最終需要將這些報表數(shù)據(jù)以可視化的形式展現(xiàn)出來,本案例采用web程序來實現(xiàn)數(shù)據(jù)可視化
效果如下所示:
4. 集群搭建
4.1 HADOOP集群搭建
4.1.1集群簡介
HADOOP集群具體來說包含兩個集群:HDFS集群和YARN集群,兩者邏輯上分離,但物理上常在一起
HDFS集群:
負責海量數(shù)據(jù)的存儲,集群中的角色主要有 NameNode / DataNode
YARN集群:
負責海量數(shù)據(jù)運算時的資源調(diào)度,集群中的角色主要有 ResourceManager /NodeManager
(那mapreduce是什么呢?它其實是一個應用程序開發(fā)包)
本集群搭建案例,以5節(jié)點為例進行搭建,角色分配如下:
|
hdp-node-01 NameNode SecondaryNameNode
hdp-node-02 ResourceManager
hdp-node-03DataNode NodeManager
hdp-node-04DataNode NodeManager
hdp-node-05DataNode NodeManager
|
部署圖如下:
4.1.2服務器準備
本案例使用虛擬機服務器來搭建HADOOP集群,所用軟件及版本:
ü Vmware 11.0
ü Centos 6.5 64bit
4.1.3網(wǎng)絡環(huán)境準備
ü 采用NAT方式聯(lián)網(wǎng)
ü 網(wǎng)關地址:192.168.33.1
ü 3個服務器節(jié)點IP地址:192.168.33.101、192.168.33.102、192.168.33.103
ü 子網(wǎng)掩碼:255.255.255.0
4.1.4服務器系統(tǒng)設置
ü 添加HADOOP用戶
ü 為HADOOP用戶分配sudoer權限
ü 同步時間
ü 設置主機名
n hdp-node-01
n hdp-node-02
n hdp-node-03
ü 配置內(nèi)網(wǎng)域名映射:
n 192.168.33.101 hdp-node-01
n 192.168.33.102 hdp-node-02
n 192.168.33.103 hdp-node-03
ü 配置ssh免密登陸
ü 配置防火墻
4.1.5 ****J****dk環(huán)境安裝
ü 上傳jdk安裝包
ü 規(guī)劃安裝目錄 /home/hadoop/apps/jdk_1.7.65
ü 解壓安裝包
ü 配置環(huán)境變量 /etc/profile
4.1.6 ****HADOOP****安裝部署
ü 上傳HADOOP安裝包
ü 規(guī)劃安裝目錄 /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
|
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdp-node-01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/HADOOP/apps/hadoop-2.6.1/tmp</value>
</property>
</configuration>
|
vi hdfs-site.xml
|
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hdp-node-01:50090</value>
</property>
</configuration>
|
vi mapred-site.xml
|
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
|
vi yarn-site.xml
|
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
|
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、查看集群狀態(tài)
命令: hdfs dfsadmin –report
可以看出,集群共有3個datanode可用
也可打開web控制臺查看HDFS集群信息,在瀏覽器打開http://hdp-node-01:50070/
2、上傳文件到HDFS
2 查看HDFS中的目錄信息
命令: hadoop fs –ls /
2 上傳文件
命令: hadoop fs -put ./ scala-2.10.6.tgz to /
2 從HDFS下載文件
命令: hadoop fs -get /yarn-site.xml
5.2 MAPREDUCE使用
mapreduce是hadoop中的分布式運算編程框架,只要按照其編程規(guī)范,只需要編寫少量的業(yè)務邏輯代碼即可實現(xiàn)一個強大的海量數(shù)據(jù)并發(fā)處理程序
5.2.1 Demo開發(fā)——wordcount
1、需求
從大量(比如T級別)文本文件中,統(tǒng)計出每一個單詞出現(xiàn)的總次數(shù)
2、mapreduce實現(xiàn)思路
Map階段:
a) 從HDFS的源數(shù)據(jù)文件中逐行讀取數(shù)據(jù)
b) 將每一行數(shù)據(jù)切分出單詞
c) 為每一個單詞構造一個鍵值對(單詞,1)
d) 將鍵值對發(fā)送給reduce
Reduce階段:
a) 接收map階段輸出的單詞鍵值對
b) 將相同單詞的鍵值對匯聚成一組
c) 對每一組,遍歷組中的所有“值”,累加求和,即得到每一個單詞的總次數(shù)
d) 將(單詞,總次數(shù))輸出到HDFS的文件中
4、 具體編碼實現(xiàn)
(1)定義一個mapper類
|
//首先要定義四個泛型的類型
//keyin: LongWritable valuein: Text
//keyout: Text valueout:IntWritable
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
//map方法的生命周期: 框架每傳一行數(shù)據(jù)就被調(diào)用一次
//key : 這一行的起始點在文件中的偏移量
//value: 這一行的內(nèi)容
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//拿到一行數(shù)據(jù)轉換為string
String line = value.toString();
//將這一行切分出各個單詞
String[] words = line.split(" ");
//遍歷數(shù)組,輸出<單詞,1>
for(String word:words){
context.write(new Text(word), new IntWritable(1));
}
}
}
|
(2)定義一個reducer類
|
//生命周期:框架每傳遞進來一個kv 組,reduce方法被調(diào)用一次
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
//定義一個計數(shù)器
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 {
//把業(yè)務邏輯相關的信息(哪個是mapper,哪個是reducer,要處理的數(shù)據(jù)在哪里,輸出的結果放哪里。。。。。。)描述成一個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);
//設置我們的業(yè)務邏輯Mapper類的輸出key和value的數(shù)據(jù)類型
wcjob.setMapOutputKeyClass(Text.class);
wcjob.setMapOutputValueClass(IntWritable.class);
//設置我們的業(yè)務邏輯Reducer類的輸出key和value的數(shù)據(jù)類型
wcjob.setOutputKeyClass(Text.class);
wcjob.setOutputValueClass(IntWritable.class);
//指定要處理的數(shù)據(jù)所在的位置
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 程序打包運行
將程序打包
準備輸入數(shù)據(jù)
vi /home/hadoop/test.txt
|
Hello tom
Hello jim
Hello ketty
Hello world
Ketty tom
|
在hdfs上創(chuàng)建輸入數(shù)據(jù)文件夾:
hadoop fs mkdir -p /wordcount/input
將words.txt上傳到hdfs上
hadoop fs –put /home/hadoop/words.txt /wordcount/input
將程序jar包上傳到集群的任意一臺服務器上
使用命令啟動執(zhí)行wordcount程序jar包
$ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out
- 查看執(zhí)行結果
$ hadoop fs –cat /wordcount/out/part-r-00000



















