大數據基礎——Hadoop大數據平臺搭建

前言

分佈式機器學習爲什麼需求大數據呢?隨着海量用戶數據的積累,單機運算已經不能滿足需求。基於海量數據,機器學習訓練之前需要做數據預處理、特徵工程等,需要在大數據平臺上來進行。另一個就是機器學習訓練過程的中間結果集可能會數據膨脹,依然需要大數據平臺來承載。也就是說爲了高性能的數據處理、分佈式計算等,分佈式機器學習是以大數據平臺爲基礎的。所以下面我們來講一下熱門常用的大數據技術。

Hadoop大數據平臺搭建

Hadoop是一種分析和處理大數據的軟件平臺,是一個用 Java 語言實現的 Apache 的開源軟件框架,在大量計算機組成的集羣中實現了對海量數據的分佈式計算。Hadoop是大數據平臺的標配,不管哪個公司的大數據部門,基本都是以Hadoop爲核心。下面我們詳細講解下Hadoop原理和常用的一些操作命令。

一.Hadoop原理和功能介紹

Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。用戶可以在不瞭解分佈式底層細節的情況下,開發分佈式程序。充分利用集羣的威力進行高速運算和存儲。
Hadoop實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有着超大數據集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)文件系統中的數據。
Hadoop的框架最核心的設計有三大塊:HDFS分佈式存儲、MapReduce計算引擎、YARN資源調度和管理,針對Hadoop這三大塊核心,我們詳細來講一下。
1.HDFS架構原理
HDFS 全稱 Hadoop 分佈式文件系統,其最主要的作用是作爲 Hadoop 生態中各系統的存儲服務。HDFS爲海量的數據提供了存儲,可以認爲它是個分佈式數據庫,用來存儲。HDFS 主要包含了6個服務:
1)NameNode
負責管理文件系統的Namespace以及客戶端對文件的訪問,NameNode在Hadoop2可以有多個,Hadoop1只能有一個,存在單點故障。HDFS中的NameNode被稱爲元數據節點,DataNode稱爲數據節點。NameNode維護了文件與數據塊的映射表以及數據塊與數據節點的映射表,而真正的數據是存儲在DataNode上。 NameNode的功能如下:
(1)它是維護和管理 DataNode 的主守護進程;
(2)它記錄存儲在集羣中的所有文件的元數據,例如Block 的位置、文件大小、權限、層次結構等。有兩個文件與元數據關聯;
(3)FsImage:它包含自 NameNode 開始以來文件的 namespace 的完整狀態;
(4)EditLogs:它包含最近對文件系統進行的與最新 FsImage 相關的所有修改。它記錄了發生在文件系統元數據上的每個更改。例如,如果一個文件在 HDFS 中被刪除,NameNode會立即在EditLog中記錄這個操作;
(5)它定期從集羣中的所有 DataNode 接收心跳信息和Block 報告,以確保 DataNode 處於活動狀態;
(6)它保留了HDFS中所有Block的記錄以及這些Block所在的節點;
(7)它負責管理所有Block的複製;
(8)在 DataNode 失敗的情況下,NameNode會爲副本選擇新的 DataNode,平衡磁盤使用並管理到DataNode的通信流量;
(9)DataNode 則是 HDFS 中的從節點,與 NameNode 不同的是,DataNode 是一種商品硬件,它並不具有高質量或高可用性。DataNode 是一個將數據存儲在本地文件 ext3 或 ext4 中的Block服務器。
2)DataNode
用於管理它所在節點上的數據存儲:
(1)這些是叢屬守護進行或在每臺從屬機器上運行的進程;
(2)實際的數據存儲在DataNode上;
(3)執行文件系統客戶端底層的讀寫請求;
(4)定期向NameNode發送心跳報告HDFS的整體健康狀況,默認頻率爲3秒;
(5)數據塊(Block):通常,在任何文件系統中,都將數據存儲爲Block 的集合。Block 是硬盤上存儲數據的最不連續的位置。在Hadoop 集羣中,每個Block 的默認大小爲 128M(此處指 Hadoop 2.x 版本,Hadoop 1.x 版本爲 64M),您也可以通過如下配置配置Block的大小:dfs.block.size或 dfs.blocksize =64M
(6)數據複製:HDFS 提供了一種將大數據作爲數據塊存儲在分佈式環境中的可靠方法,即將這些Block複製以容錯。默認的複製因子是3,您也可以通過如下配置配置複製因子:
fs.replication = 3每個Block 被複制3次存儲在不同的 DataNode 中。
3)FailoverController
故障切換控制器,負責監控與切換 NameNode 服務。
4)JournalNode
用於存儲 EditLog;記錄文件和數映射關係,操作記錄,恢復操作。
5)Balancer
用於平衡集羣之間各節點的磁盤利用率。
6)HttpFS
提供 HTTP 方式訪問 HDFS 的功能。總的看來NameNode 和 DataNode 是 HDFS 的核心,也是客戶端操作數據需要依賴的兩個服務。
2.MapReduce計算引擎
MapReduce計算引擎經歷了兩個版本,Hadoop1的時候叫MRv1,Hadoop2的時候叫MRv2。MapReduce則爲海量的數據提供了計算引擎,拿裏面的數據做運算,跑的快。一聲令下,多臺機器團結合作,每臺機器分自己一部分任務,同時並行跑。等所有機器小任務跑完,彙總報道,總任務全部完成。
1)MapReduce1架構原理
在Hadoop1.X的時代,其核心是JobTracker。
JobTracker:
主要負責資源監控管理和作業調度
(1)監控所有TaskTracker與Job的健康狀況,一旦發現失敗,就將相應的任務轉移到其他節點;
(2)同時JobTracker會跟蹤任務的執行進度、資源使用量等信息,並將這些信息告訴任務調度器,而調度器會在資源出現空閒時,選擇合適的任務使用這些資源。
TaskTracker:
TaskTracker是JobTracker與Task之前的橋樑。
(1)從JobTracker接收並執行各種命令:運行任務、提交任務、Kill任務、重新初始化任務;
(2)週期性地通過心跳機制,將節點健康情況和資源使用情況、各個任務的進度和狀態等彙報給JobTracker。
MapReduce1框架的主要侷限:
(1)JobTracker 是 MapReduce 的集中處理點,存在單點故障,可靠性差;
(2)JobTracker 完成了太多的任務,造成了過多的資源消耗,當MapReduce Job非常多的時候,會造成很大的內存開銷,潛在來說,也增加了JobTracker 失效的風險,這也是業界普遍總結出老Hadoop的MapReduce只能支持4000節點主機的上限,擴展性能差;
(3)可預測的延遲:這是用戶非常關心的。小作業應該儘可能快得被調度,而當前基於TaskTracker->JobTracker ping(heartbeat)的通信方式代價和延遲過大,比較好的方式是JobTracker->TaskTracker ping,這樣JobTracker可以主動掃描有作業運行的TaskTracker。
2)MapReduce2架構原理
Hadoop2之後有Yarn,Hadoop1的時候還沒有。MapReduce2(又名MRv2),用Yarn來管理,下面我們來講一下Yarn資源調度。
3.Yarn資源調度和管理
1)ResourceManager(RM)
ResourceManager就是資源調度器,包含兩個主要的組件:定時調用器(Scheduler)以及應用管理器(ApplicationManager)。
(1)調度器(Scheduler):根據容量,隊列等限制條件,將系統中的資源分配給各個正在運行的應用。這裏的調度器是一個“純調度器”,因爲它不再負責監控或者跟蹤應用的執行狀態等,此外,他也不負責重新啓動因應用執行失敗或者硬件故障而產生的失敗任務。調度器僅根據各個應用的資源需求進行調度,這是通過抽象概念“資源容器”完成的,資源容器(Resource Container)將內存,CPU,磁盤,網絡等資源封裝在一起,從而限定每個任務使用的資源量。總而言之,定時調度器負責嚮應用程序分配資源,它不做監控以及應用程序的狀態跟蹤,並且它不保證會重啓由於應用程序本身或硬件出錯而執行失敗的應用程序。
(2)應用管理器(ApplicationsManager,ASM):ASM主要負責接收作業,協商獲取第一個容器用於執行AM和提供重啓失敗AM container的服務。
2)NodeManager
NodeManager簡稱NM,是每個節點上的框架代理,主要負責啓動應用所需的容器,監控資源(內存,CPU,磁盤,網絡等)的使用情況並將之彙報給調度器(Scheduler)。
3)ApplicationMaster
每個應用程序的ApplicationMaster負責從Scheduler申請資源,以及跟蹤這些資源的使用情況以及任務進度的監控。
4)Container
是Yarn中資源的抽象,它將內存、CPU、磁盤、網絡等資源封裝在一起。當AM向RM申請資源時,RM爲AM返回的資源便是用Container表示的。
瞭解了Hadoop的原理和核心組件,我們看下如何安裝部署搭建分佈式集羣。





























































