Hadoop是什麼
1)Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。
2)主要解決,海量數據的存儲和海量數據分析計算的問題。
3)廣義上來說,Hadoop通常是指一個更廣泛的概念——Hadoop生態圈。
Hadoop三大發行版本
Hadoop三大發行版本:Apache、Cloudera、Hortonworks。
Apache版本最原始(最基礎)的版本,對於入門學習最好。
Cloudera在大型互聯網企業中用的較多。
Hortonworks文檔較好。
1. Apache Hadoop
官網地址:http://hadoop.apache.org/releases.html
下載地址:https://archive.apache.org/dist/hadoop/common/
2. Cloudera Hadoop
官網地址:https://www.cloudera.com/downloads/cdh/5-10-0.html
下載地址:http://archive-primary.cloudera.com/cdh5/cdh/5/
(1)2008年成立的Cloudera是最早將Hadoop商用的公司,為合作伙伴提供Hadoop的商用解決方案,主要是包括支持、諮詢服務、培訓。
(2)2009年Hadoop的創始人Doug Cutting也加盟Cloudera公司。Cloudera產品主要為CDH,Cloudera Manager,Cloudera Support
(3)CDH是Cloudera的Hadoop發行版,完全開源,比Apache Hadoop在兼容性,安全性,穩定性上有所增強。
(4)Cloudera Manager是集群的軟件分發及管理監控平臺,可以在幾個小時內部署好一個Hadoop集群,並對集群的節點及服務進行實時監控。Cloudera Support即是對Hadoop的技術支持。
(5)Cloudera的標價為每年每個節點4000美元。Cloudera開發並貢獻了可實時處理大數據的Impala項目。
3. Hortonworks Hadoop
官網地址:https://hortonworks.com/products/data-center/hdp/
下載地址:https://hortonworks.com/downloads/#data-platform
(1)2011年成立的Hortonworks是雅虎與硅谷風投公司Benchmark Capital合資組建。
(2)公司成立之初就吸納了大約25名至30名專門研究Hadoop的雅虎工程師,上述工程師均在2005年開始協助雅虎開發Hadoop,貢獻了Hadoop80%的代碼。
(3)雅虎工程副總裁、雅虎Hadoop開發團隊負責人Eric Baldeschwieler出任Hortonworks的首席執行官。
(4)Hortonworks的主打產品是Hortonworks Data Platform(HDP),也同樣是100%開源的產品,HDP除常見的項目外還包括了Ambari,一款開源的安裝和管理系統。
(5)HCatalog,一個元數據管理系統,HCatalog現已集成到Facebook開源的Hive中。Hortonworks的Stinger開創性的極大的優化了Hive項目。Hortonworks為入門提供了一個非常好的,易於使用的沙盒。
(6)Hortonworks開發了很多增強特性並提交至核心主幹,這使得Apache Hadoop能夠在包括Window Server和Windows Azure在內的Microsoft Windows平臺上本地運行。定價以集群為基礎,每10個節點每年為12500美元。
Hadoop的優勢
1)高可靠性:Hadoop底層維護多個數據副本,所以即使Hadoop某個計算元素或存儲出現故障,也不會導致數據的丟失。
2)高擴展性:在集群間分配任務數據,可方便的擴展以千計的節點。
3)高效性:在MapReduce的思想下,Hadoop是並行工作的,以加快任務處理速度。
4)高容錯性:能夠將失敗的任務重新分配。
Hadoop組成
在Hadoop1.X時代,Hadoop中的MapReduce同時處理業務邏輯運算和資源調度,耦合性較大,在Hadoop2.X時代,增加了Yarn。Yarn只負責子資源的調度,MapReduce只負責運算。
HDFS架構概述
HDFS(Hadoop Distributed File System)的架構概述:
1)NameNode(nn):存儲文件的元數據,如文件名,文件目錄結構,文件屬性(生成時間,副本數,文件權限),以及每個文件列表和塊所在的DataNode等。
2)DataNode(dn):在本地文件系統存儲文件塊數據,以及數據的校驗。
3)Secondary NameNode(2nn):用來監控HDFS狀態的輔助後臺程序,每隔一段時間獲取元數據的快照。
Yarn架構概述:
1)ResourceManager作用:
1.處理客戶請求
2.監控NodeManager
3.啟動或監控ApplicationMaster
4.資源的分配和調度
2)NodeManager(NM)的主要作用
1.管理單個節點的資源
2.處理來自ResourceManager的命令
3.處理來自ApplicationMaster的命令
3)ApplicationMaster(AM)作用如下:
1.負責數據的切分
2.為應用程序申請資源並分配內部的任務
3.任務的監控與容錯
4)Container
Container是Yarn中的資源的抽象,它封裝了某個節點上的多維度資源,如內存,cpu,磁盤,網絡等。
工作方式:
(0) Mr 程序提交到客戶端所在的節點。
(1)Yarnrunner 向 Resourcemanager 申請一個 Application。
(2)rm 將該應用程序的資源路徑返回給 yarnrunner。
(3)該程序將運行所需資源提交到 HDFS 上。
(4)程序資源提交完畢後,申請運行 mrAppMaster。
(5)RM 將用戶的請求初始化成一個 task。
(6)其中一個 NodeManager 領取到 task 任務。
(7)該 NodeManager 創建容器 Container,併產生 MRAppmaster。
(8)Container 從 HDFS 上拷貝資源到本地。
(9)MRAppmaster 向 RM 申請運行 maptask 資源。
(10)RM 將運行 maptask 任務分配給另外兩個 NodeManager,另兩個 NodeManager 分
別領取任務並創建容器。
(11)MR 向兩個接收到任務的 NodeManager 發送程序啟動腳本,這兩個 NodeManager
分別啟動 maptask,maptask 對數據分區排序。
(12)MrAppMaster 等待所有 maptask 運行完畢後,向 RM 申請容器,運行 reduce task。
(13)reduce task 向 maptask 獲取相應分區的數據。
(14)程序運行完畢後,MR 會向 RM 申請註銷自己。
MapReduce架構概述:
MapReduce將計算過程分為兩個階段:Map和Reduce。
1)Map階段並行處理輸入數據
2)Reduce階段對Map結果進行彙總
Hadoop運行環境搭建
虛擬機:hadoop101,關閉防火牆。
創建用戶,hadoop:
<code>useradd hadoop passwd hadoop/<code>
配置hadoop用戶具有root權限:
<code>chmod -v u+w /etc/sudoers #給這個文件添加寫權限 vi /etc/sudoers #修改 sudoers ## Allow root to run any commands anywhereroot ALL=(ALL) ALLsss ALL=(ALL) ALL (添加這一行)/<code>
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL (添加這一行)
保存,退出
<code>chmod -v u-w /etc/sudoers #刪除 sudoers 的寫的權限/<code>
在/opt目錄下創建文件夾
在/opt目錄下創建module、software文件夾:
<code>sudo mkdir module sudo mkdir software/<code>
修改module、software文件夾的所有者:
<code>sudo chown hadoop:hadoop module/ software//<code>
安裝JDK:
1.卸載現有JDK
(1)查詢是否安裝Java軟件:
<code>rpm -qa | grep java/<code>
(2)如果安裝的版本低於1.7,卸載該JDK:
<code>sudo rpm -e 軟件包/<code>
(3)查看JDK安裝路徑:
<code>which java/<code>
2.將安裝包導入software目錄下:
<code>cd software/ ls hadoop-2.7.2.tar.gz jdk-8u144-linux-x64.tar.gz/<code>
3.解壓JDK到/opt/module目錄下
<code>tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module//<code>
4. 配置JDK環境變量
<code>sudo vi /etc/profile/<code>
在文件末尾添加:
<code>#JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_144 export PATH=$PATH:$JAVA_HOME/bin/<code>
<code>source /etc/profile #讓修改後的文件生效/<code>
安裝Hadoop
Hadoop下載地址:
https://archive.apache.org/dist/hadoop/common/hadoop-2.7.2/
1. 將hadoop-2.7.2.tar.gz導入到opt目錄下面的software文件夾下面
2.將Hadoop安裝包解壓到到/opt/module下面
<code> tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module//<code>
3.將Hadoop添加到環境變量:
<code>sudo vi /etc/profile/<code>
文件末尾添加:
<code>##HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-2.7.2 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin/<code>
使配置生效:
<code>source /etc/profile/<code>
4. 重啟(如果Hadoop命令不能用再重啟)
Hadoop目錄結構
(1)bin目錄:存放對Hadoop相關服務(HDFS,YARN)進行操作的腳本
(2)etc目錄:Hadoop的配置文件目錄,存放Hadoop的配置文件
(3)lib目錄:存放Hadoop的本地庫(對數據進行壓縮解壓縮功能)
(4)sbin目錄:存放啟動或停止Hadoop相關服務的腳本
(5)share目錄:存放Hadoop的依賴jar包、文檔、和官方案例
Hadoop運行模式
Hadoop運行模式包括:本地模式、偽分佈式模式以及完全分佈式模式。
本地運行模式
官方Grep案例
1. 創建在hadoop-2.7.2文件下面創建一個input文件夾
<code> mkdir input/<code>
2. 將Hadoop的xml配置文件複製到input
<code> cp etc/hadoop/*.xml input/<code>
3. 執行share目錄下的MapReduce程序
<code> bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'/<code>
4. 查看輸出結果
<code> cat output/*/<code>
官方WordCount案例
1. 創建在hadoop-2.7.2文件下面創建一個wcinput文件夾
<code> mkdir wcinput/<code>
2. 在wcinput文件下創建一個wc.input文件
<code>cd wcinput touch wc.input/<code>
3. 編輯wc.input文件
<code>vi wc.input/<code>
在文件中輸入如下內容
<code>hadoop yarn hadoop mapreduce atguigu atguigu/<code>
保存退出::wq
4. 回到Hadoop目錄/opt/module/hadoop-2.7.2
5. 執行程序
<code>hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput/<code>
6. 查看結果
<code>cat wcoutput/part-r-00000/<code>
<code>atguigu 2 hadoop 2 mapreduce 1 yarn 1/<code>
偽分佈式運行模式
啟動HDFS並運行MapReduce程序
1. 分析
(1)配置集群
(2)啟動、測試集群增、刪、查
(3)執行WordCount案例
2. 執行步驟
(1)配置集群
(a)配置:hadoop-env.sh
Linux系統中獲取JDK的安裝路徑:
<code>echo $JAVA_HOME /opt/module/jdk1.8.0_144/<code>
修改hadoop-env.sh中的JAVA_HOME 路徑:
<code>export JAVA_HOME=/opt/module/jdk1.8.0_144/<code>
(b)配置:core-site.xml
<code> fs.defaultFS hdfs://hadoop101:9000 hadoop.tmp.dir /opt/module/hadoop-2.7.2/data/tmp /<code>
(c)配置:hdfs-site.xml
<code> dfs.replication 1 /<code>
(2)啟動集群
(a)格式化NameNode(第一次啟動時格式化,以後就不要總格式化)
<code> bin/hdfs namenode -format/<code>
(b)啟動NameNode
<code>sbin/hadoop-daemon.sh start namenod/<code>
(c)啟動DataNode
<code>sbin/hadoop-daemon.sh start datanode/<code>
(3)查看集群
(a)查看是否啟動成功
<code>jps/<code>
<code>13586 NameNode 13668 DataNode 13786 Jps/<code>
注意:jps是JDK中的命令,不是Linux命令。不安裝JDK不能使用jps
(b)web端查看HDFS文件系統
http://hadoop101:50070/dfshealth.html#tab-overview
如不能訪問,可參考以下幾個方案。
查看vi /etc/selinux/config的配置改成SELINUX=disabled是否關閉了防火牆查看你的$HADOOP_HOME/etc/hadoop下的core-site.xml和hdfs-site.xml是否配置好查看你windows裡本地的配置文件的IP和主機名映射關係必須在hadoop-env.sh文件中設置Java的絕對路徑(c)查看產生的Log日誌
當前目錄:/opt/module/hadoop-2.7.2/logs
(d)思考:為什麼不能一直格式化NameNode,格式化NameNode,要注意什麼?
<code>cd data/tmp/dfs/name/current/ cat VERSION clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837/<code>
注意:格式化NameNode,會產生新的集群id,導致NameNode和DataNode的集群id不一致,集群找不到以往數據。所以,格式NameNode時,一定要先刪除data數據和log日誌,然後再格式化NameNode。
(4)操作集群
(a)在HDFS文件系統上創建一個input文件夾
<code>bin/hdfs dfs -mkdir -p /user/hadoop/input/<code>
(b)將測試文件內容上傳到文件系統上
<code>bin/hdfs dfs -put wcinput/wc.input /user/hadoop/input//<code>
(c)查看上傳的文件是否正確
<code>bin/hdfs dfs -ls /user/hadoop/input/ bin/hdfs dfs -cat /user/hadoop/ input/wc.input/<code>
(d)運行MapReduce程序
<code>bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/hadoop/input/ /user/hadoop/output/<code>
(e)查看輸出結果
<code>bin/hdfs dfs -cat /user/hadoop/output/*/<code>
(f)將測試文件內容下載到本地
<code>hdfs dfs -get /user/hadoop/output/part-r-00000 ./wcoutput//<code>
(g)刪除輸出結果
<code>hdfs dfs -rm -r /user/hadoop/output/<code>
啟動YARN並運行MapReduce程序
1. 分析
(1)配置集群在YARN上運行MR
(2)啟動、測試集群增、刪、查
(3)在YARN上執行WordCount案例
2. 執行步驟
(1)配置集群
(a)配置yarn-env.sh
配置一下JAVA_HOME:
<code>export JAVA_HOME=/opt/module/jdk1.8.0_144/<code>
b)配置yarn-site.xml
<code> yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname hadoop101 /<code>
c)配置:mapred-env.sh
配置一下JAVA_HOME
<code>export JAVA_HOME=/opt/module/jdk1.8.0_144/<code>
d)配置: (對mapred-site.xml.template重新命名為) mapred-site.xml
<code>mv mapred-site.xml.template mapred-site.xml vi mapred-site.xml/<code>
<code> mapreduce.framework.name yarn /<code>
(2)啟動集群
(a)啟動前必須保證NameNode和DataNode已經啟動
(b)啟動ResourceManager
<code>sbin/yarn-daemon.sh start resourcemanager/<code>
(c)啟動NodeManager
<code>sbin/yarn-daemon.sh start nodemanager/<code>
(3)集群操作
(a)YARN的瀏覽器頁面查看
http://hadoop101:8088/cluster
(b)刪除文件系統上的output文件
<code>bin/hdfs dfs -rm -R /user/hadoop/output/<code>
(c)執行MapReduce程序
<code>bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/hadoop/input /user/hadoop/output/<code>
(d)查看運行結果
<code>bin/hdfs dfs -cat /user/hadoop/output/*/<code>
配置歷史服務器
為了查看程序的歷史運行情況,需要配置一下歷史服務器。具體配置步驟如下:
1. 配置mapred-site.xml
<code>vi mapred-site.xml/<code>
在該文件裡面增加如下配置。
<code> mapreduce.jobhistory.address hadoop101:10020 mapreduce.jobhistory.webapp.address hadoop101:19888 /<code>
2. 啟動歷史服務器
<code>sbin/mr-jobhistory-daemon.sh start historyserver/<code>
3. 查看歷史服務器是否啟動
<code>jps/<code>
4. 查看JobHistory
http://hadoop101:19888/jobhistory
配置日誌的聚集
日誌聚集概念:應用運行完成以後,將程序運行日誌信息上傳到HDFS系統上。
日誌聚集功能好處:可以方便的查看到程序運行詳情,方便開發調試。
注意:開啟日誌聚集功能,需要重新啟動NodeManager 、ResourceManager和HistoryManager。
開啟日誌聚集功能具體步驟如下:
1. 配置yarn-site.xml
<code>vi yarn-site.xml/<code>
在該文件裡面增加如下配置。
<code> yarn.log-aggregation-enable true yarn.log-aggregation.retain-seconds 604800 /<code>
2. 關閉NodeManager 、ResourceManager和HistoryServer
<code>sbin/yarn-daemon.sh stop resourcemanager sbin/yarn-daemon.sh stop nodemanager sbin/mr-jobhistory-daemon.sh stop historyserver/<code>
3. 啟動NodeManager 、ResourceManager和HistoryServer
<code>sbin/yarn-daemon.sh start resourcemanager sbin/yarn-daemon.sh start nodemanager sbin/mr-jobhistory-daemon.sh start historyserver/<code>
4.刪除HDFS上已經存在的輸出文件
<code>bin/hdfs dfs -rm -R /user/hadoop/output/<code>
5. 執行WordCount程序
<code>hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/hadoop/input /user/hadoop/output/<code>
6. 查看日誌
http://hadoop101:19888/jobhistory
配置文件說明
Hadoop配置文件分兩類:默認配置文件和自定義配置文件,只有用戶想修改某一默認配置值時,才需要修改自定義配置文件,更改相應屬性值。
(1)默認配置文件:
(2)自定義配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四個配置文件存放在$HADOOP_HOME/etc/hadoop這個路徑上,用戶可以根據項目需求重新進行修改配置。
完全分佈式運行模式
主要步驟:
1)準備3臺客戶機(關閉防火牆、靜態ip、主機名稱)hadoop102,hadoop103,hadoop104
2)安裝JDK
3)配置環境變量
4)安裝Hadoop
5)配置環境變量
6)配置集群
7)單點啟動
8)配置ssh
9)群起並測試集群
將hadoop102,hadoop103,hadoop104安裝JDK和Hadoop並配置環境變量。
集群部署規劃:
(1)首先配置Hadoop102的配置文件,再分發配置文件到其他節點。
<code>vi core-site.xml/<code>
在該文件中編寫如下配置
<code> fs.defaultFS hdfs://hadoop102:9000 hadoop.tmp.dir /opt/module/hadoop-2.7.2/data/tmp /<code>
(2)HDFS配置文件
配置hadoop-env.sh
<code>vi hadoop-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144/<code>
配置hdfs-site.xml
<code> vi hdfs-site.xml/<code>
在該文件中編寫如下配置
<code> dfs.replication 3 dfs.namenode.secondary.http-address hadoop104:50090 /<code>
(3)YARN配置文件
配置yarn-env.sh
<code>vi yarn-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144/<code>
配置yarn-site.xml
<code>vi yarn-site.xml/<code>
在該文件中增加如下配置
<code> yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname hadoop103 /<code>
(4)MapReduce配置文件
配置mapred-env.sh
<code>vi mapred-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144/<code>
配置mapred-site.xml
<code>cp mapred-site.xml.template mapred-site.xml vi mapred-site.xml/<code>
在該文件中增加如下配置
<code> mapreduce.framework.name yarn /<code>
在集群上分發配置好的Hadoop配置文件
利用rsync命令分發。
集群單點啟動
如果集群是第一次啟動,需要格式化NameNode
<code>hdfs namenode -format/<code>
在hadoop102上啟動NameNode
<code>hadoop-daemon.sh start namenode/<code>
在hadoop102、hadoop103以及hadoop104上分別啟動DataNode
<code>hadoop-daemon.sh start datanode/<code>
SSH無密登錄配置
再生成公鑰和私鑰:
<code>ssh-keygen -t rsa/<code>
然後敲(三個回車),就會生成兩個文件id_rsa(私鑰)、id_rsa.pub(公鑰)
將公鑰拷貝到要免密登錄的目標機器上
<code>ssh-copy-id hadoop102 ssh-copy-id hadoop103 ssh-copy-id hadoop104/<code>
注意:
還需要在hadoop103上採用hadoop賬號,配置一下無密登錄到hadoop102、hadoop103、hadoop104;
還需要在hadoop104上採用hadoop賬號配置一下無密登錄到hadoop102、hadoop103、hadoop104服務器上。
.ssh文件夾下(~/.ssh)的文件功能解釋
known_hosts:記錄ssh訪問過計算機的公鑰(public key)
id_rsa:生成的私鑰
id_rsa.pub:生成的公鑰
authorized_keys:存放授權過的無密登錄服務器公鑰
群起集群
配置slaves,進入/opt/module/hadoop-2.7.2/etc/hadoop/slaves目錄下
<code>vi slaves/<code>
在該文件中增加如下內容:
<code>hadoop102 hadoop103 hadoop104/<code>
注意:該文件中添加的內容結尾不允許有空格,文件中不允許有空行。
同步所有節點配置文件。
啟動集群
(1)如果集群是第一次啟動,需要格式化NameNode(注意格式化之前,一定要先停止上次啟動的所有namenode和datanode進程,然後再刪除data和log數據)
<code>bin/hdfs namenode -format/<code>
(2)啟動HDFS
<code>sbin/start-dfs.sh/<code>
(3)啟動YARN
<code>sbin/start-yarn.sh/<code>
注意:NameNode和ResourceManger如果不是同一臺機器,不能在NameNode上啟動 YARN,應該在ResouceManager所在的機器上啟動YARN。
(4)Web端查看SecondaryNameNode
(a)瀏覽器中輸入:http://hadoop104:50090/status.html
(b)查看SecondaryNameNode信息
集群啟動/停止方式總結
1. 各個服務組件逐一啟動/停止
(1)分別啟動/停止HDFS組件
<code>hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode/<code>
(2)啟動/停止YARN
<code>yarn-daemon.sh start / stop resourcemanager / nodemanager/<code>
2. 各個模塊分開啟動/停止(配置ssh是前提)常用
(1)整體啟動/停止HDFS
<code>start-dfs.sh / stop-dfs.sh/<code>
(2)整體啟動/停止YARN
<code>start-yarn.sh / stop-yarn.sh/<code>