第2章 大數據處理架構Hadoop
In pioneer days they used oxen for heavy pulling, and when one ox couldn’t budge a log,they didn’t try to grow a larger ox. We shouldn’t be trying for bigger computers, but for more systems of computers.
—Grace Hopper
2.1 Hadoop簡介
2.1.1 Hadoop是什么
Hadoop這個名字不是一個縮寫,它是一個虛構的名字。該項目的創建者,Doug Cutting解釋Hadoop的得名 :“這個名字是我孩子給一個棕黃色的大象玩具命名的。我的命名標准就是簡短,容易發音和拼寫,沒有太多的意義,並且不會被用於別處。小孩子恰恰是這方面的高手”。Hadoop的logo如下。
Hadoop的源頭是Apache Nutch搜索引擎項目。Doug Cutting等人受到Google的GFS和Map/Reduce學術論文啟發,實現MapReduce計算框架並和HDFS(Nutch Distributed File Ssytem)結合,用以支持Nutch引擎的主要算法。2006年2月,Apache Hadoop項目正式啟動以支持MapReduce和HDFS的從Nutch中獨立出來發展。
目前,Hadoop是Apache軟件基金會旗下的一個開源分布式存儲與計算平台。用戶利用Hadoop可以輕松的組織計算機資源,搭建自己的分布式計算平台,充分利用集群的計算和存儲能力,完成海量數據的處理。該平台使用Java實現,具有良好的可移植性。Hadoop的核心包含兩個部分:
- l HDFS(Hadoop Distribute File System),Hadoop分布式文件系統
- l MapReduce計算框架(Google MapReduce的開源實現)
HDFS的高容錯性、高伸縮性等優點允許用戶將Hadoop部署在低廉的硬件上,形成分布式系統。MapReduce分布式編程模型允許用戶在不了解分布式系統底層細節的情況下開發並行應用程序。簡單的說,Hadoop是一個能夠對大量數據進行分布式處理的軟件框架,並且是以一種可靠、高效、可伸縮的方式進行處理的,那它具有哪些特性呢?
- l 高可靠性:采用榮譽數據存儲方式,即使一個副本發生故障,其他副本也可以保證正常對外提供服務。
- l 高效性:作為並行分布式計算平台,Hadoop采用分布式存儲和分布式處理兩大核心技術,能夠高效地處理PB級數據。
- l 高可擴展性:Hadoop的設計目標是可以高效穩定地運行在廉價的計算機集群上,可以擴展到數以千計的計算機節點上。123 1
- l 高容錯性:采用冗余數據存儲方式,自動保存數據的多個副本,並且能夠自動將失敗的任務進行重新分配。
- l 成本低:Hadoop采用廉價的計算機集群,成本較低,普通用戶也很容易用自己的PC搭建Hadoop運行環境。
- l 運行在Linux平台上:Hadoop是基於Java語言開發的,可以較好地運行在Linux平台上。
- l 支持多種編程語言:Hadoop上的應用程序也可以使用其他語言編寫,如C++。
2.1.2 Hadoop生態圈
Hadoop除了其核心的MapReduce和HDFS之外,還包含了很多不可或缺的周邊項目。具體介紹如下:
組件 |
功能 |
HDFS |
分布式文件系統 |
MapReduce |
分布式並行編程模型 |
YARN |
資源管理和調度器 |
Tez |
運行在YARN之上的下一代Hadoop查詢處理框架 |
Hive |
Hadoop上的數據倉庫 |
HBase |
Hadoop上的非關系型的分布式數據庫 |
Pig |
一個基於Hadoop的大規模數據分析平台,提供類似SQL的查詢語言Pig Latin |
Sqoop |
用於在Hadoop與傳統數據庫之間進行數據傳遞 |
Oozie |
Hadoop上的工作流管理系統 |
Zookeeper |
提供分布式協調一致性服務 |
Storm |
流計算框架 |
Flume |
一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸的系統 |
Ambari |
Hadoop快速部署工具,支持Apache Hadoop集群的供應、管理和監控 |
Kafka |
一種高吞吐量的分布式發布訂閱消息系統,可以處理消費者規模的網站中的所有動作流數據 |
Spark |
類似於Hadoop MapReduce的通用並行框架 |
2.1.3 Hadoop體系架構
從前面的內容我們了解到Hadoop是使用計算機集群進行分布式大數據處理的框架,那么這些眾多的計算機應該要怎么管理呢?Hadoop使用主從結構,來了解兩個概念:
NameNode,主節點,只有一個,負責:
1) 接收用戶操作請求
2) 維護文件系統的目錄結構
3) 管理文件與塊之間關系,block與datanode之間關系
DataNodes,從節點,有很多個,負責:
1) 存儲文件
2) 文件被分成block存儲在磁盤上
3) 為保證數據安全,文件會有多個副本
下面將分別介紹兩個核心項目MapReduce和HDFS的體系架構。
1. HDFS架構
在Hadoop中,一個文件會被划分成大小固定的多個文件塊,分布的存儲在集群中的節點中,比如文件a.txt大小600G要存入到HDFS,當前HDFS具有一個NameNode和多個DataNodes,如下圖所示。
同一個文件塊在不同的節點中有多個副本。
而此時我們需要一個集中的地方保存文件的分塊信息,這個地方就是NameNode。如下。
/home/hdfs/a.txt.part1,3,(dn1,dn2,dn3)
/home/hdfs/a.txt.part2,3,(dn2,dn3,dn4)
/home/hdfs/a.txt.part3,3,(dn6,dn11,dn28)
…
2. MapReduce架構 第一行表示a.txt文件總共分為3塊,其中第一塊分別存儲在從節點1、從節點2和從節點3。
MapReduce是一種編程模型,用於大規模數據集的並行計算,同樣也分為主節點和從節點。
JobTracker,主節點,只有一個,負責:
1) 接收客戶提交的計算任務
2) 把計算任務分給TaskTrackers執行
3) 監控TaskTracker的執行情況
TaskTrackers,從節點,只有一個,負責:
1) 執行JobTracker分配的計算任務
示例:
求出以下數組當中最大的數
1,3,23,3,4,18,2,8,10,16,7,5 int Max(int a[], n) { int m=0; for(int i=0; i<n; i++) if(m<a[i]) m=a[i]; return m; }
如果使用MapReduce進行上述計算:將數組分為四個小數組,每個數組里面包含三個數,分別對這四個數組進行比較計算,求取每個數組的最大值,對得到的最大值再次進行比較計算,最終得出原來數組的最大值。
2.2 安裝Hadoop前准備
2.2.1 集群簡介
Hadoop集群具體來說包含兩個集群:HDFS集群和Yarn集群,兩者邏輯上分離,但物理上常在一起。
HDFS集群負責海量數據的存儲,集群中的角色主要有:
NameNode、DataNode、SecondaryNameNode
Yarn集群負責海量數據運算時的資源調度,集群中的角色主要有:
ResourceManager、NodoManager
那MapReduce是什么呢?它其實是一個分布式運算編程框架,是應用程序開發包,由用戶按照編程規范進行程序開發,然后打包運行在HDFS集群上,並且受到Yarn集群的資源調度管理。
Hadoop部署方式分三種:
(1)單機模式:僅一個機器運行一個Java進程,主要用於調試。
(2)偽分布式:主節點和從節點都運行在同一台機器上,主要用於調試
(3)完全分布式:也稱集群模式,主要用於生產環境部署。會使用N台主機組成一個Hadoop集群。這種部署模式下,主節點和從節點會分開部署在不同的機器上。
在本案例中,我們將以3節點為例進行完全分布式搭建,角色分配如下:
01node NameNode DataNode ResourceManager
02node DataNode NodeManager SecondaryNameNode
03node DataNode NodeManager
2.2.2 服務器准備
本案例使用VMware虛擬機創建虛擬服務器來搭建Hadoop集群,所用軟件及版本如下:
VMware Workstation Pro 12.5.7
CentOS 7.0
1. 創建新的虛擬機並配置
1) 創建01node虛擬機,在命令窗口使用管理員用戶:
#su root
2) 手動設置IP地址
由於部署的過程中IP的變動會導致部署過程變得很麻煩,所以在這里我們進行IP地址的手動設置。
設置里面網絡連接更改為vmnet8
Centos7 命令行固定ip配置
准備: 查看本電腦虛擬機的網關
打開VMware軟件,編輯->虛擬網絡編輯器
如果可以點擊更改設置,一定要先點擊,否則改不了。
點擊完的畫面:
從該窗口可以獲得本電腦虛擬機的子網ip段,與子網掩碼。點擊NAT設置,查看網關
電腦網關為192.168.32.2 (通常第三組 每台電腦不同,第四組都是2)
點擊取消,關閉虛擬網絡編輯器。
修改網卡配置
# vi /etc/sysconfig/network-script/ificg-ens33 (這里多數電腦都是ens33,少部分電腦是ensXXXX,可以先輸入ens 后按tab自動補全)
進入后 出現 配置頁面
[vi 編輯器使用tips
命令模式 (在非插入模式輸入:)
w 保存
q 退出
wq 保存並退出
wq! 強制保存並退出
set number 打開行號
set nonumber 關閉行號
$ 跳轉至文本末尾
/xxx 查詢xxx
插入模式
esc 退出插入模式進入
i 進入插入模式
o 換行輸入]
- 修改配置為
bootproto=static onboot=yes //開啟網卡。有同學虛擬機裝好上不了網,把onboot 改為yes 有幾率解決問題。
- 在最后添加 (//后的內容為注釋)
IPADDR=192.168.32.132 // 本機ip地址 NETMASK=255.255.255.0 // 子網掩碼 GATEWAY=192.168.32.2 // 網關,根據開始准備時看的 DNS1=119.29.29.29 //DNS1,DNS2 地址解析服務器,可以用自己的,也可以用這個。只要能解析地址成功即可。 DNS2=8.8.8.8
修改完成后 重啟網絡
#systemctl restart network //其他os 重啟命令自查。
命令行修改固定IP完成。
3) 配置IP、主機名映射
# vi /etc/hosts
1 192.168.11.130 01node 2 192.168.11.131 02node 3 192.168.11.132 03node
4) 關閉防火牆
查看防火牆狀態:
#systemctl status firewalld
關閉防火牆:
#systemctl stop firewalld
開機禁用
#systemctl disable firewalld
5) 安裝JDK
上傳jdk安裝包
如:jdk-8u65-linux-x64.tar.gz
解壓安裝包
#tar zxvf jdk-8u65-linux-x64.tar.gz -C /usr/local
更改jdk目錄名,方便后續使用
#mv jdk1.8.0_65 jdk
配置環境變量:
#vi /etc/profile export JAVA_HOME=/usr/local/jdk export PATH=.:$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
刷新配置
#source /etc/profile
6) 克隆另外兩台主機節點
在主機關閉的情況下選擇克隆,如下圖。
選擇創建完整克隆
修改主機名
7) 設置主機名
#vi /etc/sysconfig/network
修改該文件內容為:
NETWORKING=yes
HOSTNAME=01node
另外兩台主機進行同樣的設置,注意修改主機名。
8) 設置SSH免密碼登陸
免密登陸主要用於主節點免密訪問從節點。
首先生成公私鑰,在01node窗口輸入:
#ssh-keygen -t rsa (四個回車)
執行完這個命令后,會生成id_rsa(私鑰)、id_rsa.pub(公鑰)
將公鑰拷貝到要免密登陸的目標機器上,以03node為例。在01node命令窗口輸入以下命令:
#ssh-copy-id 03node 執行的過程中輸入yes再輸入目標主機的登錄密碼
注意:要給本機拷貝一份,即要使01node能免密登錄01node
驗證是否設置成功,在01node訪問03node:
#ssh 03node 若無需輸入密碼可直接登錄則設置成功
如下所示表示03node登錄成功,要想退出登錄輸入exit即可。
2.3 安裝Hadoop
2.3.1 配置Hadoop
1. 解壓
#tar zxvf hadoop-2.8.4.tar.gz
修改hadoop目錄名稱:
#mv hadoop-2.8.4 hadoop
/usr/local/hadoop/etc/hadoop/
在$HADOOP_HOME/etc/hadoop/目錄下需要配置以下文件。
2. Hadoop-env.sh
export JAVA_HOME=具體的jdk目錄
3. Core-site.xml
在configuration標簽中添加以下變量和值
<!--指定HDFS的訪問地址,9000是端口號--> <property> <name>fs.defaultFS</name> <value>hdfs://01node:9000</value> </property> <!--指定hadoop運行時產生的存儲目錄,默認/tmp/hadoop-{user.name}--> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/hadoop_tmp</value> </property>
4. Hdfs-site.xml
<!--指定hdfs副本的數量--> <property> <name>dfs.replication</name> <value>2</value> </property> <!--指定second節點,即主節點的秘書--> <property> <name>dfs.namenode.secondary.http-address</name> <value>02node:50090</value> </property>
5. Mapred-site.xml
mv mapred-site.xml.template mapred-site.xml vi mapred-site.xml
<!--指定mr運行時框架,這里指定在yarn上,默認是local--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
6. Yarn-site.xml
<!--指定yarn的老大(resourceManager)的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>192.168.11.130</value> </property> <!--nodeManager上運行的附屬服務。需配置成mapreduce_shuffle 才可以運行MAPREDUCE程序默認值--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
7. Slaves
將文件內容修改為:
02node
03node
8. 添加Hadoop環境變量
#vi /etc/profile
添加內容如下:
export HADOOP_HOME=/usr/local/hadoop
export PATH=.:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
刷新配置文件:
#source /etc/profile
9. 使用scp命令同步到其他節點(同步后如果修改一個配置文件,記得修改其他配置文件)
#scp -r /usr/local/hadoop/ root@02node:/usr/local/
-r:遞歸,表示文件夾下所有文件
#scp /etc/profile root@02node:/etc/profile
同樣拷貝jdk到其他節點
刷新配置
#source /etc/profile
注:關於hadoop的配置文件
***-default.xml 這里配置了hadoop默認的配置選項
如果用戶沒有更改 那么這里面的選項將會生效
***-site.xml 這里面配置了用戶需要自定義的選項
site中配置選項優先級>default中的,如果有配置的話就會覆蓋默認的配置選項
2.3.2 啟動Hadoop集群
注意:首次啟動hdfs時,必須對其進行格式化操作。本質上是一些清理和准備工作,因為此時的hdfs在物理上還是不存在的。
#hdfs namenode -format
或者
#hadoop namenode -format
關於hdfs的格式化:
首次啟動需要進行格式化
格式化本質是進行文件系統的初始化操作 創建一些自己所需要的文件
格式化之后 集群啟動成功 后續再也不要進行格式化
格式化的操作在hdfs集群的主角色(NameNode)所在的機器上操作
從usr/local/hadoop/hadoop_tmp/dfs/name/current/下面的version文件中可以查看集群id,格式化時生產的,並且再次格式化會重新生產一個id,所以格式化一次就好,多次格式化會造成啟動不成功。
集群啟動和關閉方法:
#start-all.sh 或start-dfs.sh start-yarn.sh
和
#stop-all.sh 或stop-dfs.sh stop-yarn.sh
使用jps命令查看節點java進程,判斷是否啟動成功
2.3.3 集群Web-ui頁面
一旦hadoop集群啟動並運行,可以通過web-ui進行集群查看,如下所述:
nameNode(hdfs集群) http://nn_host:50070/ 默認 50070
ResourceManager(yarn集群) http://rm_host:8088/ 默認 8088
訪問不到的可以把主機名換成對應IP地址,如在本案例中是:
和