二.Hadoop安裝部署

Hadoop有Apache社區版和第三方發行版CDH,Apache社區版優點是完全開源免費 社區活躍 文檔、資料詳實。缺點是版本管理比較混亂,各種版本層出不窮,很難選擇,選擇生態組件時需要大量考慮兼容性問題、版本匹配問題、組件衝突問題、編譯問題等。集羣的部署安裝配置複雜,需要編寫大量配置文件,分發到每臺節點,容易出錯,效率低。集羣運維複雜,需要安裝第三方軟件輔助。CDH是第三方公司Cloudera公司基於社區版本的基礎上做了一些優化和改進,穩定性更強一些。CDH分免費版和商業版。CDH安裝可以使用CM通過管理界面的方式來安裝,非常簡單。Cloudera Manager(簡稱CM)是Cloudera公司開發的一款大數據集羣安裝部署利器,這款利器具有集羣自動化安裝、中心化管理、集羣監控、報警等功能,使得安裝集羣從幾天的時間縮短在幾小時以內,運維人員從數十人降低到幾人以內,極大的提高集羣管理的效率。
不管是CDH還是Apache社區版,我們都是使用tar包手動來部署,所有的環境需要我們一步步來操作,Hadoop的每個配置文件也需要我們手工配置,這種方式安裝的優勢比較靈活,集羣服務器也不需要連外網,但這種方式對開發人員的要求比較高,對各種開發環境和配置文件都需要了解清楚。不過這種方式更方便我們瞭解Hadoop的各個模塊和工作原理。下面我們使用這種方式來手動的安裝分佈式集羣,我們的例子是部署5臺服務器,兩個NameNode節點做HA,5個DataNode節點,兩個NameNode節點也同時作爲DataNode。一般當服務器不多的時候,爲了儘量的充分利用服務器的資源,NameNode節點可以同時是DataNode。
安裝步驟如下:
1.創建Hadoop用戶
1)useradd hadoop
設密碼passwd hadoop
命令usermod -g hadoop hadoop
2)vi /root/sudo
添加一行
hadoop ALL=(ALL) NOPASSWD:ALL
chmod u+w /etc/sudoers
3)編輯/etc/sudoers文件
#也就是輸入命令:
vi /etc/sudoers
#進入編輯模式,找到這一行:
root ALL=(ALL) ALL
#在它的下面添加:
hadoop ALL=(ALL) NOPASSWD:ALL
#這裏的hadoop是你的用戶名,然後保存退出。
4)撤銷文件的寫權限
#也就是輸入命令:
chmod u-w /etc/sudoers
2.設置環境變量
編輯/etc/profile文件
vim /etc/profile
輸入以下配置,如代碼3.1所示:
【代碼3.1】 環境變量
export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121
export SPARK_HOME=/home/hadoop/software/spark21
export SCALA_HOME=/home/hadoop/software/scala-2.11.8
export SQOOP_HOME=/home/hadoop/software/sqoop
export HADOOP_HOME=/home/hadoop/software/hadoop2
export PATH= P A T H : PATH: PATH:HADOOP_HOME/bin
export PATH= P A T H : PATH: PATH:HADOOP_HOME/sbin
export HADOOP_MAPARED_HOME= H A D O O P H O M E e x p o r t H A D O O P C O M M O N H O M E = {HADOOP_HOME} export HADOOP_COMMON_HOME= HADOOPHOMEexportHADOOPCOMMONHOME={HADOOP_HOME}
export HADOOP_HDFS_HOME= H A D O O P H O M E e x p o r t Y A R N H O M E = {HADOOP_HOME} export YARN_HOME= HADOOPHOMEexportYARNHOME={HADOOP_HOME}
export HADOOP_CONF_DIR= H A D O O P H O M E / e t c / h a d o o p e x p o r t H I V E H O M E = / h o m e / h a d o o p / s o f t w a r e / h a d o o p 2 / h i v e e x p o r t P A T H = {HADOOP_HOME}/etc/hadoop export HIVE_HOME=/home/hadoop/software/hadoop2/hive export PATH= HADOOPHOME/etc/hadoopexportHIVEHOME=/home/hadoop/software/hadoop2/hiveexportPATH=JAVA_HOME/bin: H I V E H O M E / b i n : HIVE_HOME/bin: HIVEHOME/bin:SQOOP_HOME/bin: P A T H e x p o r t C L A S S P A T H = . : PATH export CLASSPATH=.: PATHexportCLASSPATH=.:JAVA_HOME/lib/dt.jar: J A V A H O M E / l i b / t o o l s . j a r e x p o r t P A T H U S E R L O G N A M E M A I L H O S T N A M E H I S T S I Z E H I S T C O N T R O L e x p o r t F L U M E H O M E = / h o m e / h a d o o p / s o f t w a r e / f l u m e e x p o r t P A T H = JAVA_HOME/lib/tools.jar export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL export FLUME_HOME=/home/hadoop/software/flume export PATH= JAVAHOME/lib/tools.jarexportPATHUSERLOGNAMEMAILHOSTNAMEHISTSIZEHISTCONTROLexportFLUMEHOME=/home/hadoop/software/flumeexportPATH=PATH: F L U M E H O M E / b i n e x p o r t H B A S E H O M E = / h o m e / h a d o o p / s o f t w a r e / h b a s e − 0.98.8 − h a d o o p 2 e x p o r t P A T H = FLUME_HOME/bin export HBASE_HOME=/home/hadoop/software/hbase-0.98.8-hadoop2 export PATH= FLUMEHOME/binexportHBASEHOME=/home/hadoop/software/hbase0.98.8hadoop2exportPATH=PATH: H B A S E H O M E / b i n e x p o r t S O L R H O M E = / h o m e / h a d o o p / s o f t w a r e / s o l r c l o u d / s o l r − 6.4.2 e x p o r t P A T H = HBASE_HOME/bin export SOLR_HOME=/home/hadoop/software/solrcloud/solr-6.4.2 export PATH= HBASEHOME/binexportSOLRHOME=/home/hadoop/software/solrcloud/solr6.4.2exportPATH=PATH: S O L R H O M E / b i n e x p o r t M 2 H O M E = / h o m e / h a d o o p / s o f t w a r e / a p a c h e − m a v e n − 3.3.9 e x p o r t P A T H = SOLR_HOME/bin export M2_HOME=/home/hadoop/software/apache-maven-3.3.9 export PATH= SOLRHOME/binexportM2HOME=/home/hadoop/software/apachemaven3.3.9exportPATH=PATH: M 2 H O M E / b i n e x p o r t P A T H = M2_HOME/bin export PATH= M2HOME/binexportPATH=PATH:/home/hadoop/software/apache-storm-1.1.0/bin
export OOZIE_HOME=/home/hadoop/software/oozie-4.3.0
export SQOOP_HOME=/home/hadoop/software/sqoop-1.4.6-cdh5.5.2
export PATH= P A T H : PATH: PATH:SQOOP_HOME/bin
#按:wq保存,保存後環境變量還沒有生效,執行以下命令纔會生效。
source /etc/profile
#然後修改下Hadoop的安裝目錄爲Hadoop用戶所有。
chown -R hadoop:hadoop /data1/software/hadoop
3.設置local無密碼登陸
su - hadoop
cd ~/.ssh 如果沒有.shh 則mkdir ~/.ssh
ssh-keygen -t rsa
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
sudo chmod 644 ~/.ssh/authorized_keys
sudo chmod 700 ~/.ssh
然後重啓sshd服務:
sudo /etc/rc.d/init.d/sshd restart
有些情況下會遇到這個報錯,可以這麼來解決。
常見錯誤:
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Could not create directory ‘/home/hadoop/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
open /home/hadoop/.ssh/id_rsa failed: Permission denied.
Saving the key failed: /home/hadoop/.ssh/id_rsa.
解決辦法:
在root用戶下操作yum remove selinux*
4.修改/etc/hosts主機名和IP地址的映射文件
sudo vim /etc/hosts
增加:
172.172.0.11 data1
172.172.0.12 data2
172.172.0.13 data3
172.172.0.14 data4
172.172.0.15 data5
5.設置遠程無密碼登陸
使用Hadoop用戶:
每臺機器先本地無祕鑰部署一遍。然後因爲我們搭建的是雙NameNode節點,需要從這兩個服務器上把authorized_keys文件複製到其它機器上,主要目的是NameNode節點需要直接訪問DataNode節點。
把雙namenode HA的authorized_keys複製到slave上。
從namenode1節點上覆制:
scp authorized_keys hadoop@data2:~/.ssh/authorized_keys_from_data1
scp authorized_keys hadoop@data3:~/.ssh/authorized_keys_from_data1
scp authorized_keys hadoop@data4:~/.ssh/authorized_keys_from_data1
scp authorized_keys hadoop@data5:~/.ssh/authorized_keys_from_data1
然後從namenode2節點上覆制:
scp authorized_keys hadoop@data1:~/.ssh/authorized_keys_from_data2
scp authorized_keys hadoop@data3:~/.ssh/authorized_keys_from_data2
scp authorized_keys hadoop@data4:~/.ssh/authorized_keys_from_data2
scp authorized_keys hadoop@data5:~/.ssh/authorized_keys_from_data2
6.每臺都關閉機器的防火牆
#關閉防火牆
sudo /etc/init.d/iptables stop
#關閉開機啓動
sudo chkconfig iptables off
7.jdk安裝
因爲Hadoop是基於Java開發,所以我們需要安裝jdk環境:
cd /home/hadoop/software/
上傳rz jdk1.8.0_121.gz
tar xvzf jdk1.8.0_121.gz
然後修改下環境變量指定到這個jdk目錄就算安裝好了:
vim /etc/profile
export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121
source /etc/profile
8.Hadoop安裝
Hadoop就是一個tar包放上去解壓縮後再進行各個文件的配置。
上傳hadoop-2.6.0-cdh5.tar.gz到/home/hadoop/software/
tar xvzf hadoop-2.6.0-cdh5.tar.gz
mv hadoop-2.6.0-cdh5 hadoop2
cd /home/hadoop/software/hadoop2/etc/hadoop










































































































