您好,登錄后才能下訂單哦!
隨著企業數據化和Hadoop的應用越加廣泛,hadoop1.x的框架設計越來越無法滿足人們對需求,Apache一直在對Hadoop1.x進行修改,最后推出了新一代的Hadoop2.x。從業界使用分布式系統的變化趨勢和 hadoop 框架的長遠發展來看,MapReduce 的 JobTracker/TaskTracker 機制需要大規模的調整來修復它在可擴展性,內存消耗,線程模型,可靠性和性能上的缺陷。為從根本上解決舊 MapReduce 框架的性能瓶頸,促進 Hadoop 框架的更長遠發展,從 0.23.0 版本開始,Hadoop 的 MapReduce 框架完全重構,發生了根本的變化。新的 Hadoop MapReduce 框架命名為 MapReduceV2 或者叫 Yarn。
一 hadoop1.0版本與2.0版本的差異
1.1 HDFS之間的差異
在Hadoop1.x中,HDFS的采用Masters/Slaves的方式設計集群,通過NameNode和DataNode的方式管理集群。在整個Hadoop1.x HDFS中分為Namespace和BlockStorageServer兩個部分。其中Namespace完全分布在NameNode節點中,Namespace其中包括了所有文件的元數據、p_w_picpaths鏡像和edits文件等。而BlockStorageServer分布則是分布在NameNode節點和Datanode節點上的,在NamNodee節點中存放了所有的Block與DataNode節點之間的對應關系。而在Block的內容數據則是在DataNode節點中分布式存放著。如圖1,Hadoop1.x版本HDFS示意圖所示。
圖1 Hadoop1.x版本HDFS示意圖
弊端:
1)因為NameNode節點是整個集群的中心,一旦NameNode發生宕機,將會導致整個集群的癱瘓,直到NameNode被重啟以后問題才被解決。
2)NameNode節點的個數只有一個,單機的性能是有限的,并且NameNode中存放著有關DataNode節點的信息,因此在理論上無法實現橫向無限性增加DataNode節點,這也就是為什么有NameNode最多支持4000個節點的由來。
Hadoop2.x實現聯邦HDFS,即多個NameNode節點并存,并且每一個NameNode節點管理一個Namespace,如圖2,Hadoop2.x的HDFS示意圖所示。
圖2 Hadoop2.x的HDFS示意圖
Block Pool:block池,一個NameNode管理的所有的block節點,一個NameNode節點和去的Pool為一個管理單元,來管理自己的Block。
在聯邦HDFS中,每個Namespace都有自己的Block管理,但這些Block全部存放在整個DataNode集群中,如上圖所示,Namespace之間是相互隔離的,即使一個NameNode節點宕機,也不會影響到其他NameSpace,同時也不會影響到其管理的Datanodes中的Block。
優勢:
(1)可以做到自由的橫向無限制擴充DataNode節點。
(2)可以實現多個NameNode并發執行任務,提高HDFS系統的吞吐量
(3)安全性得到很大的提示,單個NameNode節點的崩潰不會導致整個系統的癱瘓。
Hadoop1.x運行MapReduce任務的流程為:
(1)Job Client提交任務給JobTracker(NameNode節點中),JobTracker向各個節點發出詢問請求,查看每個DataNode節點中執行的Task(任務)的個數
(2)JobTrack收集DataNodes的信息,并對Job進行資源分配。
(3)將MapReduce任務所需的資源、信息等全部復制到Datanodes節點中。
(4)DataNode節點接受任務后,將本地的Block讀取,并形成相應的Map和Reduce任務,這些任務的管理全部由DataNodes節點中的TaskTracker進行監督。如圖3,MapReduce示意圖所示。
圖3 MapReduce示意圖
從圖中可知,JobTacker是整個Hadoop1.x MapReduce框架的中心,其承擔的任務有:接受任務、計算資源、分配資源、與DataNode進行交流等功能。Hadoop1.x 框架在發布時收到很大的歡迎,但是隨著需求越來越大,Hadoop1.x 的MapReduce(MapReduce v1)已經不能夠勝任現在的需求,主要表現在以下幾個問題:
(1)JobTracker是整個MapReduce v1的核心,存在單點故障。
(2)JobTracker管理整個MapReduce作業的任務,造成資源消耗,當map/reduce task過多的時候,JobTracker將會耗費大量內存,同時也增加Job Tracker fail的風險。
(3)JobTracker對DataNode進行資源詢問,使用的Task的個數,為考慮內存和CPU的使用率等,如果將兩個大內存的Map/reduce Task放在一個節點上執行,可能會出現內存溢出。
(4)代碼層中的類有些超過3000行,導致整個類的任務不夠明確,并且進行修改是任務量也巨大,因此增加了維護、開發人員進行修改的難度。
1.2.2 Hadoop2.x
為了應對越來越大的需求,已經MapReduce v1的弊端,Apache對MapReduce v2進行了重新設計,出現了MapReduce v2,也就是YARN框架。下面介紹一下YARN框架。如圖4,YARN示意圖所示。
圖4 YARN示意圖
名詞解釋:
ResourceManager:以下簡稱RM。YARN的中控模塊,負責統一規劃資源的使用。
NodeManager:以下簡稱NM。YARN的資源結點模塊,負責啟動管理container。
ApplicationMaster:以下簡稱AM。YARN中每個應用都會啟動一個AM,負責向RM申請資源,請求NM啟動container,并告訴container做什么事情。
Container:資源容器。YARN中所有的應用都是在container之上運行的。AM也是在container上運行的,不過AM的container是RM申請的。
(1)ResourceManager:在MapReduce v1中,JobTracker的任務有兩個:資源管理和任務調度。而在YARN框架中,將JobTracker的兩個核心任務進行分離,其中的資源管理形成新的ResourceManager。ResourceManager負責管理每個NodeManager節點所提供的資源狀態(內存、CPU、磁盤和帶寬等傳統信息)。在MapReduce任務的時候,RM會精確計算每個整個集群的資源情況,已分配給該任務合適的資源。
(2)Container:對一個節點的內存、CPU等資源的描述的整體描述。
(3)ApplicationMaster:每一個MapReduce任務都對應著一個AM,AM負責向ResourceManager索要執行任務所需要的資源容器,根據進程的狀態、管理進行和處理進程失敗的原因。
(4)NodeManager:是一個機器框架的代理,是任務執行的容器,其管理著節點的諸多信息:例如內存、CPU、硬盤、網絡等資源。
YARN相對于MapReduce v1的優勢:
(1)JobTracker所承擔的龐大負擔被分割,分成了resourceManager和nodemanager。資源管理和任務調度分配在不同的節點,并且實現程序的分布化、最優化。
(2)ResourceManager資源分配不再憑借slot的個數,而是根據節點的內存是分配任務,使得負載均衡更在完善。
(3)ResourceManager節點上有一個ApplicationMasters進程,負責管理每個ApplicationMatser進程的狀態,從而實現監督任務。
1.3 其它差異
MapReduce變成了和HBase和Hive等一樣的YARN上面的一個應用;Hadoop1.x的默認塊大小為64M,Hadoop2.x的默認塊大小為128M;在2.x中除了datanode要向namenode報告status,nodemanager也要向ResourceManager報告status。
二、 Hadoop1.x升級Hadoop2.x實現
版本情況:老版本Hadoop1.0.3;新版本Hadoop2.6.4。
HOST信息:
升級所需下載安裝包:
hadoop-2.6.4.tar.gz http://apache.opencas.org/hadoop/common/hadoop-2.6.4/hadoop-2.6.4.tar.gz
jdk-8u77-linux-x64.tar.gz:官網下載
包的放置路徑:/usr/local/src/
創建新的HDFS系統目錄和測試文件:
[root@namenode ~]# hadoop fs -mkdir /test
[root@namenode ~]# hadoop fs -put /home/hadoop/hadoop/conf/* /test/
解壓jdk安裝包(每個節點都要操作):
[root@namenode ~]# cd /usr/local/src
[root@namenode ~]#tar zxvf jdk-8u77-linux-x64.tar.gz
備份舊的jdk(每個節點都要操作):
[root@namenode ~]#mv /usr/local/jdk1.6 /usr/local/jdk1.6.bak
替換新的jdk版本(每個節點都要操作):
[root@namenode ~]#mv jdk1.8.0_77 /usr/local/jdk/
修改jdk環境(每個節點都要操作):
[root@namenode ~]#vim /etc/profile
更改JAVA_HOME
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
[root@namenode ~]#source /etc/profile
驗證jdk是否成功:
[root@namenode ~]#java –version
2.2 namenode節點操作
解壓hadoop2.6的包:
[root@namenode ~]#tar zxvf hadoop-2.6.4.tar.gz
備份hadoop1.0(每個節點都操作):
[root@namenode ~]#mkdir /home/hadoop/backup
[root@namenode~]#mv /home/hadoop/hadoop /home/hadoop/backup/
備份好集群namenode的元數據(${HADOOP_HOME}/conf/hdfs-site.xml中的dfs.name.dir所配置的文件夾):
[root@namenode ~]#cp –r /data/work/hdfs/name /data/backup/hdfsname.20160418.bak
安裝hadoop2.6:
[root@namenode ~]#mv /usr/local/src/hadoop-2.6.4 /home/hadoop/hadoop
[root@namenode ~]#chown -R hadoop.hadoop /home/hadoop/hadoop
切換到hadoop用戶:
[root@namenode ~]#su – hadoop
修改用戶環境(每個節點都操作):
[hadoop@namenode ~]$vim /home/hadoop/.bash_profile
修改:
export HADOOP_HOME=/home/hadoop/hadoop
export PATH=$PATH:$HADOOP_HOME:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_HOME_WARN_SUPPRESS=1
export PATH
[hadoop@namenode ~]$source /home/hadoop/.bash_profile
p8
[hadoop@namenode ~]$cd /home/hadoop/hadoop/etc/hadoop/
[hadoop@hadoop/ ~]$vim hadoop-env.sh
修改export JAVA_HOME=/usr/local/jdk
增加export HADOOP_PREFIX=/home/hadoop/hadoop
export HADOOP_HEAPSIZE=15000
[hadoop@hadoop/ ~]$vim yarn-env.sh
修改export JAVA_HOME=/usr/local/jdk
[hadoop@hadoop/ ~]$vim mapred-env.sh
修改export JAVA_HOME=/usr/local/jdk
[hadoop@hadoop/ ~]$vim hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>namenode:50070</value>
<description> NameNode 通過當前參數 獲得 fsp_w_picpath 和 edits </description>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:50090</value>
<description> SecondNameNode 通過當前參數 獲得最新的 fsp_w_picpath </description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
<description> 設定 HDFS 存儲文件的副本個數,默認為3 </description>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///home/hadoop/hadoop2.2/hdfs/namesecondary</value>
<description> 設置 secondary 存放 臨時鏡像 的本地文件系統路徑,如果這是一個用逗號分隔的文件列表,則鏡像將會冗余復制到所有目錄,只對 secondary 有效 </description>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/work/hdfs/name/</value>
<description> namenode 用來持續存放命名空間和交換日志的本地文件系統路徑 </description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/work/hdfs</value>
<description> DataNode 在本地存放塊文件的目錄列表,用逗號分隔 </description>
</property>
<property>
<name>dfs.stream-buffer-size</name>
<value>131072</value>
<description> 默認是4KB,作為hadoop緩沖區,用于hadoop讀hdfs的文件和寫
hdfs的文件,還有map的輸出都用到了這個緩沖區容量,對于現在的硬件很保守,可以設置為128k
(131072),甚至是1M(太大了map和reduce任務可能會內存溢出) </description>
</property>
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
<description> 兩次 checkpoints 之間的間隔,單位為秒,只對 secondary 有效 </description>
</property>
</configuration>
[hadoop@hadoop/ ~]$vim mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
[hadoop@hadoop/ ~]$vim yarn-site.xml
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
[hadoop@hadoop/ ~]$vim core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://namenode:9000/</value>
<description> 設定 namenode 的 主機名 及 端口 </description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
<description> 存放臨時文件的目錄 </description>
</property>
</configuration>
新建文件目錄(所有節點操作)
$mkdir /home/hadoop/tmp
$mkdir /data/work/hdfs/namesecondary/
$chown -R hadoop.hadoop /home/hadoop/tmp/
$ chown -R hadoop.hadoop /data/work/hdfs/namesecondary/
啟動hdfs
[hadoop@namenode ~]$tart-dfs.sh
[hadoop@namenode ~]$hadoop-daemon.sh start namenode -upgrade
重新啟動所有守護線程
[hadoop@namenode ~]$stop-dfs.sh
[hadoop@namenode ~]$start-all.sh
查看元數據是否成功保留
[hadoop@namenode ~]$hadoop fs -ls /
成功之后停掉所有守護進程
[hadoop@namenode ~]$stop-all.sh
修改/home/hadoop/hadoop/etc/hadoop/slaves
[hadoop@namenode ~]$vim slaves
修改:
node1
node2
將hadoop文件拷貝給其它節點
[hadoop@namenode ~]$scp -r /home/hadoop/hadoop node2:/home/hadoop/hadoop/
[hadoop@namenode ~]$scp -r /home/hadoop/hadoop node1:/home/hadoop/hadoop/
Node1,2節點修改hadoop的目錄權限
$chown -R hadoop.hadoop /home/hadoop/hadoop
namenode啟動守護線程
[hadoop@namenode ~]$start-all.sh
namenode和datanode的dfs.namenode.name.dir目錄下(本次實驗中為/data/work/hdfs/name)會多出一個文件夾previous/或者通過jps查看信息
文件夾previous/,這是升級之前數據的備份,如果回滾也是需要有這個文件夾。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。