hadoop(2.6)集群搭建
- 2019 年 10 月 6 日
- 筆記
軟體包下載
http://mirrors.hust.edu.cn/apache/hadoop/common/
Hadoop是什麼
Hadoop是Lucene創始人Doug Cutting,根據Google的相關內容山寨出來的分散式文件系統和對海量數據進行分析計算的基礎框架系統,其中包含MapReduce程式,hdfs系統等。
網方網站:http://hadoop.apache.org/
Hadoop是一個由Apache基金會所開發的分散式系統基礎架構。

各版本下載:
http://hadoop.apache.org/releases.html

hadoop基於java開發的。
Hadoop包括兩大核心,分散式存儲系統和分散式計算系統。
Map/Reduce: 分散式計算」框架」
HDFS: 分散式文件系統
分散式存儲
為什麼數據需要存儲在分散式的系統中哪,難道單一的電腦存儲不了嗎,難道現在的幾個TB的硬碟裝不下這些數據嗎?事實上,確實裝不下。比如,很多的電信通話記錄就存儲在很多台伺服器的很多硬碟中。那麼,要處理這麼多數據,必須從一台一台伺服器分別讀取數據和寫入數據,太麻煩了!
我們希望有一種文件系統,可以管轄很多伺服器用於存儲數據。通過這個文件系統存儲數據時,感覺不到是存儲到不同的伺服器上的。當讀取數據時,感覺不到是從不同的伺服器上讀取。
如圖:這就是分散式文件系統。

分散式文件系統管理的是一個伺服器集群。在這個集群中,數據存儲在集群的節點(即集群中的伺服器)中,但是該文件系統把伺服器的差異屏蔽了。那麼,我們就可以像使用普通的文件系統一樣使用,但是數據卻分散在不同的伺服器中。
命名空間(namespace):在分散式存儲系統中,分散在不同節點中的數據可能屬於同一個文件,為了組織眾多的文件,把文件可以放到不同的文件夾中,文件夾可以一級一級的包含。我們把這種組織形式稱為命名空間(namespace)。命名空間管理著整個伺服器集群中的所有文件。命名空間的職責與存儲真實數據的職責是不一樣的。
負責命名空間職責的節點稱為主節點(master node),負責存儲真實數據職責的節點稱為從節點(slave node)。
主/從節點:主節點負責管理文件系統的文件結構,從節點負責存儲真實的數據,稱為主從式結構(master-slaves)。
用戶操作時,也應該先和主節點打交道,查詢數據在哪些從節點上存儲,然後再從從節點讀取。在主節點,為了加快用戶訪問的速度,會把整個命名空間資訊都放在記憶體中,當存儲的文件越多時,那麼主節點就需要越多的記憶體空間。
block:在從節點存儲數據時,有的原始數據文件可能很大,有的可能很小,大小不一的文件不容易管理,那麼可以抽象出一個獨立的存儲文件單位,稱為塊(block)。
容災:數據存放在集群中,可能因為網路原因或者伺服器硬體原因造成訪問失敗,最好採用副本(replication)機制,把數據同時備份到多台伺服器中,這樣數據就安全了,數據丟失或者訪問失敗的概率就小了。
工作流程圖:

總結:
在以上的主從式結構中,由於主節點含有整個文件系統的目錄結構資訊,因為非常重要。另外,由於主節點運行時會把命名空間資訊都放到記憶體中,因此存儲的文件越多,主節點的記憶體就需要的越多。
在hadoop中,分散式存儲系統稱為HDFS(hadoop distributed file system)。其中,主節點稱為名位元組點(namenode),從節點稱為數據節點(datanode)。
分散式計算:
對數據進行處理時,我們會把數據讀取到記憶體中進行處理。如果我們對海量數據進行處理,比如數據大小是100GB,我們要統計文件中一共有多少個單詞。要想把數據都載入到記憶體中幾乎是不可能的,稱為移動數據。
那麼是否可以把程式程式碼放到存放數據的伺服器上哪?因為程式程式碼與原始數據相比,一般很小,幾乎可以忽略的,所以省下了原始數據傳輸的時間了。現在,數據是存放在分散式文件系統中,100GB的數據可能存放在很多的伺服器上,那麼就可以把程式程式碼分發到這些伺服器上,在這些伺服器上同時執行,也就是並行計算,也是分散式計算。這就大大縮短了程式的執行時間。我們把程式程式碼移動到數據節點的機器上執行的計算方式稱為移動計算。
分散式計算需要的是最終的結果,程式程式碼在很多機器上並行執行後會產生很多的結果,因此需要有一段程式碼對這些中間結果進行匯總。Hadoop中的分散式計算一般是由兩階段完成的。第一階段負責讀取各數據節點中的原始數據,進行初步處理,對各個節點中的數據求單詞數。然後把處理結果傳輸到第二個階段,對中間結果進行匯總,產生最終結果,求出100GB文件總共有多少個單詞,如圖所示:

在hadoop中,分散式計算部分稱為MapReduce。
MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算。概念"Map(映射)"和"Reduce(歸約)",和它們的主要思想,都是從函數式程式語言里借來的,還有從矢量程式語言里借來的特性。它極大地方便了編程人員在不會分散式並行編程的情況下,將自己的程式運行在分散式系統上。
在分散式計算過程中有以下角色:
主節點稱為作業節點(jobtracker),
從節點稱為任務節點(tasktracker)。
在任務節點中,運行第一階段的程式碼稱為map任務(map task),運行第二階段的程式碼稱為reduce任務(reduce task)。
task :任務 ,tracker ,跟蹤器
關於hadoop的名詞解釋
(1)Hadoop:Apache開源的分散式框架。
(2)HDFS:Hadoop的分散式文件系統。
(3)NameNode:Hadoop HDFS元數據主節點伺服器,負責保存DataNode 文件存儲元數據資訊,這個伺服器是單點的。
(4)JobTracker:Hadoop的Map/Reduce調度器,負責與TaskTracker通訊分配計算任務並跟蹤任務進度,這個伺服器也是單點的。
(5)DataNode:Hadoop數據節點,負責存儲數據。
(6)TaskTracker:Hadoop調度程式,負責Map,Reduce任務的啟動和執行。
註:Namenode記錄著每個文件中各個塊所在的數據節點的位置資訊
實戰:搭建Hadoop集群:
實驗環境
安裝前,3台虛擬機IP及機器名稱如下:
主機名 IP地址 角色
Docker-01 172.17.120.50 NameNode
Docker-02 172.17.120.51 DataNode1
Docker-03 172.17.120.52 DataNode2
實驗前期環境準備:
三台機器上配置hosts文件,如下:
[root@docker-01 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.17.120.50 docker-01
172.17.120.51 docker-02
172.17.120.52 docker-03
複製hosts到其它兩機器:
[root@docker-01 ~]# scp /etc/hosts [email protected]:/etc/hosts
[root@docker-01 ~]# scp /etc/hosts [email protected]:/etc/hosts
三台機器都要創建運行hadoop用戶帳號和Hadoop目錄。 盡量不用root帳號運行
[root@docker-01 ~]# useradd -u 8000 hadoop #為了保障,在其它伺服器上創建的hadoop用戶ID保持一致,創建時,盡量把UID調大
[root@docker-01 ~]# echo 123456 | passwd –stdin hadoop
配置在docker-01上,可以ssh無密碼登錄機器docker-01,docker-02,docker-03 ,方便後期複製文件和啟動服務。因為namenode啟動時,會連接到datanode上啟動對應的服務。
[root@docker-01 ~]# su – hadoop
上一次登錄:四 8月 29 21:40:58 CST 2019pts/0 上
[hadoop@docker-01 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
導入公鑰到其他datanode節點認證文件
[hadoop@docker-01 ~]$ ssh-copy-id 172.17.120.51
[hadoop@docker-01 ~]$ ssh-copy-id 172.17.120.52
配置Hadoop環境,安裝Java環境JDK:三台機器上都要配置
[root@docker-01 opt]# tar -xzvf jdk-8u91-linux-x64.tar.gz
[root@docker-01 opt]# mv jdk1.8.0_91/ jdk
[root@docker-01 local]# mv /opt/jdk /usr/local/
[root@docker-01 local]# vim /etc/profile #在文件的最後添加以下內容:
exportJAVA_HOME=/usr/local/jdk
exportJRE_HOME=/usr/local/jdk/jre
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
[root@docker-01 local]# source /etc/profile #使配置文件生效
驗證java運行環境是否安裝成功:
[root@docker-01 local]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
將jdk部署到其它兩台機器上:
[root@docker-01 local]# scp jdk/ [email protected]:/usr/local/
[root@docker-01 local]# scp jdk/ [email protected]:/usr/local/
[root@docker-01 local]# scp /etc/profile 172.17.120.51:/etc/profile
[root@docker-01 local]# scp /etc/profile 172.17.120.52:/etc/profile
三台都執行重新參加java運行環境:
[root@docker-01 local]# source /etc/profile
[root@docker-02 ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
在docker-01安裝Hadoop 並配置成namenode主節點
Hadoop安裝目錄:/home/hadoop/hadoop-2.6.0
使用root帳號將hadoop-2.6.0.tar.gz 上傳到伺服器
三台機器都執行創建hadoop相關的工作目錄
[root@docker-02 ~]# mkdir -p /home/hadoop/dfs/name /home/hadoop/dfs/data /home/hadoop/tmp
配置Hadoop:需要修改7個配置文件。
文件位置:/home/hadoop/hadoop-2.6.0/etc/hadoop/
文件名稱:hadoop-env.sh、yarn-evn.sh、slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
1、配置文件hadoop-env.sh,指定hadoop的java運行環境
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/hadoop-env.sh
改:27 export JAVA_HOME=${JAVA_HOME}
為:export JAVA_HOME=/usr/java/jdk
註:指定java運行環境變數
2、配置文件yarn-env.sh,指定yarn框架的java運行環境
該文件是yarn框架運行環境的配置,同樣需要修改java虛擬機的位置。
yarn :Hadoop 的新MapReduce 框架Yarn是Hadoop 自0.23.0 版本後新的map-reduce 框架(Yarn) 原理。
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/yarn-env.sh
改:26 JAVA_HOME=$JAVA_HOME
為:26 JAVA_HOME=/usr/java/jdk
3、配置文件slaves ,指定datanode 數據存儲伺服器
將所有DataNode的機器名字寫入此文件中,每個主機名一行,配置如下:
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/slaves
docker-02
docker-03
4、配置文件core-site.xml,指定訪問hadoop web介面訪問路徑
這個是hadoop的核心配置文件,這裡需要配置的就這兩個屬性,fs.default.name配置了hadoop的HDFS系統的命名,位置為主機的9000埠;
hadoop.tmp.dir配置了hadoop的tmp目錄的根位置。這裡使用了一個文件系統中沒有的位置,所以要先用mkdir命令新建一下。
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/core-site.xml
改:
19 <configuration>
20 </configuration>
註:在<configuration>和</configuration>中間插入以一下紅色和藍色標記內容:
為:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://docker-01:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
註:property 財產
5、配置文件hdfs-site.xml
這個是hdfs的配置文件,dfs.http.address配置了hdfs的http的訪問位置;
dfs.replication配置了文件塊的副本數,一般不大於從機的個數。
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/hdfs-site.xml
改:19 <configuration>
20
21 </configuration>
註:在<configuration>和</configuration>中間插入以一下紅色和藍色標記內容:
為:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>docker-01:9001</value> # 通過web介面來查看HDFS狀態
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value> #每個Block有2個備份。
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
註:
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>docker-01:9001</value> # 通過web介面來查看HDFS狀態
</property>
<property>
<name>dfs.replication</name>
<value>2</value> #每個Block有2個備份。
</property>
6、配置文件mapred-site.xml,
這個是mapreduce任務的配置,由於hadoop2.x使用了yarn框架,所以要實現分散式部署,必須在mapreduce.framework.name屬性下配置為yarn。mapred.map.tasks和mapred.reduce.tasks分別為map和reduce的任務數,
同時指定:Hadoop的歷史伺服器historyserver
Hadoop自帶了一個歷史伺服器,可以通過歷史伺服器查看已經運行完的Mapreduce作業記錄,比如用了多少個Map、用了多少個Reduce、作業提交時間、作業啟動時間、作業完成時間等資訊。默認情況下,Hadoop歷史伺服器是沒有啟動的,我們可以通過下面的命令來啟動Hadoop歷史伺服器
$ sbin/mr-jobhistory-daemon.sh start historyserver
這樣我們就可以在相應機器的19888埠上打開歷史伺服器的WEB UI介面。可以查看已經運行完的作業情況。
生成mapred-site.xml
[root@docker-01 local]# cp /home/hadoop/hadoop-2.6.5/etc/hadoop/mapred-site.xml.template /home/hadoop/hadoop-2.6.5/etc/hadoop/mapred-site.xml
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/mapred-site.xml
改:19 <configuration>
20
21 </configuration>
註:在<configuration>和</configuration>中間插入以一下紅色和藍色標記內容:
為:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>docker-01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>docker-01:19888</value>
</property>
</configuration>
7、配置節點yarn-site.xml
該文件為yarn框架的配置,主要是一些任務的啟動位置
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/yarn-site.xml
# 修改configuration內容如下:
改:
<configuration>
<!– Site specific YARN configuration properties –>
</configuration>
註:在<configuration>和</configuration>中間插入以一下紅色和藍色標記內容:
為:
<configuration>
<!– Site specific YARN configuration properties –>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>docker-01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>docker-01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>docker-01:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>docker-01:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>docker-01:8088</value>
</property>
</configuration>
複製到其他datanode節點: docker-02和docker-03
[root@docker-01 local]# scp -r /home/hadoop/hadoop-2.2.0 hadoop@docker01:~/
[root@docker-01 local]# scp -r /home/hadoop/hadoop-2.2.0 hadoop@docker02:~/
三台機器修改許可權,切換用戶
[hadoop@docker-01 ~]$ chown -R hadoop:hadoop /home/hadoop/*
[hadoop@docker-01 ~]$ su – hadoop
在docker-01上啟動Hadoop
切換到hadoop用戶
(3)格式化
hadoop namenode的初始化,只需要第一次的時候初始化,之後就不需要了
[hadoop@docker-01 ~]$ /home/hadoop/hadoop-2.6.5/bin/hdfs namenode -format
[hadoop@docker-01 ~]$ echo $?
0
查看格式化後,生成的文件:
[hadoop@docker-01 ~]$ tree /home/hadoop/dfs/
/home/hadoop/dfs/
├── data
└── name
├── current
│ ├── fsimage_0000000000000000000
│ ├── fsimage_0000000000000000000.md5
│ ├── seen_txid
│ └── VERSION
└── in_use.lock
3 directories, 5 files
生成基於hadoop用戶的不輸入密碼登錄:因為後期使用hadoop用戶啟動datanode節點使用需要直接登錄到對應的伺服器上啟動datanode相關服務。
[hadoop@docker-01 ~]$ ssh-keygen
[hadoop@docker-01 ~]$ ssh-copy-id 172.17.120.50
[hadoop@docker-01 ~]$ ssh-copy-id 172.17.120.51
[hadoop@docker-01 ~]$ ssh-copy-id 172.17.120.52
(4)啟動hdfs: ./sbin/start-dfs.sh,即啟動HDFS分散式存儲
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/start-dfs.sh
註:如果報錯,如:
docker-02: Host key verification failed.
解決:
[hadoop@docker-01 sbin]$ ssh 172.17.120.52 #確認可以不輸入密碼直接連接上docker-02
關閉後再重啟:
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/stop-dfs.sh
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/start-dfs.sh
(5)查看進程,此時master有進程:namenode和secondarynamenode進程:
[hadoop@docker-01 sbin]$ ps -axu | grep namenode —color
Docker-02和docker-03上有進程:DataNode
[root@docker-02 sbin]# ps -axu | grep datanode —color
(6)在xuegod63上啟動yarn: ./sbin/start-yarn.sh 即,啟動分散式計算
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/start-yarn.sh starting yarn daemons
(7)查看進程:
查看docker-01上的ResourceManager進程,docker-02和docker-03上的進程:DataNode NodeManager
[hadoop@docker-01 sbin]$ ps -axu | grep resourcemanager —color
[hadoop@docker-02 ~]$ ps -axu | grep nodemanager —color
[hadoop@docker-03 ~]$ ps -axu | grep nodemanager –color
註:start-dfs.sh 和start-yarn.sh這兩個腳本可用start-all.sh代替。
關閉:
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/stop-all.sh
啟動
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/start-all.sh
啟動:/apreduce運行狀態
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/mr-jobhistory-daemon.sh start historyserver
(8)查看HDFS分散式文件系統狀態:
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/bin/hdfs dfsadmin -report
(9)查看文件塊組成: 一個文件由哪些塊組成
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/bin/hdfs fsck / -files -blocks
(10)Web查看HDFS: http://172.17.120.50:50070

(11)通過Web查看hadoop集群狀態: http://172.17.120.50:8088

附:hadoop中文文檔http://hadoop.apache.org/docs/r1.0.4/cn/
關於運維學習、分享、交流,筆者開通了微信公眾號【運維貓】,感興趣的朋友可以關注下,歡迎加入,建立屬於我們自己的小圈子,一起學運維知識。