vi hadoop-env.sh
修改JAVA_HOME值(export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121)
vi yarn-env.sh
修改JAVA_HOME值(export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121)
然後修改Hadoop的主從節點文件,slaves是從節點,masters是主節點。需要說明的是一個主節點也可以同時從節點。也就是說這個節點可以同時是NameNode節點和DataNode節點。
vim slaves
添加這5臺機器的節點:
data1
data2
data3
data4
data5
vim masters
添加兩個NameNode節點:
data1
data2
下面來修改Hadoop的配置文件:
1)編輯core-site.xml文件
core-site.xml文件用於定義系統級別的參數,如HDFS URL 、Hadoop的臨時目錄等。這個文件主要是修改fs.defaultFS節點,改成hdfs://ai,ai是雙NameNodeHA的虛擬域名,再就是hadoop.tmp.dir這個節點也非常重要,如果不配置,Hadoop重啓後可能會有問題。
然後就是配置zookeeper的地址ha.zookeeper.quorum。


fs.defaultFS
hdfs://ai


ha.zookeeper.quorum
data1:2181,data2:2181,data3:2181,data4:2181,data5:2181


dfs.cluster.administrators
hadoop


io.file.buffer.size
131072


hadoop.tmp.dir
/home/hadoop/software/hadoop/tmp
Abase for other temporary directories.


hadoop.proxyuser.hduser.hosts



hadoop.proxyuser.hduser.groups



2)編輯hdfs-site.xml文件
hdfs-site.xml文件用來配置名稱節點和數據節點的存放位置、文件副本的個數、文件的讀取權限等。
dfs.nameservices設置雙NameNodeHA的虛擬域名。
dfs.ha.namenodes.ai指定兩個節點名稱。
dfs.namenode.rpc-address.ai.nn1指定HDFS訪問節點1。
dfs.namenode.rpc-address.ai.nn2指定HDFS訪問節點2。
dfs.namenode.http-address.ai.nn1指定HDFS的Web訪問節點1。
dfs.namenode.http-address.ai.nn2指定HDFS的Web訪問節點2。
dfs.namenode.name.dir定義DFS的名稱節點在本地文件系統的位置。
dfs.datanode.data.dir定義DFS數據節點存儲數據塊時存儲在本地文件系統的位置。
dfs.replication缺省的塊複製數量。
dfs.webhdfs.enabled是否通過http協議讀取hdfs文件,如果選是,則集羣安全性較差。
vim hdfs-site.xml


dfs.nameservices
ai


dfs.ha.namenodes.ai
nn1,nn2


dfs.namenode.rpc-address.ai.nn1
data1:9000


dfs.namenode.rpc-address.ai.nn2
data2:9000


dfs.namenode.http-address.ai.nn1
data1:50070


dfs.namenode.http-address.ai.nn2
data2:50070


dfs.namenode.shared.edits.dir
qjournal://data1:8485;data2:8485;data3:8485;data4:8485;data5:8485/aicluster


dfs.client.failover.proxy.provider.ai
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider


dfs.ha.fencing.methods
sshfence


dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa


dfs.journalnode.edits.dir
/home/hadoop/software/hadoop/journal/data


dfs.ha.automatic-failover.enabled
true


dfs.namenode.name.dir
file:/home/hadoop/software/hadoop/dfs/name


dfs.datanode.data.dir
file:/home/hadoop/software/hadoop/dfs/data


dfs.replication
3


dfs.webhdfs.enabled
true


dfs.permissions
true


dfs.client.block.write.replace-datanode-on-failure.enable
true


dfs.client.block.write.replace-datanode-on-failure.policy
NEVER


dfs.datanode.max.xcievers
4096


dfs.datanode.balance.bandwidthPerSec
104857600


dfs.qjournal.write-txns.timeout.ms
120000


3)編輯mapred-site.xml文件
主要是修改mapreduce.jobhistory.address和mapreduce.jobhistory.webapp.address兩個節點,主要是配置歷史服務器地址,通過歷史服務器查看已經運行完的Mapreduce作業記錄,比如用了多少個Map、用了多少個Reduce、作業提交時間、作業啓動時間、作業完成時間等信息。默認情況下,Hadoop歷史服務器是沒有啓動的,我們可以通過下面的命令來啓動Hadoop歷史服務器:
$ sbin/mr-jobhistory-daemon.sh start historyserver
這樣我們就可以在相應機器的19888端口上打開歷史服務器的WEB UI界面。可以查看已經運行完的作業情況。歷史服務器可以單獨在一臺機器上啓動,參數配置如下:
vim mapred-site.xml


mapreduce.framework.name
yarn


mapreduce.jobhistory.address
data1:10020


mapred.child.env
LD_LIBRARY_PATH=/usr/lib64


mapreduce.jobhistory.webapp.address
data1:19888


mapred.child.java.opts
-Xmx3072m


mapreduce.task.io.sort.mb
1000


mapreduce.jobtracker.expire.trackers.interval
1600000


mapreduce.tasktracker.healthchecker.script.timeout
1500000


mapreduce.task.timeout
88800000


mapreduce.map.memory.mb
8192


mapreduce.reduce.memory.mb
8192


mapreduce.reduce.java.opts
-Xmx6144m


