當(dāng)今時(shí)代婚被,互聯(lián)網(wǎng)世界中每天都有數(shù)以億計(jì)的數(shù)據(jù)產(chǎn)出,比如某東某寶的商城訂單梳虽,日志流量等數(shù)據(jù)址芯,越來(lái)越多的小伙伴都投身大數(shù)據(jù)領(lǐng)域,基于海量數(shù)據(jù)進(jìn)行數(shù)據(jù)處理窜觉,從數(shù)據(jù)中挖掘出各種有價(jià)值的信息谷炸,而Hadoop作為大數(shù)據(jù)的基石,核心組件包括HDFS禀挫、MapReduce旬陡、YARN,為海量數(shù)據(jù)的存儲(chǔ)和計(jì)算提供了可行方案语婴。大數(shù)據(jù)涉及到數(shù)據(jù)采集描孟、數(shù)據(jù)處理/分析/挖掘、數(shù)據(jù)存儲(chǔ)腻格、數(shù)據(jù)可視化等画拾,開(kāi)源世界是偉大的,各種大數(shù)據(jù)框架應(yīng)運(yùn)而生菜职,比如Pig青抛、Hive、Hbase酬核、Flume蜜另、Oozie、Mahout等等等等嫡意,這些框架大都基于Hadoop举瑰,為大數(shù)據(jù)的處理提供多種多樣的技術(shù)選型,共同組成了一個(gè)大的技術(shù)棧也就Hadoop生態(tài)系統(tǒng)蔬螟,本文對(duì)大數(shù)據(jù)核心組件HDFS此迅、YARN和MapReduce做一個(gè)簡(jiǎn)單的概述。
背景
最初旧巾,大數(shù)據(jù)的存儲(chǔ)和分析中有很多系統(tǒng)瓶頸耸序,為了解決這些瓶頸,Google出了幾篇論文鲁猩,但并未做開(kāi)源實(shí)現(xiàn)坎怪,這些論文包括MapReduce、GigTable廓握、GFS搅窿,這就為Hadoop的產(chǎn)生提供了理論依據(jù)嘁酿。
這里先引出一個(gè)問(wèn)題,為什么很多公司選擇Hadoop作為大數(shù)據(jù)平臺(tái)的解決方案男应?原因有以下幾點(diǎn):
- 源碼開(kāi)源
- 社區(qū)活躍闹司、參與者很多
- 涉及到分布式存儲(chǔ)和計(jì)算的方方面面:
Flume進(jìn)行數(shù)據(jù)采集
Spark/MR/Hive等進(jìn)行數(shù)據(jù)處理
HDFS/HBase進(jìn)行數(shù)據(jù)存儲(chǔ) - 已得到企業(yè)界的驗(yàn)證
Hadoop常用發(fā)行版及選型包括原生版和商業(yè)公司發(fā)行版:
- Apache Hadoop:原生Hadoop http://hadoop.apache.org
- CDH:Cloudera Distributed Hadoop 商業(yè)公司發(fā)行 http://archive.cloudera.com
- HDP:Hortonworks Data PlatForm 商業(yè)公司發(fā)行
商業(yè)公司發(fā)行版可以避免很多組件之間版本兼容問(wèn)題,其中規(guī)模最大殉了、知名度最高的應(yīng)該是Cloudera公司开仰,下載地址:http://archive.cloudera.com/cdh5/cdh/5/,使用CDH時(shí)要注意薪铜,生產(chǎn)或者測(cè)試環(huán)境選擇對(duì)應(yīng)CDH版本時(shí)众弓,一定要采用尾號(hào)是一樣的版本
Hadoop三大核心組件包括:
- HDFS :Hadoop distributed file system 分布式文件系統(tǒng)
- YARN:Yet another resouce negotiator 負(fù)責(zé)整個(gè)集群資源的管理和調(diào)度
- MapReduce :分布式計(jì)算
分布式文件系統(tǒng)HDFS
分布式文件系統(tǒng)HDFS的設(shè)計(jì)目標(biāo):
- 非常巨大的分布式文件系統(tǒng)
- 運(yùn)行在普通廉價(jià)的硬件上
- 易擴(kuò)展、為用戶提供性能不錯(cuò)的文件存儲(chǔ)服務(wù)
HDFS架構(gòu)
HDFS采用1個(gè)Master(即NameNode)帶多個(gè)Slaves(DataNode)的架構(gòu)隔箍,即NameNode + N個(gè)DataNode谓娃,建議NameNode和DataNode部署在不同節(jié)點(diǎn)上,類(lèi)似這種架構(gòu)的還有YARN/HBase等蜒滩,這塊官方是這樣說(shuō)的:
A typical deployment has a dedicated machine that runs only the NameNode software.
Each of the other machines in the cluster runs one instance of the DataNode software.
The architecture does not preclude running multiple DataNodes on the same machine
but in a real deployment that is rarely the case.
HDFS中塊和副本因子的概念
- 在HDFS中滨达,每個(gè)文件會(huì)被拆分成多個(gè)Block,存儲(chǔ)在多個(gè)節(jié)點(diǎn)上俯艰,每個(gè)Block的大屑癖椤(blocksize)默認(rèn)為128M,當(dāng)然這個(gè)大小可以手動(dòng)修改竹握,這樣的話比如有一個(gè)文件大小為130M画株,那么會(huì)被拆分為2個(gè)Block,分別為128M和2M(All blocks in a file except the last block are the same size)啦辐,然后存儲(chǔ)到不同的節(jié)點(diǎn)上谓传,這樣對(duì)文件的讀取并發(fā)進(jìn)行,可以提高IO吞吐率芹关,加快速度续挟。
-
這其中還有個(gè)概念叫做副本系數(shù)或者叫做副本因子(replication factor),表示每個(gè)Block會(huì)被存幾份侥衬,每一份都存儲(chǔ)到不同的節(jié)點(diǎn)上诗祸,萬(wàn)一某個(gè)節(jié)點(diǎn)掛掉了數(shù)據(jù)不可用,還可以有其他副本可用轴总,不至于造成數(shù)據(jù)丟失
Block Replication
NameNode和DataNode的職責(zé):
NameNode:
- 負(fù)責(zé)客戶端請(qǐng)求的響應(yīng)
- 負(fù)責(zé)元數(shù)據(jù)(文件的名稱贬媒、副本系數(shù)、Block存放的DN)的管理
DataNode:
- 存儲(chǔ)用戶的文件對(duì)應(yīng)的數(shù)據(jù)塊(Block)
- 要定期向NN發(fā)送心跳信息肘习,匯報(bào)本身及其所有的block信息,健康狀況
HDFS環(huán)境搭建
下載Hadoop
http://archive.cloudera.com/cdh5/cdh/5/2.6.0-cdh5.7.0
wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.7.0.tar.gz安裝jdk
下載
解壓到app目錄:tar -zxvf jdk-7u51-linux-x64.tar.gz -C ~/app/
驗(yàn)證安裝是否成功:~/app/jdk1.7.0_51/bin ./java -version
建議把bin目錄配置到系統(tǒng)環(huán)境變量(~/.bash_profile)中
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_51
export PATH=$JAVA_HOME/bin:$PATH機(jī)器參數(shù)設(shè)置
hostname: hadoop001
修改機(jī)器名: /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hadoop001
設(shè)置ip和hostname的映射關(guān)系: /etc/hosts
192.168.199.200 hadoop001
127.0.0.1 localhost
ssh免密碼登陸(本步驟可以省略坡倔,但是后面你重啟hadoop進(jìn)程時(shí)是需要手工輸入密碼才行)
ssh-keygen -t rsa
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys-
Hadoop配置文件修改: ~/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop
hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_51-
core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://hadoop001:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/app/tmp</value> </property>
-
hdfs-site.xml
<property> <name>dfs.replication</name> <value>1</value> </property>
格式化HDFS
注意:這一步操作漂佩,只是在第一次時(shí)執(zhí)行脖含,每次如果都格式化的話,那么HDFS上的數(shù)據(jù)就會(huì)被清空
bin/hdfs namenode -format啟動(dòng)HDFS
sbin/start-dfs.sh
驗(yàn)證是否啟動(dòng)成功:
jps:
DataNode
SecondaryNameNode
NameNode
瀏覽器:
http://hadoop001:50070/停止HDFS
sbin/stop-dfs.sh
資源管理和調(diào)度YARN
概述
使用yarn可以是XXX框架與其他計(jì)算框架共享集群資源投蝉,按資源需要分配养葵,進(jìn)而提高集群資源的利用率,不同計(jì)算框架可以共享同一個(gè)HDFS集群上的數(shù)據(jù)瘩缆,享受整體的資源調(diào)度关拒,XXX可以是Spark/MapReduce/Storm/Flink
YARN架構(gòu)
YARN和HDFS一樣,采用1個(gè)Master(即ResourceManager)帶多個(gè)Slaves(NodeManager)的架構(gòu)庸娱,即1 個(gè)ResourceManager + N個(gè)NodeManager
ResourceManager的職責(zé): 一個(gè)集群active狀態(tài)的RM只有一個(gè)着绊,負(fù)責(zé)整個(gè)集群的資源管理和調(diào)度
- 處理客戶端的請(qǐng)求(啟動(dòng)/殺死)
- 啟動(dòng)/監(jiān)控ApplicationMaster(一個(gè)作業(yè)對(duì)應(yīng)一個(gè)AM)
- 監(jiān)控NM
- 系統(tǒng)的資源分配和調(diào)度
NodeManager:整個(gè)集群中有N個(gè),負(fù)責(zé)單個(gè)節(jié)點(diǎn)的資源管理和使用以及task的運(yùn)行情況
- 定期向RM匯報(bào)本節(jié)點(diǎn)的資源使用請(qǐng)求和各個(gè)Container的運(yùn)行狀態(tài)
- 接收并處理RM的container啟停的各種命令
- 單個(gè)節(jié)點(diǎn)的資源管理和任務(wù)管理
ApplicationMaster:每個(gè)應(yīng)用/作業(yè)對(duì)應(yīng)一個(gè)熟尉,負(fù)責(zé)應(yīng)用程序的管理
- 數(shù)據(jù)切分
- 為應(yīng)用程序向RM申請(qǐng)資源(container)归露,并分配給內(nèi)部任務(wù)
- 與NM通信以啟停task, task是運(yùn)行在container中的
- task的監(jiān)控和容錯(cuò)
Container:
- 對(duì)任務(wù)運(yùn)行情況的描述:cpu斤儿、memory剧包、環(huán)境變量
Client
- 提交作業(yè)
- 查詢作業(yè)的運(yùn)行進(jìn)度
- 殺死作業(yè)
YARN執(zhí)行流程
- 用戶向YARN提交作業(yè)
- RM為該作業(yè)分配第一個(gè)container(AM)
- RM會(huì)與對(duì)應(yīng)的NM通信,要求NM在這個(gè)container上啟動(dòng)應(yīng)用程序的AM
- AM首先向RM注冊(cè)往果,然后AM將為各個(gè)任務(wù)申請(qǐng)資源疆液,并監(jiān)控運(yùn)行情況
- AM采用輪訓(xùn)的方式通過(guò)RPC協(xié)議向RM申請(qǐng)和領(lǐng)取資源
- AM申請(qǐng)到資源以后,便和相應(yīng)的NM通信陕贮,要求NM啟動(dòng)任務(wù)
- NM啟動(dòng)我們作業(yè)對(duì)應(yīng)的task
YARN環(huán)境搭建
-
mapred-site.xml
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
yarn-site.xml
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
啟動(dòng)yarn:sbin/start-yarn.sh
-
驗(yàn)證是否啟動(dòng)成功
jps:
ResourceManager
NodeManager 停止yarn: sbin/stop-yarn.sh
在yarn上提交pi案例:
hadoop jar /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 2 3
大數(shù)據(jù)計(jì)算框架MapReduce
MapReduce處理數(shù)據(jù)流程包括Input Spliting Mapping Shuffling Reducing Final result等堕油,代碼編寫(xiě)時(shí)需要實(shí)現(xiàn)Mapper和Reducer,比較繁瑣飘蚯,取而代之的是spark等易于編寫(xiě)代碼馍迄、處理速度更快的框架。
MapReduce的局限性主要包括以下幾點(diǎn):
- 代碼繁瑣局骤;
- 只能夠支持map和reduce方法攀圈;
- 執(zhí)行效率低下;
- 不適合迭代多次峦甩、交互式赘来、流式的處理;
框架多樣化
目前凯傲,各種大數(shù)據(jù)計(jì)算處理框架應(yīng)運(yùn)而生犬辰,主要包括:
- 批處理(離線):MapReduce、Hive冰单、Pig
- 流式處理(實(shí)時(shí)): Storm幌缝、JStorm
- 交互式計(jì)算:Impala