大資料 hadoop
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的設計目標是構建一個大型的全網搜尋引擎,包括網頁抓取、索引、查詢等功能,但隨著抓取網頁數量的增加,遇到了嚴重的可擴充套件性問題——如何解決數十億網頁的儲存和索引問題。
——分散式檔案系統(GFS),可用於處理海量網頁的儲存
——分散式計算框架MAPREDUCE,可用於處理海量網頁的索引計算問題。
-------分散式資料的儲存BIGTable
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.網際網路時代資料的種類,增長都呈現爆發式增長,各行業對資料的價值日益重視
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生態圈以及各組成部分的簡介
各元件簡介
重點元件:
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
程式執行邏輯流程:
- 離線資料分析流程介紹
注:本環節主要感受資料分析系統的巨集觀概念及處理流程,初步理解hadoop等框架在其中的應用環節,不用過於關注程式碼細節
一個應用廣泛的資料分析系統:“web日誌資料探勘”
3.1 需求分析
3.1.1 案例名稱
“網站或APP點選流日誌資料探勘系統”。
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.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
部署圖如下:
master hadoop 主機。
scecondary NameNode 為master 提供服務,讀取:DateNode 中檔案的資訊。提交給master
4.1.2伺服器準備
本案例使用虛擬機器伺服器來搭建HADOOP叢集,所用軟體及版本:
Vmware 11.0
Centos 6.5 64bit
4.1.3網路環境準備
1.安裝centos系統,並修改IP地址:192.168.137.22
配置完成後,重啟服務:service network restart。
檢視IP地址:ifconfig
2.關閉防火牆:
service iptables stop :關閉防火牆服務
chkconfig iptables off :關閉防火牆配置檔案。
3.開啟sshd 服務
service sshd start
4.修改主機名
臨時修改:hostname hdp-node-01
永久修改:vi /etc/sysconfig/network
5.修改主機對映:
vi /etc/hosts
6.新增使用者,分配sudoer許可權
useradd huaqiang
passwd 123456
新增sudoers 檔案可讀許可權。
chmod 640 sudoers
編輯sudoers檔案。首行新增:
huaqiang ALL=(root)NOPASSWD:ALL
配置完成後:使用root許可權。可使用sudo 即可。
7.安裝JDK
將JDK 上傳到/home/huaqiang/app目錄
新增可執行許可權。
#chmod 764 jdk…
解壓縮JDK
#tar -zxf jdk-7u67-linux-x64.tar.gz -C ./
配置環境變數:
#sudo vi /etc/profile
檔案末尾新增程式碼:
#SET JAVA_HOME
export JAVA_HOME=/home/huaqiang/app/jdk1.7.0_67
export PATH=
P
A
T
H
:
PATH:
PATH:JAVA_HOME/bin:
重新整理資原始檔
#source /etc/profile
測試是否安裝成功
java javac java -version
克隆其他兩臺主機。
克隆之後首先修改克隆機的mac地址。
00:50:56:2F:AF:62
修改網絡卡配置。
開啟02,03 主機,並按照以上步驟,修改IP.主機名,以及對映。
設定SSH免密碼登入
計算機A每次SSH遠端連線計算機B時,都需要輸入密碼。當有些軟體需要頻繁使用SSH連線其他計算機時,這個時候需要人工填寫計算機B的密碼,這個會造成大量無用操作,不利於程式的使用。
在為了避免這類問題的發生,而且也要兼顧安全問題(設定SSH免密碼登陸後,SSH這臺計算就不需要密碼即可登陸,存在安全隱患),使用公鑰和私鑰方式解決SSH免密碼登陸問題,而且只在一邊做,另一邊不做,這樣也達到了安全的問題。一般是那臺機器需要SSH遠端其他機器,就在這臺機器上設定SSH免登陸操作。
"公私鑰"認證方式簡單的解釋:首先在客戶端上建立一對公私鑰 (公鑰檔案:~/.ssh/id_rsa.pub; 私鑰檔案:/.ssh/id_rsa)。然後把公鑰放到伺服器上(/.ssh/authorized_keys), 自己保留好私鑰.在使用ssh登入時,ssh程式會發送私鑰去和伺服器上的公鑰做匹配.如果匹配成功就可以登入了。
ssh 無密碼登入要使用公鑰與私鑰。linux下可以用ssh-keygen生成公鑰/私鑰對.
//在master機下生成公鑰/私鑰對。
ssh-keygen -t rsa
//拷貝pubkey公鑰,並修改其名稱為:authorized_keys
cp id_rsa.pub ./authorized_keys
//將master機子上的key給其他機子上傳送一份
scp ~/.ssh/authorized_keys slave1:/home/huaqiang/.ssh/
scp ~/.ssh/authorized_keys slave2:/home/huaqiang/.ssh/
使用ssh進行登入驗證
ssh slave1
ssh slave2
4.1.6 HADOOP安裝部署
上傳HADOOP安裝包
規劃安裝目錄 /home/hadoop/apps/hadoop-2.6.1
解壓安裝包
修改配置檔案 $HADOOP_HOME/etc/hadoop/
修改hdfs-site.xml
dfs.replication
2
dfs.block.size
134217728
dfs.namenode.name.dir
/home/hadoopdata/dfs/name
修改mapred-site.xml檔案
mapreduce.framework.name
yarn
true
mapreduce.jobhistory.address
master:10020
mapreduce.jobhistory.webapp.address
master:19888
修改yarn-site.xml
yarn.resourcemanager.hostname
master
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.address
master:8032
yarn.resourcemanager.scheduler.address
master:8030
yarn.resourcemanager.resource-tracker.address
master:8031
yarn.resourcemanager.admin.address
master:8033
yarn.resourcemanager.webapp.address
master:8088
修改slaves檔案
注意:每個機器名佔一行。
master
slave1
slave2
拷貝Hadoop 到 datanode02 datanode03 主機上。
scp -r ./hadoop-2.7.1 hadoop-datanode-02:/home/huaqiang/app/
scp -r ./hadoop-2.7.1 hadoop-datanode-03:/home/huaqiang/app/
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目錄下
[[email protected] ~]$ HADOOP fs -mkdir -p /wordcount/input
[[email protected] ~]$ 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
開啟服務:
Wei:UI 檢視啟動:
http://master.com:50070/ hdfs 啟動
http://master.com:8088/cluster yarn 啟動
啟動history服務才能看到webUI節點
$mr-jobhistory-daemon.sh start historyserver
http://master.com:19888/jobhistory mr 啟動
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的檔案中
4、具體編碼實現
(1)定義一個mapper類
//首先要定義四個泛型的型別
//keyin: LongWritable valuein: Text
//keyout: Text valueout:IntWritable
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
//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
hadoop基本配置。
1三臺主機。
192.168.137.44 master MAC地址不同
192.168.137.45 server01 MAC地址不同
192.168.137.46 server02 MAC地址不同
00:50:56:3D:A1:FA
00:50:56:30:C9:FD
1.1主機配置:
1.1.1IP地址
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
重啟網絡卡:
#service network restart
檢視網絡卡
#ifconfig
1.1.2主機名稱
#vi /etc/sysconfig/network
修改主機名為:master
1.1.3hosts 對映
#vi /etc/hosts
主機名對映驗證:
#ping master
1.1.4建立使用者
#useradd 使用者名稱
#passwd 使用者名稱
輸入兩次密碼
1.1.5給使用者免密碼root許可權
#修改/etc/sudoers檔案許可權
#chmod 640 sudoers
修改檔案/etc/sudoers
vi /etc/sudoers
在首行新增
huaqiang ALL=(root)NOPASSWD:ALL
1.1.6關閉防火牆:
關閉防火牆服務
#service iptables stop
關閉防火牆配置檔案
#chkconfig iptables off
開啟SSHD 服務
#service sshd start
開啟sshd 配置。
#chkconfig sshd on
1.1.7使用xshell 進行遠端終端登入。
使用xshell 進行登入:
必須使用普通使用者。
1.1.8安裝JDK
將jdk安裝包拷貝到/home/huaqiang/app目錄下。
修改jdk…壓縮包的可執行許可權
#chmod 764 jdk…
解壓安裝包到當前目錄
#tar -zxvf jdk-7u67-linux-x64.tar.gz -C ./
配置環境變數
#sudo vi /etc/profile
在末尾新增
export JAVA_HOME=/home/huaqiang/app/jdk1.7.0_67
export PATH=
P
A
T
H
:
PATH:
PATH:JAVA_HOME/bin:
重新整理配置檔案
#source /etc/profile
1.2克隆其他主機
1.2.1克隆主要MAC地址修改
1.2.2刪除預設網絡卡
1.2.3修改IP地址,主機名,
根據上面的配置進行修改即可。
1.2.4設定SSH免密碼登入
#ssh-keygen -t rsa 用以生成公鑰私鑰的祕鑰對–》 4次回車。
可在當前使用者下的.ssh 中檢視兩個祕鑰:
複製公鑰的名字。
切記:給自己也發一份公鑰。
#ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
傳送祕鑰到其他兩臺主機的普通使用者的.ssh 目錄下。
你也可以將.ssh 目錄發過去。
1.3安裝hadoop
修改hadoop 許可權
#chmod 764 haoop…
解壓hadoop
#tar -zxvf ./hadoop… -C ./
配置環境變數
#SET JAVA_HONE
export JAVA_HOME=/home/huaqiang/app/jdk1.7.0_67
export HADOOP_HOME=/home/huaqiang/app/hadoop-2.7.1
export PATH=
P
A
T
H
:
PATH:
PATH:JAVA_HOME/bin:
H
A
D
O
O
P
H
O
M
E
/
b
i
n
:
HADOOP_HOME/bin:
HADOOPHOME/bin:HADOOP_HOME/sbin:
1.3.1修改hadoop配置檔案
1.3.2 修改hadoop-env.sh
修改jdk路徑:export JAVA_HOME=/opt/modules/jdk1.7.0_67
1.3.3修改 core-site.xml
1.3.4修改hdfs-site.xml
dfs.replication
2
dfs.block.size
134217728
dfs.namenode.name.dir
/home/hadoopdata/dfs/name
1.3.5修改mapred-site.xml檔案
mapreduce.framework.name
yarn
true
mapreduce.jobhistory.address
master:10020
mapreduce.jobhistory.webapp.address
master:19888
1.3.6修改yarn-site.xml
yarn.resourcemanager.hostname
master
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.address
master:8032
yarn.resourcemanager.scheduler.address
master:8030
yarn.resourcemanager.resource-tracker.address
master:8031
yarn.resourcemanager.admin.address
master:8033
yarn.resourcemanager.webapp.address
master:8088
1.3.7修改slaves檔案
注意:每個機器名佔一行。
master
slave1
slave2
建立namenode 元資料儲存目錄
mkdir /home/huaqiang/hadoopdata 目錄。
1.3.8格式化hadoop
hadoop namenode -format
1.3.9啟動hadoop
start-all.sh
#hdfs dfs -put a.txt /
web訪問埠:
http://192.168.137.100:50070