4)編輯yarn-site.xml文件
主要是對Yarn資源調度的配置,核心配置參數如下:
yarn.resourcemanager.address
參數解釋:ResourceManager 對客戶端暴露的地址。客戶端通過該地址向RM提交應用程序,殺死應用程序等。
默認值: y a r n . r e s o u r c e m a n a g e r . h o s t n a m e : 8032 y a r n . r e s o u r c e m a n a g e r . s c h e d u l e r . a d d r e s s 參 數 解 釋 : R e s o u r c e M a n a g e r 對 A p p l i c a t i o n M a s t e r 暴 露 的 訪 問 地 址 。 A p p l i c a t i o n M a s t e r 通 過 該 地 址 向 R M 申 請 資 源 、 釋 放 資 源 等 。 默 認 值 : {yarn.resourcemanager.hostname}:8032 yarn.resourcemanager.scheduler.address 參數解釋:ResourceManager 對ApplicationMaster暴露的訪問地址。ApplicationMaster通過該地址向RM申請資源、釋放資源等。 默認值: yarn.resourcemanager.hostname:8032yarn.resourcemanager.scheduler.addressResourceManagerApplicationMasterApplicationMasterRM{yarn.resourcemanager.hostname}:8030
yarn.resourcemanager.resource-tracker.address
參數解釋:ResourceManager 對NodeManager暴露的地址.。NodeManager通過該地址向RM彙報心跳,領取任務等。
默認值: y a r n . r e s o u r c e m a n a g e r . h o s t n a m e : 8031 y a r n . r e s o u r c e m a n a g e r . a d m i n . a d d r e s s 參 數 解 釋 : R e s o u r c e M a n a g e r 對 管 理 員 暴 露 的 訪 問 地 址 。 管 理 員 通 過 該 地 址 向 R M 發 送 管 理 命 令 等 。 默 認 值 : {yarn.resourcemanager.hostname}:8031 yarn.resourcemanager.admin.address 參數解釋:ResourceManager 對管理員暴露的訪問地址。管理員通過該地址向RM發送管理命令等。 默認值: yarn.resourcemanager.hostname:8031yarn.resourcemanager.admin.addressResourceManagerRM{yarn.resourcemanager.hostname}:8033
yarn.resourcemanager.webapp.address
參數解釋:ResourceManager對外web ui地址。用戶可通過該地址在瀏覽器中查看集羣各類信息。
默認值: y a r n . r e s o u r c e m a n a g e r . h o s t n a m e : 8088 y a r n . r e s o u r c e m a n a g e r . s c h e d u l e r . c l a s s 參 數 解 釋 : 啓 用 的 資 源 調 度 器 主 類 。 目 前 可 用 的 有 F I F O 、 C a p a c i t y S c h e d u l e r 和 F a i r S c h e d u l e r 。 默 認 值 : o r g . a p a c h e . h a d o o p . y a r n . s e r v e r . r e s o u r c e m a n a g e r . s c h e d u l e r . c a p a c i t y . C a p a c i t y S c h e d u l e r y a r n . r e s o u r c e m a n a g e r . r e s o u r c e − t r a c k e r . c l i e n t . t h r e a d − c o u n t 參 數 解 釋 : 處 理 來 自 N o d e M a n a g e r 的 R P C 請 求 的 H a n d l e r 數 目 。 默 認 值 : 50 y a r n . r e s o u r c e m a n a g e r . s c h e d u l e r . c l i e n t . t h r e a d − c o u n t 參 數 解 釋 : 處 理 來 自 A p p l i c a t i o n M a s t e r 的 R P C 請 求 的 H a n d l e r 數 目 。 默 認 值 : 50 y a r n . s c h e d u l e r . m i n i m u m − a l l o c a t i o n − m b / y a r n . s c h e d u l e r . m a x i m u m − a l l o c a t i o n − m b 參 數 解 釋 : 單 個 可 申 請 的 最 小 / 最 大 內 存 資 源 量 。 比 如 設 置 爲 1024 和 3072 , 則 運 行 M a p R e d c e 作 業 時 , 每 個 T a s k 最 少 可 申 請 1024 M B 內 存 , 最 多 可 申 請 3072 M B 內 存 。 默 認 值 : 1024 / 8192 y a r n . s c h e d u l e r . m i n i m u m − a l l o c a t i o n − v c o r e s / y a r n . s c h e d u l e r . m a x i m u m − a l l o c a t i o n − v c o r e s 參 數 解 釋 : 單 個 可 申 請 的 最 小 / 最 大 虛 擬 C P U 個 數 。 比 如 設 置 爲 1 和 4 , 則 運 行 M a p R e d u c e 作 業 時 , 每 個 T a s k 最 少 可 申 請 1 個 虛 擬 C P U , 最 多 可 申 請 4 個 虛 擬 C P U 。 什 麼 是 虛 擬 C P U , 可 閱 讀 我 的 這 篇 文 章 : “ Y A R N 資 源 調 度 器 剖 析 ” 。 默 認 值 : 1 / 32 y a r n . r e s o u r c e m a n a g e r . n o d e s . i n c l u d e − p a t h / y a r n . r e s o u r c e m a n a g e r . n o d e s . e x c l u d e − p a t h 參 數 解 釋 : N o d e M a n a g e r 黑 白 名 單 。 如 果 發 現 若 幹 個 N o d e M a n a g e r 存 在 問 題 , 比 如 故 障 率 很 高 , 任 務 運 行 失 敗 率 高 , 則 可 以 將 之 加 入 黑 名 單 中 。 注 意 , 這 兩 個 配 置 參 數 可 以 動 態 生 效 。 ( 調 用 一 個 r e f r e s h 命 令 即 可 ) 默 認 值 : “ ” y a r n . r e s o u r c e m a n a g e r . n o d e m a n a g e r s . h e a r t b e a t − i n t e r v a l − m s 參 數 解 釋 : N o d e M a n a g e r 心 跳 間 隔 默 認 值 : 1000 ( 毫 秒 ) 一 般 需 要 修 改 的 地 方 在 下 面 的 配 置 中 加 粗 了 。 這 個 配 置 文 件 是 Y a r n 資 源 調 度 最 核 心 的 配 置 , 下 面 的 是 一 個 實 例 配 置 。 有 一 個 需 要 注 意 的 配 置 技 巧 , 分 配 的 內 存 和 C P U 一 定 要 配 套 , 需 要 根 據 你 的 服 務 器 的 情 況 , 計 算 最 小 分 配 內 存 , 分 配 C P U 等 。 這 個 如 果 計 算 不 好 的 話 , 可 能 會 造 成 H a d o o p 跑 任 務 資 源 分 配 的 時 候 , C P U 資 源 用 盡 了 , 但 內 存 還 剩 很 多 。 但 對 於 H a d o o p 來 講 , 只 要 C P U 或 內 存 有 一 個 佔 滿 了 , 後 面 的 任 務 就 不 能 分 配 了 , 所 以 設 置 不 好 會 造 成 C P U 和 內 存 資 源 的 浪 費 。 另 外 一 個 需 要 注 意 的 地 方 y a r n . n o d e m a n a g e r . w e b a p p . a d d r e s s 節 點 復 制 到 每 臺 H a d o o p 服 務 器 上 記 得 把 節 點 值 的 I P 地 址 改 成 本 機 。 這 個 地 方 忘 了 改 , 可 能 會 出 現 N o d e M a n a g e r 啓 動 不 了 的 問 題 。 v i m y a r n − s i t e . x m l < c o n f i g u r a t i o n > < p r o p e r t y > < n a m e > y a r n . n o d e m a n a g e r . w e b a p p . a d d r e s s < / n a m e > < v a l u e > 172.172.0.11 : 8042 < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . r e s o u r c e m a n a g e r . r e s o u r c e − t r a c k e r . a d d r e s s < / n a m e > < v a l u e > d a t a 1 : 8031 < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . r e s o u r c e m a n a g e r . s c h e d u l e r . a d d r e s s < / n a m e > < v a l u e > d a t a 1 : 8030 < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . r e s o u r c e m a n a g e r . s c h e d u l e r . c l a s s < / n a m e > < v a l u e > o r g . a p a c h e . h a d o o p . y a r n . s e r v e r . r e s o u r c e m a n a g e r . s c h e d u l e r . c a p a c i t y . C a p a c i t y S c h e d u l e r < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . r e s o u r c e m a n a g e r . a d d r e s s < / n a m e > < v a l u e > d a t a 1 : 8032 < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . n o d e m a n a g e r . l o c a l − d i r s < / n a m e > < v a l u e > {yarn.resourcemanager.hostname}:8088 yarn.resourcemanager.scheduler.class 參數解釋:啓用的資源調度器主類。目前可用的有FIFO、Capacity Scheduler和Fair Scheduler。 默認值: org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler yarn.resourcemanager.resource-tracker.client.thread-count 參數解釋:處理來自NodeManager的RPC請求的Handler數目。 默認值:50 yarn.resourcemanager.scheduler.client.thread-count 參數解釋:處理來自ApplicationMaster的RPC請求的Handler數目。 默認值:50 yarn.scheduler.minimum-allocation-mb/ yarn.scheduler.maximum-allocation-mb 參數解釋:單個可申請的最小/最大內存資源量。比如設置爲1024和3072,則運行MapRedce作業時,每個Task最少可申請1024MB內存,最多可申請3072MB內存。 默認值:1024/8192 yarn.scheduler.minimum-allocation-vcores/yarn.scheduler.maximum-allocation-vcores 參數解釋:單個可申請的最小/最大虛擬CPU個數。比如設置爲1和4,則運行MapReduce作業時,每個Task最少可申請1個虛擬CPU,最多可申請4個虛擬CPU。什麼是虛擬CPU,可閱讀我的這篇文章:“YARN 資源調度器剖析”。 默認值:1/32 yarn.resourcemanager.nodes.include-path/yarn.resourcemanager.nodes.exclude-path 參數解釋:NodeManager黑白名單。如果發現若干個NodeManager存在問題,比如故障率很高,任務運行失敗率高,則可以將之加入黑名單中。注意,這兩個配置參數可以動態生效。(調用一個refresh命令即可) 默認值:“” yarn.resourcemanager.nodemanagers.heartbeat-interval-ms 參數解釋:NodeManager心跳間隔 默認值:1000(毫秒) 一般需要修改的地方在下面的配置中加粗了。這個配置文件是Yarn資源調度最核心的配置,下面的是一個實例配置。有一個需要注意的配置技巧,分配的內存和CPU一定要配套,需要根據你的服務器的情況,計算最小分配內存,分配CPU等。這個如果計算不好的話,可能會造成Hadoop跑任務資源分配的時候,CPU資源用盡了,但內存還剩很多。但對於Hadoop來講,只要CPU或內存有一個佔滿了,後面的任務就不能分配了,所以設置不好會造成CPU和內存資源的浪費。 另外一個需要注意的地方yarn.nodemanager.webapp.address節點複製到每臺Hadoop服務器上記得把節點值的IP地址改成本機。這個地方忘了改,可能會出現NodeManager啓動不了的問題。 vim yarn-site.xml <configuration> <property> <name>yarn.nodemanager.webapp.address</name> <value>172.172.0.11:8042</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>data1:8031</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>data1:8030</value> </property> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>data1:8032</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value> yarn.resourcemanager.hostname:8088yarn.resourcemanager.scheduler.class調FIFOCapacitySchedulerFairSchedulerorg.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduleryarn.resourcemanager.resourcetracker.client.threadcountNodeManagerRPCHandler50yarn.resourcemanager.scheduler.client.threadcountApplicationMasterRPCHandler50yarn.scheduler.minimumallocationmb/yarn.scheduler.maximumallocationmb/10243072MapRedceTask1024MB3072MB1024/8192yarn.scheduler.minimumallocationvcores/yarn.scheduler.maximumallocationvcores/CPU14MapReduceTask1CPU4CPUCPUYARN調1/32yarn.resourcemanager.nodes.includepath/yarn.resourcemanager.nodes.excludepathNodeManagerNodeManager調refreshyarn.resourcemanager.nodemanagers.heartbeatintervalmsNodeManager1000Yarn調CPUCPUHadoopCPUHadoopCPU滿CPUyarn.nodemanager.webapp.addressHadoopIPNodeManagervimyarnsite.xml<configuration><property><name>yarn.nodemanager.webapp.address</name><value>172.172.0.11:8042</value></property><property><name>yarn.resourcemanager.resourcetracker.address</name><value>data1:8031</value></property><property><name>yarn.resourcemanager.scheduler.address</name><value>data1:8030</value></property><property><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value></property><property><name>yarn.resourcemanager.address</name><value>data1:8032</value></property><property><name>yarn.nodemanager.localdirs</name><value>{hadoop.tmp.dir}/nodemanager/local


