1 Hadoop介紹 Hadoop是Apache旗下的一個用java語言實現開源軟體框架,是一個開發和運行處理大規模數據的軟體平臺。允許使用簡單的編程模型在大量電腦集群上對大型數據集進行分散式處理。狹義上說,Hadoop指Apache這款開源框架,它的核心組件有: HDFS(分散式文件系統):解決 ...
1 Hadoop介紹
Hadoop是Apache旗下的一個用java語言實現開源軟體框架,是一個開發和運行處理大規模數據的軟體平臺。允許使用簡單的編程模型在大量電腦集群上對大型數據集進行分散式處理。狹義上說,Hadoop指Apache這款開源框架,它的核心組件有:
HDFS(分散式文件系統):解決海量數據存儲.
YARN(作業調度和集群資源管理的框架):解決資源任務調度。
MAPREDUCE(分散式運算編程框架):解決海量數據計算。
廣義上來說,Hadoop通常是指一個更廣泛的概念——Hadoop生態圈(一圖看懂大數據生態圈)
2 Hadoop特性優點
擴容能力(Scalable):Hadoop是在可用的電腦集群間分配數據並完成計算任務的,這些集群可用方便的擴展到數以千計的節點中。
成本低(Economical):Hadoop通過普通廉價的機器組成伺服器集群來分發以及處理數據,以至於成本很低。
高效率(Efficient):通過併發數據,Hadoop可以在節點之間動態並行的移動數據,使得速度非常快。
可靠性(Rellable):能自動維護數據的多份複製,並且在任務失敗後能自動地重新部署(redeploy)計算任務。所以Hadoop的按位存儲和處理數據的能力值得人們信賴。
3 Hadoop歷史版本與架構
1.x版本系列:Hadoop版本當中的第二代開源版本,主要修複0.x版本的一些bug等,該版本已被淘汰
2.x版本系列:架構產生重大變化,引入了yarn平臺等許多新特性,是現在使用的主流版本。
3.x版本系列:對HDFS、MapReduce、YARN都有較大升級,還新增了Ozone key-value存儲。
架構:Hadoop在1.X版本的時候只有HDFS和MapReduce。在Hadoop2.X開始,中間加入了Yarn調度層做資源調度工作。如下圖:一圖讀懂Hadoop架構。
4 Hadoop 3.x的版本架構和模型介紹
由於Hadoop 2.0是基於JDK 1.7開發的,而JDK 1.7在2015年4月已停止更新,這直接迫使Hadoop社區基於JDK 1.8重新發佈一個新的Hadoop版本,即Hadoop 3.0。Hadoop 3.0中引入了一些重要的功能和優化,包括HDFS 可擦除編碼、多Namenode支持、MR Native Task優化、YARN基於cgroup的記憶體和磁碟IO隔離、YARN container resizing等。
Apache Hadoop 項目組最新消息,Hadoop3.x以後將會調整方案架構,將Mapreduce 基於記憶體+io+磁碟,共同處理數據。改變最大的是hdfs,hdfs 通過最近block塊計算,根據最近計算原則,本地block塊,加入到記憶體,先計算,通過IO,共用記憶體計算區域,最後快速形成計算結果。
4.1 Hadoop 3.0新特性
Hadoop 3.0在功能和性能方面,對Hadoop內核進行了多項重大改進。
(1)通用性:
① 精簡Hadoop內核,包括剔除過期的API和實現,將預設組件實現替換成最高效的實現。
② Classpath isolation:以防止不同版本jar包衝突。
③ Shell腳本重構: Hadoop 3.0對Hadoop的管理腳本進行了重構,修複了大量bug,增加了新特性。
(2)HDFS
Hadoop3.x中Hdfs在可靠性和支持能力上作出很大改觀:
① HDFS支持數據的擦除編碼,這使得HDFS在不降低可靠性的前提下,節省一半存儲空間。
② 多NameNode支持,即支持一個集群中,一個active、多個standby namenode部署方式。註:多ResourceManager特性在Hadoop 2.0中已經支持。
(3)HDFS糾刪碼
在Hadoop3.X中,HDFS實現了Erasure Coding這個新功能。Erasure coding糾刪碼技術簡稱EC,是一種數據保護技術.最早用於通信行業中數據傳輸中的數據恢復,是一種編碼容錯技術。通過在原始數據中加入新的校驗數據,使得各個部分的數據產生關聯性。在一定範圍的數據出錯情況下,通過糾刪碼技術都可以進行恢復。Hadoop-3.0之前,HDFS存儲方式為每一份數據存儲3份,這也使得存儲利用率僅為1/3,Hadoop-3.0引入糾刪碼技術(EC技術),實現1份數據+0.5份冗餘校驗數據存儲方式。與副本相比糾刪碼是一種更節省空間的數據持久化存儲方法。標準編碼(比如Reed-Solomon(10,4))會有1.4 倍的空間開銷;而HDFS副本則會有3倍的空間開銷。
(4)支持多個NameNodes
最初的HDFS NameNode high-availability實現僅僅提供了一個active NameNode和一個Standby NameNode;並且通過將編輯日誌複製到三個JournalNodes上,這種架構能夠容忍系統中的任何一個節點的失敗。 然而,一些部署需要更高的容錯度。我們可以通過這個新特性來實現,其允許用戶運行多個Standby NameNode。比如通過配置三個NameNode和五個JournalNodes,這個系統可以容忍2個節點的故障,而不是僅僅一個節點。
(5) MapReduce
Hadoop3.X中的MapReduce較之前的版本作出以下更改:
① Tasknative優化:為MapReduce增加了C/C++的map output collector實現(包括Spill,Sort和IFile等),通過作業級別參數調整就可切換到該實現上。對於shuffle密集型應用,其性能可提高約30%。
② MapReduce記憶體參數自動推斷。在Hadoop 2.0中,為MapReduce作業設置記憶體參數非常繁瑣,一旦設置不合理,則會使得記憶體資源浪費嚴重,在Hadoop3.0中避免了這種情況。
Hadoop3.x中的MapReduce添加了Map輸出collector的本地實現,對於shuffle密集型的作業來說,這將會有30%以上的性能提升。
(6)YARN 資源類型
YARN 資源模型(YARN resource model)已被推廣為支持用戶自定義的可數資源類型(support user-defined countable resource types),不僅僅支持 CPU 和記憶體。比如集群管理員可以定義諸如 GPUs、軟體許可證(software licenses)或本地附加存儲器(locally-attached storage)之類的資源。YARN 任務可以根據這些資源的可用性進行調度。
(7)其他
在Hadoop3.x之前,多個Hadoop服務的預設埠都屬於Linux的臨時埠範圍(32768-61000)。這就意味著用戶的服務在啟動的時候可能因為和其他應用程式產生埠衝突而無法啟動。現在這些可能會產生衝突的埠已經不再屬於臨時埠的範圍,這些埠的改變會影響NameNode, Secondary NameNode, DataNode以及KMS。與此同時,官方文檔也進行了相應的改變,具體可以參見 HDFS-9427以及HADOOP-12811。
- Namenode ports: 50470 --> 9871, 50070--> 9870, 8020 --> 9820
- Secondary NN ports: 50091 --> 9869,50090 --> 9868
- Datanode ports: 50020 --> 9867, 50010--> 9866, 50475 --> 9865, 50075 --> 9864
- Kms server ports: 16000 --> 9600 (原先的16000與HMaster埠衝突)
5 Hadoop集群搭建
(1)集群簡介
Hadoop集群具體來說包含兩個集群:HDFS集群和YARN集群,兩者邏輯上分離,但物理上常在一起。
HDFS集群負責海量數據的存儲,集群中的角色主要有:
- NameNode、DataNode、SecondaryNameNode
YARN集群負責海量數據運算時的資源調度,集群中的角色主要有:
- ResourceManager、NodeManager
mapreduce是一個分散式運算編程框架。是應用程式開發包,由用戶按照編程規範進行程式開發,後打包運行在HDFS集群上,並且受到YARN集群的資源調度管理。
(2) 集群部署方式
- standalone mode(獨立模式):獨立模式又稱為單機模式,僅1個機器運行1個java進程,主要用於調試。
-
Pseudo-Distributed mode(偽分散式模式):偽分佈模式也是在1個機器上運行HDFS的NameNode和DataNode、YARN的 ResourceManger和NodeManager,但分別啟動單獨的java進程,主要用於調試。
-
Cluster mode(群集模式):集群模式主要用於生產環境部署。會使用N台主機組成一個Hadoop集群。這種部署模式下,主節點和從節點會分開部署在不同的機器上。
(3) Hadoop集群架構模型
- 第一種:NameNode與ResourceManager單節點架構模型
文件系統核心模塊:
NameNode:集群當中的主節點,主要用於管理集群當中的各種數據。
secondaryNameNode:主要能用於hadoop當中元數據信息的輔助管理。
DataNode:集群當中的從節點,主要用於存儲集群當中的各種數據。
數據計算核心模塊:
ResourceManager:接收用戶的計算請求任務,並負責集群的資源分配。
NodeManager:負責執行主節點APPmaster分配的任務。
- 第二種:NameNode高可用與ResourceManager單節點架構模型
文件系統核心模塊:
NameNode:集群當中的主節點,主要用於管理集群當中的各種數據,其中NameNode可以有兩個,形成高可用狀態。
DataNode:集群當中的從節點,主要用於存儲集群當中的各種數據。
JournalNode:文件系統元數據信息管理。
數據計算核心模塊:
ResourceManager:接收用戶的計算請求任務,並負責集群的資源分配,以及計算任務的劃分。
NodeManager:負責執行主節點ResourceManager分配的任務。
- 第三種:NameNode單節點與ResourceManager高可用架構模型
文件系統核心模塊:
NameNode:集群當中的主節點,主要用於管理集群當中的各種數據。
secondaryNameNode:主要能用於hadoop當中元數據信息的輔助管理。
DataNode:集群當中的從節點,主要用於存儲集群當中的各種數據。
數據計算核心模塊:
ResourceManager:接收用戶的計算請求任務,並負責集群的資源分配,以及計算任務的劃分,通過zookeeper實現ResourceManager的高可用。
NodeManager:負責執行主節點ResourceManager分配的任務。
-
第四種:NameNode與ResourceManager高可用架構模型
搭建過程查看另外一篇文章( HDFS High Availability(HA)高可用配置 )
文件系統核心模塊:
NameNode:集群當中的主節點,主要用於管理集群當中的各種數據,一般都是使用兩個,實現HA高可用
JournalNode:元數據信息管理進程,一般都是奇數個
DataNode:從節點,用於數據的存儲
數據計算核心模塊:
ResourceManager:Yarn平臺的主節點,主要用於接收各種任務,通過兩個,構建成高可用
NodeManager:Yarn平臺的從節點,主要用於處理ResourceManager分配的任務
以上就是Hadoop的詳細介紹,接下來就讓我們實戰吧,我們準備三台虛擬機。
準備工作:實現虛擬機之間的SSH免密登錄(參考文章)
在三台主機上分別創建目錄:
mkdir -p /export/server/
mkdir -p /export/data/
mkdir -p /export/software/
(6)NameNode與ResourceManager單節點架集群規劃與搭建
(1)解壓Hadoop安裝包
自行複製鏈接下載:http://archive.apache.org/dist/hadoop/core/hadoop-3.1.4/hadoop-3.1.4.tar.gz
上傳下載的Hadoop3.1.4包到 /export/software/ 目錄下。上傳方式多種,這裡就不做展示,然後解壓。解壓命令:
cd /opt/export/software
tar -zxvf hadoop-3.1.4-bin-snappy-CentOS7.tar.gz -C /export/server/
在Hadoop3.1.4文件中創建用於存放數據的data目錄:
mkdir -p /export/server/hadoop-3.1.4/data
(2)編輯配置文件
- 配置NameNode(core-site.xml)
hadoop的核心配置文件,有預設的配置項core-default.xml。在該文件中的<configuration>標簽中添加配置。
core-default.xml與core-site.xml的功能是一樣的,如果在core-site.xml里沒有配置的屬性,則會自動會獲取core-default.xml里的相同屬性的值。
cd /export/server/hadoop-3.1.4/etc/hadoop
vim core-site.xml
#-------------------------------------------------------------
#在第19行<configuration></configuration>之間添加配置,以下內容:
<!-- 預設文件系統的名稱。通過URI中schema區分不同文件系統。-->
<!-- file:///本地文件系統 hdfs:// hadoop分散式文件系統 gfs://。-->
<!-- hdfs文件系統訪問地址:http://nn_host:8020。-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
<!-- hadoop本地數據存儲目錄 format時自動生成 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/server/hadoop-3.1.4/data</value>
</property>
<!-- 在Web UI訪問HDFS使用的用戶名。-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
- 配置HDFS路徑(hdfs-site.xml)
HDFS的核心配置文件,主要配置HDFS相關參數,有預設的配置項hdfs-default.xml。在該文件中的<configuration>標簽中添加配置。
hdfs-default.xml與hdfs-site.xml的功能是一樣的,如果在hdfs-site.xml里沒有配置的屬性,則會自動會獲取hdfs-default.xml里的相同屬性的值。
vim hdfs-site.xml
#-------------------------------------------------------------
#在第20行<configuration></configuration>之間添加配置,以下內容:
<!-- 設定SNN運行主機和埠。-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:9868</value>
</property>
- 配置YARN(yarn-site.xml)
YARN的核心配置文件,在該文件中的<configuration>標簽中添加配置。
vim yarn-site.xml
#-----------------------------------------------------------
#在第18行<configuration></configuration>之間添加配置,以下內容:
<!-- yarn集群主角色RM運行機器。-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
</property>
<!-- NodeManager上運行的附屬服務。需配置成mapreduce_shuffle,才可運行MR程式。-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 每個容器請求的最小記憶體資源(以MB為單位)。-->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<!-- 每個容器請求的最大記憶體資源(以MB為單位)。-->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<!-- 容器虛擬記憶體與物理記憶體之間的比率。-->
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4</value>
</property>
-
配置MapReduce(mapred-site.xml)
MapReduce的核心配置文件,Hadoop預設只有個模板文件mapred-site.xml.template,需要使用該文件複製出來一份mapred-site.xml文件。在該文件中的<configuration>標簽中添加配置。
vim mapred-site.xml
#------------------------------------------------------------
#在第20行<configuration></configuration>之間添加配置,以下內容:
<!-- mr程式預設運行方式。yarn集群模式 local本地模式-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MR App Master環境變數。-->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<!-- MR MapTask環境變數。-->
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<!-- MR ReduceTask環境變數。-->
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property> <property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
-
workers文件配置
配合一鍵啟動腳本如start-dfs.sh、stop-yarn.sh用來進行集群啟動。這時候workers文件裡面的主機標記的就是從節點角色所在的機器。
vim /export/server/hadoop-3.1.4/etc/hadoop/workers
#----------------------------------
# 刪除第一行localhost,然後添加以下三行
node1
node2
node3
- 修改hadoop.env環境變數
文件中設置的是Hadoop運行時需要的環境變數。JAVA_HOME是必須設置的,即使我們當前的系統中設置了JAVA_HOME,它也是不認識的,因為Hadoop即使是在本機上執行,它也是把當前的執行環境當成遠程伺服器。
#hadoop.env文件
vim /export/server/hadoop-3.1.4/etc/hadoop/hadoop-env.sh
#修改第54行為:
#備註:JavaJDK版本配置在/etc/profile的JAVA_HOME=/export/server/jdk1.8.0_60 這裡配置自己伺服器java的JDK的版本
export JAVA_HOME=/export/server/jdk1.8.0_60
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
- 配置環境變數
vim /etc/profile
#打開配置文件後新增如下配置。
export HADOOP_HOME=/export/server/hadoop-3.1.4
export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
#保存配置文件後需要刷新配置文件
source /etc/profile
-
分發配置好的Hadoop安裝文件和環境變數
#進入Hadoop安裝目錄
cd /export/server/
#分發給Node2和Node3,
scp -r hadoop-3.1.4 node2:$PWD
scp -r hadoop-3.1.4 node3:$PWD
scp /etc/profile node2:/etc
scp /etc/profile node3:/etc
#在Node2和Node3主機上執行刷新配置文件
source /etc/profile
(3) 格式化HDFS
首次啟動HDFS時,必須對其進行格式化操作。本質上是一些清理和準備工作,因為此時的HDFS在物理上還是不存在的。只需要在node1上進行格式化,只能格式化一次
cd /export/server/hadoop-3.1.4
bin/hdfs namenode -format
7 集群啟動和關閉
使用以下方式啟動Hadoop,建議方式三一鍵啟動。必須啟動Hadoop才能訪問網頁。
(1)集群啟動和關閉-方式一
註意:如果在啟動之後,有些服務沒有啟動成功,則需要查看啟動日誌,Hadoop的啟動日誌在每台主機的/export/server/hadoop-x.x.x/logs/目錄,需要根據哪台主機的哪個服務啟動情況去對應的主機上查看相應的日誌,以下是node1主機的日誌目錄。
-
①-啟動HDFS集群
#-- 選擇node1節點啟動NameNode節點
hdfs --daemon start namenode
#-- 在所有節點上啟動DataNode
hdfs --daemon start datanode
#-- 在node2啟動Secondary NameNode
hdfs --daemon start secondarynamenode
-
①- 啟動YARN集群
#-- 選擇node1節點啟動ResourceManager節點
yarn --daemon start resourcemanager
#-- 在所有節點上啟動NodeManager
yarn --daemon start nodemanager
-
①-關閉HDFS集群
#-- 關閉NameNode
hdfs --daemon stop namenode
#-- 每個節點關閉DataNode
hdfs --daemon stop datanode
#-- 關閉Secondary NameNode
hdfs --daemon stop secondarynamenode
-
①-關閉YARN集群
#-- 每個節點關閉ResourceManager
yarn --daemon stop resourcemanager
#-- 每個節點關閉NodeManager
yarn --daemon stop nodemanager
(2)集群啟動和關閉-方式2
-
②-HDFS集群一鍵腳本
#啟動dfs
start-dfs.sh
#關閉dfs
stop-dfs.sh
-
②-YARN集群一鍵腳本
#啟動Yarn
start-yarn.sh
#關閉Yarn
stop-yarn.sh
(3)集群啟動和關閉-方式3
#-- 一鍵啟動HDFS、YARN
start-all.sh
#-- 一鍵關閉HDFS、YARN
stop-all.sh
(4)配置windows功能變數名稱映射
- 以管理員身份打開C:\Windows\System32\drivers\etc目錄下的hosts文件
- 在文件最後添加以下映射功能變數名稱和ip映射關係
192.168.88.161 node1
192.168.88.162 node2
192.168.88.163 node3
測試映射是否生效,在CMD界面中輸入
ping node1
ping node2
(5)訪問WebUI
NameNode: http://node1:9870
YARN: http://node1:8088
8 Hadoop初體驗
(1) 使用HDFS
從Linux本地上傳一個文本文件到hdfs的/目錄
#在/export/data/目錄中創建a.txt文件,並寫入數據
cd /export/data/
touch a.txt
echo "hello" > a.txt
#將a.txt上傳到HDFS的根目錄
hadoop fs -put a.txt /
通過頁面查看, 通過NameNode頁面.進入HDFS:http://node1:9870/
查看文件是否創建成功.
(2)運行mapreduce程式
在Hadoop安裝包的share/hadoop/mapreduce下有官方自帶的mapreduce程式。我們可以使用如下的命令進行運行測試。(示常式序jar:hadoop-mapreduce-examples-3.1.4.jar計算圓周率)
關於圓周率的估算,感興趣的可以查詢資料蒙特卡洛方法來計算Pi值,計算命令中2表示計算的線程數,1000表示投點數,該值越大,則計算的pi值越準確。
yarn jar /export/server/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.5.jar pi 2 1000
(3) 測試寫入速度
#1.啟動YARN集群
start-yarn.sh
#2.啟動寫入基準測試
hadoop jar /export/server/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.4-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 10MB
我們可以看到Hadoop啟動了一個MapReduce作業來運行benchmark測試。等待約2-5分鐘,MapReduce程式運行成功後,就可以查看測試結果了。
測試hdfs的讀取文件性能,在HDFS文件系統中讀入10個文件,每個文件10M
#測試讀取
hadoop jar /export/server/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.4-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 10MB
測試期間,會在HDFS集群上創建 /benchmarks目錄,測試完畢後,我們可以清理該目錄。
#清理測試數據
hdfs dfs -ls -R /benchmarks
hadoop jar /export/server/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.4-tests.jar TestDFSIO -clean
至此,整篇的Hadoop介紹以及單節點部署介紹完畢,後期會寫Hive,敬請期待吧,歡迎留言探討。