yarn.nodemanager.address
0.0.0.0:8034


yarn.nodemanager.remote-app-log-dir
h a d o o p . t m p . d i r / n o d e m a n a g e r / r e m o t e < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . n o d e m a n a g e r . l o g − d i r s < / n a m e > < v a l u e > {hadoop.tmp.dir}/nodemanager/remote</value> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value> hadoop.tmp.dir/nodemanager/remote</value></property><property><name>yarn.nodemanager.logdirs</name><value>{hadoop.tmp.dir}/nodemanager/logs


yarn.nodemanager.aux-services
mapreduce_shuffle


yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler


mapred.job.queue.name
${user.name}


yarn.nodemanager.resource.memory-mb
116888


yarn.scheduler.minimum-allocation-mb
5120


yarn.scheduler.maximum-allocation-mb
36688


yarn.scheduler.maximum-allocation-vcores
8


yarn.nodemanager.resource.cpu-vcores
50


yarn.scheduler.minimum-allocation-vcores
2


yarn.nm.liveness-monitor.expiry-interval-ms
700000


yarn.nodemanager.health-checker.interval-ms
800000


yarn.nm.liveness-monitor.expiry-interval-ms
900000


yarn.resourcemanager.container.liveness-monitor.interval-ms
666000


yarn.nodemanager.localizer.cache.cleanup.interval-ms
688000


5)編輯capacity-scheduler.xml文件
在上面講的yarn-site.xml 配置文件中,我們配置的調度器用的是容量調度器,就是這個節點指定的配置yarn.resourcemanager.scheduler.class,容量調度器是Hadoop默認的,另外還有公平調度器,我們可以分別講一下,看看它們有什麼區別。
公平調度
公平共享調度器的核心概念是,隨着時間推移平均分配工作,這樣每個作業都能平均地共享到資源。結果是隻需較少時間執行的作業能夠訪問 CPU,那些需要更長時間執行的作業中結束得遲。這樣的方式可以在 Hadoop 作業之間形成交互,而且可以讓 Hadoop 集羣對提交的多種類型作業作出更大的響應。公平調度器是由Facebook開發出來的。
Hadoop的實現會創建一組池,將作業放在其中供調度器選擇。每個池會分配一組共享以平衡池中作業的資源(更多的共享意味着作業執行所需的資源更多)。默認情況下,所有池的共享相等,但可以進行配置,根據作業類型提供更多或更少的共享。如果需要的話,還可以限制同時活動的作業數,以儘量減少擁堵,讓工作及時完成。
爲了保證公平,每個用戶被分配一個池。在這樣的方式下,如果一個用戶提交很多作業,那麼他分配的集羣資源與其他用戶一樣多(與他提交的工作數無關)。無論分配到池的共享有多少,如果系統未加載,那麼作業收到的共享不會被使用(在可用作業之間分配)。
調度器實現會追蹤系統中每個作業的計算時間。調度器還會定期檢查作業接收到的計算時間和在理想的調度器中應該收到的計算時間的差距。會使用該結果來確定任務的虧空。調度器作業接着會保證虧空最多的任務最先執行。
在 mapred-site.xml 文件中配置公平共享。該文件會定義對公平共享調度器行爲的管理。一個 XML 文件(即 mapred.fairscheduler.allocation.file 屬性)定義了每個池的共享的分配。爲了優化作業大小,您可以設置 mapread.fairscheduler.sizebasedweight 將共享分配給作業作爲其大小的函數。還有一個類似的屬性可以通過調整作業的權重讓更小的作業在 5 分鐘之後運行得更快 (mapred.fairscheduler.weightadjuster)。您還可以用很多其他的屬性來調優節點上的工作負載(例如某個 TaskTracker 能管理的 maps 和 reduces 數目)並確定是否執行搶佔。
容量調度器
容量調度器的原理與公平調度器有些相似,但也有一些區別。首先,容量調度是用於大型集羣,它們有多個獨立用戶和目標應用程序。由於這個原因,容量調度能提供更大的控制和能力,提供用戶之間最小容量保證並在用戶之間共享多餘的容量。容量調度是由 Yahoo! 開發出來的。
在容量調度中,創建的是隊列而不是池,每個隊列的 map 和 reduce 插槽數都可以配置。每個隊列都會分配一個保證容量(集羣的總容量是每個隊列容量之和)。
隊列處於監控之下;如果某個隊列未使用分配的容量,那麼這些多餘的容量會被臨時分配到其他隊列中。由於隊列可以表示一個人或大型組織,那麼所有的可用容量都可以由其他用戶重新分配使用。
與公平調度另一個區別是可以調整隊列中作業的優先級。一般來說,具有高優先級的作業訪問資源比低優先級作業更快。Hadoop 路線圖包含了對搶佔的支持(臨時替換出低優先級作業,讓高優先級作業先執行),但該功能尚未實現。
另一個區別是對隊列進行嚴格的訪問控制(假設隊列綁定到一個人或組織)。這些訪問控制是按照每個隊列進行定義的。對於將作業提交到隊列的能力和查看修改隊列中作業的能力都有嚴格限制。
可在多個 Hadoop 配置文件中配置容量調度器。隊列是在 hadoop-site.xml 中定義,在 capacity-scheduler.xml 中配置。可以在 mapred-queue-acls.xml 中配置 ACL。單個的隊列屬性包括容量百分比(集羣中所有的隊列容量少於或等於 100)、最大容量(隊列多餘容量使用的限制)以及隊列是否支持優先級。更重要的是,可以在運行時調整隊列優先級,從而可以在集羣使用過程中改變或避免中斷的情況。
我們的實例用的容量調度器,我們看下配置參數:
mapred.capacity-scheduler.queue..capacity:
設置調度器中各個queue的容量,這裏指的是佔用的集羣的slots的百分比,需要注意的是,所有queue的該配置項加起來必須小於等於100,否則會導致JobTracker啓動失敗。
mapred.capacity-scheduler.queue..maximum-capacity:
設置調度器中各個queue最大可以佔有的容量,默認爲-1表示最大可以佔有集羣100%的資源,和設置爲100的效果是一樣的。
mapred.capacity-scheduler.queue..minimum-user-limit-percent:
當queue中多個用戶出現slots競爭的時候,限制每個用戶的slots資源的百分比。舉個例子,當minimum-user-limit-percent設置爲25%時候,如果queue中有多餘4個用戶同時提交job,那麼調度器保證每個用戶佔有的slots不超過queue中slots數的25%,默認爲100表示不對用戶作限制。
mapred.capacity-scheduler.queue..user-limit-factor:
設置queue中用戶可佔用queue容量的係數,默認爲1表示,queue中每個用戶最多隻能佔有queue的容量(即mapred.capacity-scheduler.queue..capacity),因此,需要注意的是,如果queue中只有一個用戶提交job,且希望用戶在集羣不繁忙時候可擴展到mapred.capacity-scheduler.queue..maximum-capacity指定的slots數,則必須相應調大user-limit-factor這個係數。
mapred.capacity-scheduler.queue..supports-priority:
設置調度器中各個queue是否支持job優先級,不用過多解釋。
mapred.capacity-scheduler.maximum-system-jobs:
設置調度器中各個queue中合起來共計可初始化後併發執行的job數,需要注意的是,各個queue會按照自己佔有集羣slots資源的比例(即mapred.capacity-scheduler.queue..capacity)決定每個queue最多同時併發執行的job數!舉個例子,假設maximum-system-jobs爲20個,而queue1佔集羣10%資源,那麼意味着queue1最多可同時併發運行2個job,如果碰巧是運行時間比較長的job的話,將直接導致其他新提交的job被JobTracker阻塞不能進行初始化!
mapred.capacity-scheduler.queue..maximum-initialized-active-tasks:
設置queue中所有併發運行job包含的task數的上限值,如果超過此限制,則新提交到該queue中的job會被排隊緩存到磁盤上。
mapred.capacity-scheduler.queue..maximum-initialized-active-tasks-per-user:
設置queue中每個特定用戶併發運行job包含的task數的上限值,如果超過此限制,則該用戶新提交到該queue中的job會被排隊緩存到磁盤上。
mapred.capacity-scheduler.queue..init-accept-jobs-factor:
設置每個queue中可容納接收的job總數(maximum-system-jobs * queue-capacity)的係數,舉個例子,如果maximum-system-jobs爲20,queue-capacity爲10%,init-accept-jobs-factor爲10,則當queue中job總數達到10*(20*10%)=20時,新的job將被JobTracker拒絕提交。
我們下面的配置實例是配置了hadoop和spark兩個隊列,hadoop隊列分配了92%的資源,參見yarn.scheduler.capacity.root.hadoop.capacity配置,spark隊列分配了8%的資源,參見yarn.scheduler.capacity.root.spark.capacity配置:
vim capacity-scheduler.xml


yarn.scheduler.capacity.maximum-applications
10000


yarn.scheduler.capacity.maximum-am-resource-percent
0.1


yarn.scheduler.capacity.resource-calculator
org.apache.hadoop.yarn.util.resource.DominantResourceCalculator


yarn.scheduler.capacity.node-locality-delay
-1


yarn.scheduler.capacity.root.queues
hadoop,spark


yarn.scheduler.capacity.root.hadoop.capacity
92


yarn.scheduler.capacity.root.hadoop.user-limit-factor
1

yarn.scheduler.capacity.root.hadoop.maximum-capacity
-1

yarn.scheduler.capacity.root.hadoop.state
RUNNING

yarn.scheduler.capacity.root.hadoop.acl_submit_applications
hadoop


yarn.scheduler.capacity.root.hadoop.acl_administer_queue
hadoop hadoop



yarn.scheduler.capacity.root.spark.capacity
8


yarn.scheduler.capacity.root.spark.user-limit-factor
1


yarn.scheduler.capacity.root.spark.maximum-capacity
-1


yarn.scheduler.capacity.root.spark.state
RUNNING


yarn.scheduler.capacity.root.spark.acl_submit_applications
hadoop


yarn.scheduler.capacity.root.spark.acl_administer_queue
hadoop hadoop



以上對Hadoop的配置文件都配好了,然把這臺服務器Hadoop整個目錄複製到其它機器上就可以了。記得有個地方需要修改下yarn-site.xml裏yarn.nodemanager.webapp.address每臺Hadoop服務器上把IP地址改成本機。這個地方忘了改,可能會出現NodeManager啓動不了的問題。
scp -r /home/hadoop/software/hadoop2 hadoop@data2:/home/hadoop/software/
scp -r /home/hadoop/software/hadoop2 hadoop@data3:/home/hadoop/software/
scp -r /home/hadoop/software/hadoop2 hadoop@data4:/home/hadoop/software/
scp -r /home/hadoop/software/hadoop2 hadoop@data5:/home/hadoop/software/
另外還有個地方需要優化下,默認情況下Hadoop跑多個reduce可能報錯:
Failed on local exception: java.io.IOException: Couldn’t set up IO streams; Host Details : local hos
解決辦法:集羣所有節點增加如下配置
#在文件中增加
sudo vi /etc/security/limits.conf
hadoop soft nproc 100000
hadoop hard nproc 100000
重啓整個集羣每個節點,重啓Hadoop集羣即可。
到現在環境安裝一些準備就緒,下面就開始對Hadoop的HDFS分佈式文件系統格式化,就像我們買了新電腦磁盤需要格式化之後才能用一樣。由於我們的實例採用的NameNodeHA雙節點模式,它是依靠zookeeper來實現的,所有我們實現需要先安裝好zookeeper纔行。每臺服務器上啓動zookeeper服務:
/home/hadoop/software/zookeeper-3.4.6/bin/zkServer.sh restart
在NameNode1上data1服務器上初始化zookeeper:
hdfs zkfc –formatZK
分別在5臺Hadoop集羣上啓動journalnode服務,執行命令
hadoop-daemon.sh start journalnode
在NameNode1上data1服務器上格式化HDFS:
hdfs namenode -format
然後啓動這臺機器上的NameNode節點服務:
hadoop-daemon.sh start namenode
在第二個NameNode上data2執行:
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
最後我們啓動Hadoop集羣:
start-all.sh
啓動集羣過程如下:
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [datanode1 datanode2]
datanode2: starting namenode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-namenode-datanode2.out
datanode1: starting namenode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-namenode-datanode1.out
datanode2: Java HotSpot™ 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
datanode2: Java HotSpot™ 64-Bit Server VM warning: CMSFullGCsBeforeCompaction is deprecated and will likely be removed in a future release.
datanode1: Java HotSpot™ 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
datanode1: Java HotSpot™ 64-Bit Server VM warning: CMSFullGCsBeforeCompaction is deprecated and will likely be removed in a future release.
172.172.0.12: starting datanode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-datanode-datanode2.out
172.172.0.11: starting datanode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-datanode-datanode1.out
172.172.0.14: starting datanode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-datanode-datanode4.out
172.172.0.13: starting datanode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-datanode-datanode3.out
172.172.0.15: starting datanode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-datanode-datanode5.out
Starting journal nodes [172.172.0.11 172.172.0.12 172.172.0.13 172.172.0.14 172.172.0.15]
172.172.0.14: starting journalnode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-journalnode-datanode4.out
172.172.0.11: starting journalnode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-journalnode-datanode1.out
172.172.0.13: starting journalnode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-journalnode-datanode3.out
172.172.0.15: starting journalnode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-journalnode-datanode5.out
172.172.0.12: starting journalnode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-journalnode-datanode2.out
Starting ZK Failover Controllers on NN hosts [datanode1 datanode2]
datanode1: starting zkfc, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-zkfc-datanode1.out
datanode2: starting zkfc, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-zkfc-datanode2.out
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-resourcemanager-datanode1.out
172.172.0.15: starting nodemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-nodemanager-datanode5.out
172.172.0.14: starting nodemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-nodemanager-datanode4.out
172.172.0.12: starting nodemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-nodemanager-datanode2.out
172.172.0.13: starting nodemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-nodemanager-datanode3.out
172.172.0.11: starting nodemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-nodemanager-datanode1.out
如果是停止集羣的話用這個命令stop-all.sh
停止集羣過程如下:
This script is Deprecated. Instead use stop-dfs.sh and stop-yarn.sh
Stopping namenodes on [datanode1 datanode2]
datanode1: stopping namenode
datanode2: stopping namenode
172.172.0.12: stopping datanode
172.172.0.11: stopping datanode
172.172.0.15: stopping datanode
172.172.0.13: stopping datanode
172.172.0.14: stopping datanode
Stopping journal nodes [172.172.0.11 172.172.0.12 172.172.0.13 172.172.0.14 172.172.0.15]
172.172.0.11: stopping journalnode
172.172.0.13: stopping journalnode
172.172.0.12: stopping journalnode
172.172.0.15: stopping journalnode
172.172.0.14: stopping journalnode
Stopping ZK Failover Controllers on NN hosts [datanode1 datanode2]
datanode2: stopping zkfc
datanode1: stopping zkfc
stopping yarn daemons
stopping resourcemanager
172.172.0.13: stopping nodemanager
172.172.0.12: stopping nodemanager
172.172.0.15: stopping nodemanager
172.172.0.14: stopping nodemanager
172.172.0.11: stopping nodemanager
no proxyserver to stop
啓動成功後每個節點上會看到對應Hadoop進程,NameNode1主節點上看到的進程如下:
5504 ResourceManager
4912 NameNode
5235 JournalNode
5028 DataNode
5415 DFSZKFailoverController
90 QuorumPeerMain
5628 NodeManager
ResourceManager就是Yarn資源調度的進程。NameNode是HDFS的NameNode主節點。
JournalNode是JournalNode節點。DataNode是HDFS的DataNode從節點和數據節點。DFSZKFailoverController是Hadoop中HDFS NameNode HA實現的中心組件,它負責整體的故障轉移控制等。它是一個守護進程,通main()方法啓動,繼承自ZKFailoverController。QuorumPeerMain是zookeeper的進程。NodeManager是Yarn在每臺服務器上的節點管理器,是運行在單個節點上的代理,它管理Hadoop集羣中單個計算節點,功能包括與ResourceManager保持通信,管理Container的生命週期、監控每個Container的資源使用(內存、CPU等)情況、追蹤節點健康狀況、管理日誌和不同應用程序用到的附屬服務等。
NameNode2主節點2上的進程如下:
27232 NameNode
165 QuorumPeerMain
27526 DFSZKFailoverController
27408 JournalNode
27313 DataNode
27638 NodeManager
會少很多進程,因爲做主節點的HA,也會有一個NameNode進程,如果沒有,說明這個節點的NameNode掛了,我們需要重啓它。並需要查看掛掉的原因。
下面是其中一臺DataNode上的進程,沒有NameNode進程了:
114 QuorumPeerMain
17415 JournalNode
17320 DataNode
17517 NodeManager
除了我們能看到集羣每個節點的進程,並且根據進程就能判斷哪個集羣節點是不是有問題。但不是很方便,需要每臺服務器逐個來看。Hadoop提供了Web界面,非常方便查看集羣的狀況。一個是Yarn的Web界面,在ResourceManager進程在的哪臺機器上訪問,也就是Yarn的主進程,訪問地址是http://namenodeip:8088/,端口是8088,當然這個是默認端,可以通過配置文件來改,不過一般不和其它端口衝突的話,是不需要的改的。看另一個是兩個NameNode的Web界面,端口是50070,能非常方便查看HDFS集羣狀態,總空間、使用空間、剩餘空間,每臺服務器節點情況一目瞭然。訪問地址是:http://namenodeip:50070/
我們來看下這兩個界面:
Yarn的Web界面如圖3.1所示:
圖3.1 Yarn的Web界面截圖






















































































































































































































































































































































































































































































































圖3.1 Yarn的Web界面截圖

NameNode的Web界面如圖3.2所示:
圖3.2 NameNode的Web界面截圖

圖3.2 NameNode的Web界面截圖

三.Hadoop常用操作

Hadoop操作命令主要分Hadoop集羣啓動維護、HDFS文件操作命令、Yarn資源調度相關命令,我們分別來講一下。
1.Hadoop集羣啓動維護
#整體啓動Hadoop集羣:
start-all.sh
#整體停止Hadoop集羣:
stop-all.sh
#單獨啓動namenode服務:
hadoop-daemon.sh start namenode
#單獨啓動datanode服務:
hadoop-daemon.sh start datanode
#在某臺機器上單獨啓動nodemanager服務:
yarn-daemon.sh start nodemanager
#單獨啓動historyserver
mr-jobhistory-daemon.sh start historyserver
2.HDFS文件操作命令
操作使用hadoop dfs或者 hadoop fs都可以,建了簡化操作時間,建議使用hadoop fs。
1)列出HDFS下的文件
hadoop fs -ls /
hadoop fs -ls /ods/kc/dim/ods_kc_dim_product_tab/
2) 查看文件的尾部的記錄
hadoop fs -tail /ods/kc/dim/ods_kc_dim_product_tab/product.txt
3)上傳本地文件到hadoop的hdfs上
hadoop fs -put product.txt /ods/kc/dim/ods_kc_dim_product_tab/
4)把hadoop上的文件下載到本地系統中
hadoop fs -get /ods/kc/dim/ods_kc_dim_product_tab/product.txt product.txt
5)刪除文件和刪除目錄
hadoop fs -rm /ods/kc/dim/ods_kc_dim_product_tab/product.txt
hadoop fs -rmr /ods/kc/dim/ods_kc_dim_product_tab/
6)查看文件
#謹慎使用,尤其當文件內容太長的話。
hadoop fs -cat /ods/kc/dim/ods_kc_dim_product_tab/product.txt
7)建立目錄
hadoop fs -mkdir /ods/kc/dim/ods_kc_dim_product_tab/(目錄/目錄名)
只能一級一級的建目錄,建完一級才能建下一級。如果-mkdir –p價格-p參數會自動把沒有文件夾都創建上。
8)本集羣內複製文件
hadoop fs -cp 源路徑 路徑
9)跨集羣對拷,適合做集羣數據遷移使用
hadoop distcp hdfs://master1/ods/ hdfs://master2/ods/
10)通過Hadoop命令把多個文件的內容合併起來
#hadoop fs -getmerge 位於hdfs中的原文件(裏面有多個文件) 合併後的文件名(本地)
例如:
hadoop fs -getmerge /ods/kc/dim/ods_kc_dim_product_tab/* all.txt
3.Yarn資源調度相關命令
1)application
使用語法:yarn application [options] #打印報告,申請和殺死任務
-appStates #與-list一起使用,可根據輸入的逗號分隔的應用程序狀態列表來過濾應用程序。有效的應用程序狀態可以是以下之一:ALL,NEW,NEW_SAVING,SUBMITTED,ACCEPTED,RUNNING,FINISHED,FAILED,KILLED
-appTypes #與-list一起使用,可以根據輸入的逗號分隔的應用程序類型列表來過濾應用程序。
-list #列出RM中的應用程序。支持使用-appTypes來根據應用程序類型過濾應用程序,並支持使用-appStates來根據應用程序狀態過濾應用程序。
-kill #終止應用程序。
-status #打印應用程序的狀態。
2)applicationattempt
使用語法:yarn applicationattempt [options] #打印應用程序嘗試的報告
-help #幫助
-list #獲取到應用程序嘗試的列表,其返回值ApplicationAttempt-Id 等於
-status #打印應用程序嘗試的狀態。
3)classpath
使用語法:yarn classpath #打印需要得到Hadoop的jar和所需要的lib包路徑
4)container
使用語法:yarn container [options] #打印container(s)的報告
-help #幫助
-list #應用程序嘗試的Containers列表
-status #打印Container的狀態
5)jar
使用語法:yarn jar [mainClass] args… #運行jar文件,用戶可以將寫好的YARN代碼打包成jar文件,用這個命令去運行它。
6)logs
使用語法:yarn logs -applicationId [options] #轉存container的日誌。
-applicationId #指定應用程序ID,應用程序的ID可以在yarn.resourcemanager.webapp.address配置的路徑查看(即:ID)
-appOwner #應用的所有者(如果沒有指定就是當前用戶)應用程序的ID可以在yarn.resourcemanager.webapp.address配置的路徑查看(即:User)
-containerId #Container Id
-help #幫助
-nodeAddress #節點地址的格式:nodename:port (端口是配置文件中:yarn.nodemanager.webapp.address參數指定)
7)node
使用語法:yarn node [options] #打印節點報告
-all #所有的節點,不管是什麼狀態的。
-list #列出所有RUNNING狀態的節點。支持-states選項過濾指定的狀態,節點的狀態包含:NEW,RUNNING,UNHEALTHY,DECOMMISSIONED,LOST,REBOOTED。支持–all顯示所有的節點。
-states #和-list配合使用,用逗號分隔節點狀態,只顯示這些狀態的節點信息。
-status #打印指定節點的狀態。
8)queue
使用語法:yarn queue [options] #打印隊列信息
-help #幫助
-status # 打印隊列的狀態
9)daemonlog
使用語法:
yarn daemonlog -getlevel host:httpport
yarn daemonlog -setlevel host:httpport
-getlevel host:httpport #打印運行在host:port的守護進程的日誌級別。這個命令內部會連接http://host:port/logLevel?log=
-setlevel host:httpport #設置運行在host:port的守護進程的日誌級別。這個命令內部會連接http://host:port/logLevel?log=
10)nodemanager
使用語法:yarn nodemanager #啓動nodemanager
11)proxyserver
使用語法:yarn proxyserver #啓動web proxy server
12)resourcemanager
使用語法:yarn resourcemanager [-format-state-store] #啓動ResourceManager
-format-state-store # RMStateStore的格式. 如果過去的應用程序不再需要,則清理RMStateStore, RMStateStore僅僅在ResourceManager沒有運行的時候,才運行RMStateStore
13)rmadmin
使用語法: #運行Resourcemanager管理客戶端
yarn rmadmin [-refreshQueues]
[-refreshNodes]
[-refreshUserToGroupsMapping]
[-refreshSuperUserGroupsConfiguration]
[-refreshAdminAcls]
[-refreshServiceAcl]
[-getGroups [username]]
[-transitionToActive [–forceactive] [–forcemanual] ]
[-transitionToStandby [–forcemanual] ]
[-failover [–forcefence] [–forceactive] ]
[-getServiceState ]
[-checkHealth ]
[-help [cmd]]
-refreshQueues #重載隊列的ACL,狀態和調度器特定的屬性,ResourceManager將重載mapred-queues配置文件
-refreshNodes #動態刷新dfs.hosts和dfs.hosts.exclude配置,無需重啓NameNode。
#dfs.hosts:列出了允許連入NameNode的datanode清單(IP或者機器名)
#dfs.hosts.exclude:列出了禁止連入NameNode的datanode清單(IP或者機器名)
#重新讀取hosts和exclude文件,更新允許連到Namenode的或那些需要退出或入編的Datanode的集合。
-refreshUserToGroupsMappings #刷新用戶到組的映射。
-refreshSuperUserGroupsConfiguration #刷新用戶組的配置
-refreshAdminAcls #刷新ResourceManager的ACL管理
-refreshServiceAcl #ResourceManager重載服務級別的授權文件。
-getGroups [username] #獲取指定用戶所屬的組。
-transitionToActive [–forceactive] [–forcemanual] #嘗試將目標服務轉爲 Active 狀態。如果使用了–forceactive選項,不需要覈對非Active節點。如果採用了自動故障轉移,這個命令不能使用。雖然你可以重寫–forcemanual選項,你需要謹慎。
-transitionToStandby [–forcemanual] #將服務轉爲 Standby 狀態. 如果採用了自動故障轉移,這個命令不能使用。雖然你可以重寫–forcemanual選項,你需要謹慎。
-failover [–forceactive] #啓動從serviceId1 到 serviceId2的故障轉移。如果使用了-forceactive選項,即使服務沒有準備,也會嘗試故障轉移到目標服務。如果採用了自動故障轉移,這個命令不能使用。
-getServiceState #返回服務的狀態。(注:ResourceManager不是HA的時候,時不能運行該命令的)
-checkHealth #請求服務器執行健康檢查,如果檢查失敗,RMAdmin將用一個非零標示退出。(注:ResourceManager不是HA的時候,時不能運行該命令的)
-help [cmd] #顯示指定命令的幫助,如果沒有指定,則顯示命令的幫助。
14)scmadmin
使用語法:yarn scmadmin [options] #運行共享緩存管理客戶端
-help #查看幫助
-runCleanerTask #運行清理任務
15)sharedcachemanager
使用語法:yarn sharedcachemanager #啓動共享緩存管理器
16)timelineserver
使用語法:yarn timelineserver #啓動timelineserver。



































































































































總結

Hadoop平臺搭建好了,裏面本身是沒有數據的,所以下一步的工作就是建設數據倉庫,而數據庫是以Hive爲主流的。有關Hive的更多內容請點擊下方鏈接閱讀
Hive數據倉庫實戰
此文章還有對應的配套視頻,其它更多精彩文章請大家下載充電了麼app,可獲取千萬免費好課和文章,配套新書教材請看陳敬雷新書:《分佈式機器學習實戰》(人工智能科學與技術叢書)

【新書介紹】
《分佈式機器學習實戰》(人工智能科學與技術叢書)【陳敬雷編著】【清華大學出版社】
新書特色:深入淺出,逐步講解分佈式機器學習的框架及應用配套個性化推薦算法系統、人臉識別、對話機器人等實戰項目

【新書介紹視頻】
分佈式機器學習實戰(人工智能科學與技術叢書)新書【陳敬雷】

視頻特色:重點對新書進行介紹,最新前沿技術熱點剖析,技術職業規劃建議!聽完此課你對人工智能領域將有一個嶄新的技術視野!職業發展也將有更加清晰的認識!

【精品課程】
《分佈式機器學習實戰》大數據人工智能AI專家級精品課程

【免費體驗視頻】:

人工智能百萬年薪成長路線/從Python到最新熱點技術

從Python編程零基礎小白入門到人工智能高級實戰系列課

視頻特色: 本系列專家級精品課有對應的配套書籍《分佈式機器學習實戰》,精品課和書籍可以互補式學習,彼此相互補充,可以大大提高學習效率。課程核心內容包括互聯網公司大數據和人工智能那些事、大數據算法系統架構、大數據基礎、Python編程、Java編程、Scala編程、Docker容器、Mahout分佈式機器學習平臺、Spark分佈式機器學習平臺、分佈式深度學習框架和神經網絡算法、自然語言處理算法、工業級完整系統實戰(推薦算法系統實戰、人臉識別實戰、對話機器人實戰)、就業/面試技巧/職業生涯規劃/職業晉升指導等內容。

【充電了麼公司介紹】

充電了麼App是專注上班族職業培訓充電學習的在線教育平臺。

專注工作職業技能提升和學習,提高工作效率,帶來經濟效益!今天你充電了麼?

充電了麼App官網下載地址
https://a.app.qq.com/o/simple.jsp?pkgname=com.charged.app

功能特色:

【全行業職位】 - 專注職場上班族職業技能提升

【牛人課堂】 - 學習牛人的工作經驗

【精品閱讀】 - 技能文章興趣閱讀

【精短課程】 - 高效學習知識

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章