前言
Hadoop 在大數據技術體系中的地位至關重要,Hadoop 是大數據技術的基礎,對Hadoop基礎知識的掌握的扎實程度,會決定在大數據技術道路上走多遠。
這是一篇入門文章,Hadoop 的學習方法很多,網上也有很多學習路線圖。本文的思路是:以安裝部署 Apache Hadoop2.x 版本為主線,來介紹 Hadoop2.x 的架構組成、各模塊協同工作原理、技術細節。安裝不是目的,通過安裝認識Hadoop才是目的。
本文分為五個部分、十三節、四十九步。
第一部分:Linux環境安裝
Hadoop是運行在Linux,雖然借助工具也可以運行在Windows上,但是建議還是運行在Linux系統上,第一部分介紹Linux環境的安裝、配置、Java JDK安裝等。
第二部分:Hadoop本地模式安裝
Hadoop 本地模式只是用於本地開發調試,或者快速安裝體驗 Hadoop,這部分做簡單的介紹。
第三部分:Hadoop偽分布式模式安裝
學習 Hadoop 一般是在偽分布式模式下進行。這種模式是在一台機器上各個進程上運行 Hadoop 的各個模塊,偽分布式的意思是雖然各個模塊是在各個進程上分開運行的,但是只是運行在一個操作系統上的,並不是真正的分布式。
第四部分:完全分布式安裝
完全分布式模式才是生產環境采用的模式,Hadoop 運行在服務器集群上,生產環境一般都會做HA,以實現高可用。
第五部分:Hadoop HA安裝
HA是指高可用,為了解決Hadoop單點故障問題,生產環境一般都做HA部署。這部分介紹了如何配置Hadoop2.x的高可用,並簡單介紹了HA的工作原理。
安裝過程中,會穿插簡單介紹涉及到的知識。希望能對大家有所幫助。
第一部分:Linux環境安裝
第一步、配置 Vmware NAT 網絡
一、Vmware 網絡模式介紹
參考:http://blog.csdn.net/collection4u/article/details/14127671
二、NAT模式配置
NAT是網絡地址轉換,是在宿主機和虛擬機之間增加一個地址轉換服務,負責外部和虛擬機之間的通訊轉接和IP轉換。
我們部署Hadoop集群,這里選擇NAT模式,各個虛擬機通過NAT使用宿主機的IP來訪問外網。
我們的要求是集群中的各個虛擬機有固定的IP、可以訪問外網,所以進行如下設置:
1. Vmware 安裝后,默認的 NAT 設置如下:
2. 默認的設置是啟動DHCP服務的,NAT會自動給虛擬機分配IP,但是我們需要將各個機器的IP固定下來,所以要取消這個默認設置。
3. 為機器設置一個子網網段,默認是192.168.136網段,我們這里設置為100網段,將來各個虛擬機Ip就為 192.168.100.*。
4. 點擊NAT設置按鈕,打開對話框,可以修改網關地址和DNS地址。這里我們為NAT指定DNS地址。
5. 網關地址為當前網段里的.2地址,好像是固定的,我們不做修改,先記住網關地址就好了,后面會用到。
第二步、安裝Linux操作系統
三、Vmware 上安裝 Linux系統
1. 文件菜單選擇新建虛擬機
2. 選擇經典類型安裝,下一步。
3. 選擇稍后安裝操作系統,下一步。
4. 選擇 Linux 系統,版本選擇 CentOS 64 位。
5. 命名虛擬機,給虛擬機起個名字,將來顯示在Vmware左側。並選擇Linux系統保存在宿主機的哪個目錄下,應該一個虛擬機保存在一個目錄下,不能多個虛擬機使用一個目錄。
6. 指定磁盤容量,是指定分給Linux虛擬機多大的硬盤,默認20G就可以,下一步。
7. 點擊自定義硬件,可以查看、修改虛擬機的硬件配置,這里我們不做修改。
8. 點擊完成后,就創建了一個虛擬機,但是此時的虛擬機還是一個空殼,沒有操作系統,接下來安裝操作系統。
9. 點擊編輯虛擬機設置,找到DVD,指定操作系統ISO文件所在位置。
10. 點擊開啟此虛擬機,選擇第一個回車開始安裝操作系統。
11. 設置 root 密碼。
12. 選擇 Desktop,這樣就會裝一個 Xwindow。
13. 先不添加普通用戶,其他用默認的,就把Linux安裝完畢了。
四、設置網絡
因為 Vmware 的 NAT 設置中關閉了 DHCP 自動分配 IP 功能,所以 Linux 還沒有 IP,需要我們設置網絡各個參數。
1. 用 root 進入 Xwindow,右擊右上角的網絡連接圖標,選擇修改連接。
2. 網絡連接里列出了當前 Linux 里所有的網卡,這里只有一個網卡 System eth0,點擊編輯。
3. 配置IP、子網掩碼、網關(和NAT設置的一樣)、DNS等參數,因為NAT里設置網段為100.*,所以這台機器可以設置為192.168.100.10網關和NAT一致,為192.168.100.2
4. 用ping來檢查是否可以連接外網,如下圖,已經連接成功。
五、修改 Hostname
1. 臨時修改 hostname
[root@localhost Desktop]# hostname bigdata-senior01.chybinmy.com
這種修改方式,系統重啟后就會失效。
2. 永久修改 hostname
想永久修改,應該修改配置文件 /etc/sysconfig/network。
命令:[root@bigdata-senior01 ~] vim /etc/sysconfig/network
打開文件后,
NETWORKING=yes #使用網絡HOSTNAME=bigdata-senior01.chybinmy.com #設置主機名
六、配置Host
命令:[root@bigdata-senior01 ~] vim /etc/hosts添加hosts: 192.168.100.10 bigdata-senior01.chybinmy.com
七、關閉防火牆
學習環境可以直接把防火牆關閉掉。
(1) 用root用戶登錄后,執行查看防火牆狀態。
[root@bigdata-senior01 hadoop]# service iptables status
(2) 用 [root@bigdata-senior01 hadoop]# service iptables stop 關閉防火牆,這個是臨時關閉防火牆。
[root@bigdata-senior01 hadoop-2.5.0]# service iptables stopiptables: Setting chains to policy ACCEPT: filter [ OK ]iptables: Flushing firewall rules: [ OK ]iptables: Unloading modules: [ OK ]
(3) 如果要永久關閉防火牆用。
[root@bigdata-senior01 hadoop]# chkconfig iptables off
關閉,這種需要重啟才能生效。
八、關閉selinux
selinux是Linux一個子安全機制,學習環境可以將它禁用。
第三步、安裝JDK
九、安裝 Java JDK
1. 查看是否已經安裝了 java JDK。
[root@bigdata-senior01 Desktop]# java –version
注意:Hadoop 機器上的 JDK,最好是 Oracle 的 Java JDK,不然會有一些問題,比如可能沒有 JPS 命令。
如果安裝了其他版本的 JDK,卸載掉。
2. 安裝 java JDK
(1) 去下載 Oracle 版本 Java JDK:jdk-7u67-linux-x64.tar.gz
(2) 將 jdk-7u67-linux-x64.tar.gz 解壓到 /opt/modules 目錄下
[root@bigdata-senior01 /]# tar -zxvf jdk-7u67-linux-x64.tar.gz -C /opt/modules
(3) 添加環境變量
設置 JDK 的環境變量 JAVA_HOME。需要修改配置文件/etc/profile,追加
export JAVA_HOME="/opt/modules/jdk1.7.0_67"export PATH=$JAVA_HOME/bin:$PATH
修改完畢后,執行 source /etc/profile
(4)安裝后再次執行 java –version,可以看見已經安裝完成。
第二部分:Hadoop本地模式安裝
第四步、Hadoop部署模式
Hadoop 部署模式有:本地模式、偽分布模式、完全分布式模式、HA完全分布式模式。
區分的依據是 NameNode、DataNode、ResourceManager、NodeManager等模塊運行在幾個JVM進程、幾個機器。
模式名稱 | 各個模塊占用的JVM進程數 | 各個模塊運行在幾個機器數上 |
---|---|---|
本地模式 | 1個 | 1個 |
偽分布式模式 | N個 | 1個 |
完全分布式模式 | N個 | N個 |
HA完全分布式 | N個 | N個 |
第五步、本地模式部署
十、本地模式介紹
本地模式是最簡單的模式,所有模塊都運行與一個JVM進程中,使用的本地文件系統,而不是HDFS,本地模式主要是用於本地開發過程中的運行調試用。下載 hadoop 安裝包后不用任何設置,默認的就是本地模式。
十一、解壓hadoop后就是直接可以使用
1. 創建一個存放本地模式hadoop的目錄
[hadoop@bigdata-senior01 modules]$ mkdir /opt/modules/hadoopstandalone
2. 解壓 hadoop 文件
3. 確保 JAVA_HOME 環境變量已經配置好
[hadoop@bigdata-senior01 modules]$ echo ${JAVA_HOME}/opt/modules/jdk1.7.0_67
十二、運行MapReduce程序,驗證
我們這里用hadoop自帶的wordcount例子來在本地模式下測試跑mapreduce。
1. 准備mapreduce輸入文件wc.input
[hadoop@bigdata-senior01 modules]$ cat /opt/data/wc.inputhadoop mapreduce hivehbase spark stormsqoop hadoop hivespark hadoop
2. 運行 hadoop 自帶的 mapreduce Demo
這里可以看到 job ID 中有 local 字樣,說明是運行在本地模式下的。
3. 查看輸出文件
本地模式下,mapreduce 的輸出是輸出到本地。
輸出目錄中有 _SUCCESS 文件說明 JOB 運行成功,part-r-00000 是輸出結果文件。
第三部分:Hadoop 偽分布式模式安裝
第六步 偽分布式 Hadoop 部署過程
十三、Hadoop 所用的用戶設置
1. 創建一個名字為 hadoop 的普通用戶
2. 給 hadoop 用戶 sudo 權限
設置權限,學習環境可以將 hadoop 用戶的權限設置的大一些,但是生產環境一定要注意普通用戶的權限限制。
注意:如果root用戶無權修改sudoers文件,先手動為root用戶添加寫權限。
3. 切換到hadoop用戶
[root@bigdata-senior01 ~]# su - hadoop[hadoop@bigdata-senior01 ~]$
4. 創建存放hadoop文件的目錄
5. 將hadoop文件夾的所有者指定為hadoop用戶
如果存放hadoop的目錄的所有者不是hadoop,之后hadoop運行中可能會有權限問題,那么就講所有者改為hadoop。
十四、解壓Hadoop目錄文件
1. 復制 hadoop-2.5.0.tar.gz 到/opt/modules目錄下。
2. 解壓 hadoop-2.5.0.tar.gz
十五、配置 Hadoop
1. 配置 Hadoop 環境變量
追加配置:
執行:source /etc/profile 使得配置生效
驗證 HADOOP_HOME 參數:
2. 配置 hadoop-env.sh、mapred-env.sh、yarn-env.sh 文件的 JAVA_HOME參數
3. 配置 core-site.xml
[hadoop@bigdata-senior01 ~]$ sudo vim ${HADOOP_HOME}/etc/hadoop/core-site.xml
(1) fs.defaultFS 參數配置的是HDFS的地址。
(2) hadoop.tmp.dir
配置的是Hadoop臨時目錄,比如HDFS的NameNode數據默認都存放這個目錄下,查看*-default.xml
等默認配置文件,就可以看到很多依賴${hadoop.tmp.dir}
的配置。
默認的hadoop.tmp.dir
是/tmp/hadoop-${user.name}
,此時有個問題就是 NameNode 會將 HDFS 的元數據存儲在這個/tmp目錄下,如果操作系統重啟了,系統會清空 /tmp 目錄下的東西,導致NameNode元數據丟失,是個非常嚴重的問題,所有我們應該修改這個路徑。
-
創建臨時目錄:
-
將臨時目錄的所有者修改為 hadoop
-
修改 hadoop.tmp.dir
十六、配置、格式化、啟動 HDFS
1. 配置 hdfs-site.xml
dfs.replication 配置的是 HDFS存 儲時的備份數量,因為這里是偽分布式環境只有一個節點,所以這里設置為1。
2. 格式化 HDFS
格式化是對 HDFS 這個分布式文件系統中的 DataNode 進行分塊,統計所有分塊后的初始元數據的存儲在 NameNode 中。
格式化后,查看 core-site.xml 里 hadoop.tmp.dir(本例是 /opt/data 目錄)指定的目錄下是否有了 dfs 目錄,如果有,說明格式化成功。
注意:
-
格式化時,這里注意 hadoop.tmp.dir 目錄的權限問題,應該 hadoop 普通用戶有讀寫權限才行,可以將 /opt/data 的所有者改為 hadoop。
[hadoop@bigdata-senior01 hadoop-2.5.0]$ sudo chown -R hadoop:hadoop /opt/data -
查看 NameNode 格式化后的目錄。
fsimage 是 NameNode 元數據在內存滿了后,持久化保存到的文件。
fsimage*.md5
是校驗文件,用於校驗 fsimage 的完整性。
seen_txid
是 hadoop 的版本
vession 文件里保存:
-
namespaceID:NameNode 的唯一 ID。
-
clusterID:集群 ID,NameNode 和 DataNode 的集群 ID 應該一致,表明是一個集群。
3. 啟動 NameNode
4. 啟動 DataNode
5. 啟動 SecondaryNameNode
6. JPS 命令查看是否已經啟動成功,有結果就是啟動成功了。
7. HDFS 上測試創建目錄、上傳、下載文件
HDFS 上創建目錄
上傳本地文件到 HDFS 上
讀取 HDFS 上的文件內容
從 HDFS上 下載文件到本地
[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -get /demo1/core-site.xml
十七、配置、啟動YARN
1. 配置mapred-site.xml
默認沒有mapred-site.xml文件,但是有個mapred-site.xml.template配置模板文件。復制模板生成mapred-site.xml。
添加配置如下:
指定 mapreduce 運行在 yarn 框架上。
2. 配置 yarn-site.xml
添加配置如下:
-
yarn.nodemanager.aux-services 配置了 yarn 的默認混洗方式,選擇為 mapreduce 的默認混洗算法。
-
yarn.resourcemanager.hostname 指定了 Resourcemanager 運行在哪個節點上。
3. 啟動 Resourcemanager
4. 啟動 nodemanager
5. 查看是否啟動成功
可以看到 ResourceManager、NodeManager 已經啟動成功了。
6. YARN 的 Web 頁面
YARN 的 Web 客戶端端口號是 8088,通過 http://192.168.100.10:8088/ 可以查看。
十八、運行 MapReduce Job
在 Hadoop 的 share 目錄里,自帶了一些 jar 包,里面帶有一些 mapreduce 實例小例子,位置在 share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar,可以運行這些例子體驗剛搭建好的Hadoop平台,我們這里來運行最經典的 WordCount 實例。
1. 創建測試用的 Input 文件
創建輸入目錄:
創建原始文件:
在本地 /opt/data 目錄創建一個文件 wc.input,內容如下。
將 wc.input 文件上傳到 HDFS 的 /wordcountdemo/input 目錄中:
2. 運行 WordCount MapReduce Job
3. 查看輸出結果目錄
-
output 目錄中有兩個文件,_SUCCESS 文件是空文件,有這個文件說明Job執行成功。
-
part-r-00000文件是結果文件,其中-r-說明這個文件是 Reduce 階段產生的結果,mapreduce 程序執行時,可以沒有 reduce 階段,但是肯定會有 map 階段,如果沒有 reduce 階段這個地方有是-m-。
-
一個 reduce 會產生一個 part-r- 開頭的文件。
-
查看輸出文件內容。
結果是按照鍵值排好序的。
十九、停止 Hadoop
二十、 Hadoop 各個功能模塊的理解
1. HDFS模塊
HDFS 負責大數據的存儲,通過將大文件分塊后進行分布式存儲方式,突破了服務器硬盤大小的限制,解決了單台機器無法存儲大文件的問題,HDFS 是個相對獨立的模塊,可以為 YARN 提供服務,也可以為 HBase 等其他模塊提供服務。
2. YARN 模塊
YARN 是一個通用的資源協同和任務調度框架,是為了解決 Hadoop1.x 中MapReduce 里 NameNode 負載太大和其他問題而創建的一個框架。
YARN 是個通用框架,不止可以運行 MapReduce,還可以運行Spark、Storm等其他計算框架。
3. MapReduce 模塊
MapReduce 是一個計算框架,它給出了一種數據處理的方式,即通過 Map 階段、Reduce階段來分布式地流式處理數據。它只適用於大數據的離線處理,對實時性要求很高的應用不適用。
第七步 開啟歷史服務
二十一、歷史服務介紹
Hadoop 開啟歷史服務可以在 web 頁面上查看 Yarn 上執行 job 情況的詳細信息。可以通過歷史服務器查看已經運行完的 Mapreduce 作業記錄,比如用了多少個 Map、用了多少個 Reduce、作業提交時間、作業啟動時間、作業完成時間等信息。
二十二、開啟歷史服務
開啟后,可以通過 Web 頁面查看歷史服務器:
http://bigdata-senior01.chybinmy.com:19888/
二十三、Web 查看 job 執行歷史
1. 運行一個 mapreduce 任務
2. job 執行中
3. 查看 job 歷史
歷史服務器的 Web 端口默認是19888,可以查看Web界面。
但是在上面所顯示的某一個 Job 任務頁面的最下面,Map 和 Reduce 個數的鏈接上,點擊進入 Map 的詳細信息頁面,再查看某一個 Map 或者 Reduce 的詳細日志是看不到的,是因為沒有開啟日志聚集服務。
二十四、開啟日志聚集
4. 日志聚集介紹
MapReduce是在各個機器上運行的,在運行過程中產生的日志存在於各個機器上,為了能夠統一查看各個機器的運行日志,將日志集中存放在HDFS上,這個過程就是日志聚集。
5. 開啟日志聚集
配置日志聚集功能:
Hadoop 默認是不啟用日志聚集的。在 yarn-site.xml 文件里配置啟用日志聚集。
yarn.log-aggregation-enable:是否啟用日志聚集功能。
yarn.log-aggregation.retain-seconds:設置日志保留時間,單位是秒。
將配置文件分發到其他節點:
重啟 Yarn 進程:
重啟 HistoryServer 進程:
6. 測試日志聚集
運行一個 demo MapReduce,使之產生日志:
查看日志:
運行 Job 后,就可以在歷史服務器 Web 頁面查看各個 Map 和 Reduce 的日志了。
第四部分:完全分布式安裝
第八步 完全布式環境部署 Hadoop
完全分部式是真正利用多台 Linux 主機來進行部署 Hadoop,對 Linux 機器集群進行規划,使得 Hadoop 各個模塊分別部署在不同的多台機器上。
二十五、環境准備
1. 克隆虛擬機
-
Vmware 左側選中要克隆的機器,這里對原有的 BigData01 機器進行克隆,虛擬機菜單中,選中管理菜單下的克隆命令。
-
選擇“創建完整克隆”,虛擬機名稱為 BigData02,選擇虛擬機文件保存路徑,進行克隆。
-
再次克隆一個名為 BigData03 的虛擬機。
2. 配置網絡
修改網卡名稱:
在 BigData02 和 BigData03 機器上編輯網卡信息。執行 sudo vim /etc/udev/rules.d/70-persistent-net.rules 命令。因為是從 BigData01 機器克隆來的,所以會保留 BigData01 的網卡 eth0,並且再添加一個網卡 eth1。
並且 eth0 的 Mac 地址和 BigData01 的地址是一樣的,Mac 地址不允許相同,所以要刪除 eth0,只保留 eth1 網卡,並且要將 eth1改名為 eth0。將修改后的 eth0 的 mac 地址復制下來,修改 network-scripts 文件中的 HWADDR 屬性。
修改網絡參數:
BigData02機器IP改為192.168.100.12
BigData03機器IP改為192.168.100.13
3. 配置 Hostname
BigData02 配置 hostname 為 bigdata-senior02.chybinmy.com
BigData03 配置 hostname 為 bigdata-senior03.chybinmy.com
4. 配置 hosts
BigData01、BigData02、BigData03 三台機器 hosts 都配置為:
5. 配置 Windows 上的 SSH 客戶端
在本地 Windows 中的 SSH 客戶端上添加對 BigData02、BigData03 機器的SSH鏈接。
二十六、服務器功能規划
為了和之前 BigData01 機器上安裝偽分布式 Hadoop 區分開來,我們將 BigData01上的 Hadoop 服務都停止掉,然后在一個新的目錄 /opt/modules/app下安裝另外一個Hadoop。
二十七、在第一台機器上安裝新的 Hadoop
我們采用先在第一台機器上解壓、配置 Hadoop,然后再分發到其他兩台機器上的方式來安裝集群。
6. 解壓 Hadoop 目錄:
7. 配置 Hadoop JDK 路徑修改 hadoop-env.sh、mapred-env.sh、yarn-env.sh 文件中的 JDK 路徑:
8. 配置 core-site.xml
fs.defaultFS 為 NameNode 的地址。
hadoop.tmp.dir 為 hadoop 臨時目錄的地址,默認情況下,NameNode 和 DataNode 的數據文件都會存在這個目錄下的對應子目錄下。應該保證此目錄是存在的,如果不存在,先創建。
9. 配置 hdfs-site.xml
dfs.namenode.secondary.http-address 是指定 secondaryNameNode 的 http 訪問地址和端口號,因為在規划中,我們將 BigData03 規划為 SecondaryNameNode 服務器。
所以這里設置為:bigdata-senior03.chybinmy.com:50090
10. 配置 slaves
slaves 文件是指定 HDFS 上有哪些 DataNode 節點。
11. 配置 yarn-site.xml
根據規划yarn.resourcemanager.hostname
這個指定 resourcemanager 服務器指向bigdata-senior02.chybinmy.com
。
yarn.log-aggregation-enable
是配置是否啟用日志聚集功能。
yarn.log-aggregation.retain-seconds
是配置聚集的日志在 HDFS 上最多保存多長時間。
12. 配置 mapred-site.xml
從 mapred-site.xml.template 復制一個 mapred-site.xml 文件。
mapreduce.framework.name 設置 mapreduce 任務運行在 yarn 上。
mapreduce.jobhistory.address 是設置 mapreduce 的歷史服務器安裝在BigData01機器上。
mapreduce.jobhistory.webapp.address 是設置歷史服務器的web頁面地址和端口號。
二十八、設置 SSH 無密碼登錄
Hadoop 集群中的各個機器間會相互地通過 SSH 訪問,每次訪問都輸入密碼是不現實的,所以要配置各個機器間的
SSH 是無密碼登錄的。
1. 在 BigData01 上生成公鑰
一路回車,都設置為默認值,然后再當前用戶的Home目錄下的.ssh
目錄中會生成公鑰文件(id_rsa.pub)
和私鑰文件(id_rsa)
。
2. 分發公鑰
3. 設置 BigData02、BigData03 到其他機器的無密鑰登錄
同樣的在 BigData02、BigData03 上生成公鑰和私鑰后,將公鑰分發到三台機器上。
二十九、分發 Hadoop 文件
-
首先在其他兩台機器上創建存放 Hadoop 的目錄
2. 通過 Scp 分發
Hadoop 根目錄下的 share/doc 目錄是存放的 hadoop 的文檔,文件相當大,建議在分發之前將這個目錄刪除掉,可以節省硬盤空間並能提高分發的速度。
doc目錄大小有1.6G。
三十、格式 NameNode
在 NameNode 機器上執行格式化:
注意:
如果需要重新格式化 NameNode,需要先將原來 NameNode 和 DataNode 下的文件全部刪除,不然會報錯,NameNode 和 DataNode 所在目錄是在core-site.xml
中hadoop.tmp.dir
、dfs.namenode.name.dir
、dfs.datanode.data.dir
屬性配置的。
因為每次格式化,默認是創建一個集群ID,並寫入 NameNode 和 DataNode 的 VERSION 文件中(VERSION 文件所在目錄為 dfs/name/current 和 dfs/data/current),重新格式化時,默認會生成一個新的集群ID,如果不刪除原來的目錄,會導致 namenode 中的 VERSION 文件中是新的集群 ID,而 DataNode 中是舊的集群 ID,不一致時會報錯。
另一種方法是格式化時指定集群ID參數,指定為舊的集群ID。
三十一、啟動集群
-
啟動 HDFS
2. 啟動 YARN
在 BigData02 上啟動 ResourceManager:
3. 啟動日志服務器
因為我們規划的是在 BigData03 服務器上運行 MapReduce 日志服務,所以要在 BigData03 上啟動。
4. 查看 HDFS Web 頁面
http://bigdata-senior01.chybinmy.com:50070/
5. 查看 YARN Web 頁面
http://bigdata-senior02.chybinmy.com:8088/cluster
三十二、測試 Job
我們這里用 hadoop 自帶的 wordcount 例子來在本地模式下測試跑mapreduce。
-
准備 mapreduce 輸入文件 wc.input
2. 在 HDFS 創建輸入目錄 input
3. 將 wc.inpu t上傳到 HDFS
4. 運行 hadoop 自帶的 mapreduce Demo
5. 查看輸出文件
第五部分:Hadoop HA 安裝
HA 的意思是 High Availability 高可用,指當當前工作中的機器宕機后,會自動處理這個異常,並將工作無縫地轉移到其他備用機器上去,以來保證服務的高可用。
HA 方式安裝部署才是最常見的生產環境上的安裝部署方式。Hadoop HA 是 Hadoop 2.x 中新添加的特性,包括 NameNode HA 和 ResourceManager HA。
因為 DataNode 和 NodeManager 本身就是被設計為高可用的,所以不用對他們進行特殊的高可用處理。
第九步 時間服務器搭建
Hadoop 對集群中各個機器的時間同步要求比較高,要求各個機器的系統時間不能相差太多,不然會造成很多問題。
可以配置集群中各個機器和互聯網的時間服務器進行時間同步,但是在實際生產環境中,集群中大部分服務器是不能連接外網的,這時候可以在內網搭建一個自己的時間服務器(NTP服務器),集群的各個機器與這個時間服務器進行時間同步。
三十三、配置NTP服務器
我們選擇第三台機器(bigdata-senior03.chybinmy.com)為NTF服務器,其他機器和這台機器進行同步。
-
檢查 ntp 服務是否已經安裝
顯示已經安裝過了ntp程序,其中ntpdate-4.2.6p5-1.el6.centos.x86_64
是用來和某台服務器進行同步的,ntp-4.2.6p5-1.el6.centos.x86_64
是用來提供時間同步服務的。
2. 修改配置文件 ntp.conf
啟用 restrice,修改網段
restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap
將這行的注釋去掉,並且將網段改為集群的網段,我們這里是100網段。
注釋掉 server 域名配置
是時間服務器的域名,這里不需要連接互聯網,所以將他們注釋掉。
修改
server 127.127.1.0
fudge 127.127.1.0 stratum 10
3. 修改配置文件 ntpd
添加一行配置:SYNC_CLOCK=yes
4. 啟動 ntp 服務
這樣每次機器啟動時,ntp 服務都會自動啟動。
三十四、配置其他機器的同步
切換到 root 用戶進行配置通過 contab 進行定時同步:
三十五、 測試同步是否有效
-
查看目前三台機器的時間
2. 修改 bigdata-senior01上的時間
將時間改為一個以前的時間:
等10分鍾,看是否可以實現自動同步,將 bigdata-senior01 上的時間修改為和 bigdata-senior03 上的一致。
3. 查看是否自動同步時間
可以看到 bigdata-senior01 上的時間已經實現自動同步了。
第十步 Zookeeper 分布式機器部署
三十六、zookeeper 說明
Zookeeper 在Hadoop 集群中的作用。
Zookeeper是分布式管理協作框架,Zookeeper集群用來保證Hadoop集群的高可用,(高可用的含義是:集群中就算有一部分服務器宕機,也能保證正常地對外提供服務。)
Zookeeper 保證高可用的原理。
Zookeeper 集群能夠保證 NamaNode 服務高可用的原理是:Hadoop 集群中有兩個 NameNode 服務,兩個NaameNode都定時地給 Zookeeper 發送心跳,告訴 Zookeeper 我還活着,可以提供服務,單某一個時間只有一個是 Action 狀態,另外一個是 Standby 狀態,一旦 Zookeeper 檢測不到 Action NameNode 發送來的心跳后,就切換到 Standby 狀態的 NameNode 上,將它設置為 Action 狀態,所以集群中總有一個可用的 NameNode,達到了 NameNode 的高可用目的。
Zookeeper 的選舉機制。
Zookeeper 集群也能保證自身的高可用,保證自身高可用的原理是,Zookeeper 集群中的各個機器分為 Leader 和 Follower 兩個角色,寫入數據時,要先寫入Leader,Leader 同意寫入后,再通知 Follower 寫入。客戶端讀取數時,因為數據都是一樣的,可以從任意一台機器上讀取數據。
這里 Leader 角色就存在單點故障的隱患,高可用就是解決單點故障隱患的。
Zookeeper 從機制上解決了 Leader 的單點故障問題,Leader 是哪一台機器是不固定的,Leader 是選舉出來的。
選舉流程是,集群中任何一台機器發現集群中沒有 Leader 時,就推薦自己為 Leader,其他機器來同意,當超過一半數的機器同意它為 Leader 時,選舉結束,所以 Zookeeper 集群中的機器數據必須是奇數。
這樣就算當 Leader 機器宕機后,會很快選舉出新的 Leader,保證了 Zookeeper 集群本身的高可用。
寫入高可用。
集群中的寫入操作都是先通知 Leader,Leader 再通知 Follower 寫入,實際上當超過一半的機器寫入成功后,就認為寫入成功了,所以就算有些機器宕機,寫入也是成功的。
讀取高可用。
zookeeperk 客戶端讀取數據時,可以讀取集群中的任何一個機器。所以部分機器的宕機並不影響讀取。
zookeeper 服務器必須是奇數台,因為 zookeeper 有選舉制度,角色有:領導者、跟隨者、觀察者,選舉的目的是保證集群中數據的一致性。
三十七、安裝 zookeeper
我們這里在 BigData01、BigData02、BigData03 三台機器上安裝 zookeeper 集群。
1. 解壓安裝包
在 BigData01上安裝解壓 zookeeper 安裝包。
2. 修改配置
拷貝 conf 下的 zoo_sample.cfg 副本,改名為 zoo.cfg。zoo.cfg 是 zookeeper 的配置文件:
dataDir 屬性設置 zookeeper 的數據文件存放的目錄:
dataDir=/opt/modules/zookeeper-3.4.8/data/zData
指定 zookeeper 集群中各個機器的信息:
server 后面的數字范圍是1到255,所以一個 zookeeper 集群最多可以有255個機器。
3. 創建 myid 文件
在 dataDir 所指定的目錄下創一個名為 myid 的文件,文件內容為 server 點后面的數字。
4. 分發到其他機器
5. 修改其他機器上的myid文件
6. 啟動 zookeeper
需要在各個機器上分別啟動 zookeeper。
三十八、zookeeper 命令
進入zookeeper Shell
在zookeeper根目錄下執行 bin/zkCli.sh進入zk shell模式。
zookeeper很像一個小型的文件系統,/是根目錄,下面的所有節點都叫zNode。
進入 zk shell 后輸入任意字符,可以列出所有的 zookeeper 命令
查詢 zNode 上的數據:get /zookeeper
創建一個 zNode : create /znode1 “demodata “
列出所有子 zNode:ls /
刪除 znode : rmr /znode1
退出 shell 模式:quit
第十一步 Hadoop 2.x HDFS HA 部署
三十九、HDFS HA原理
單 NameNode 的缺陷存在單點故障的問題,如果 NameNode 不可用,則會導致整個 HDFS 文件系統不可用。
所以需要設計高可用的 HDFS(Hadoop HA)來解決 NameNode 單點故障的問題。解決的方法是在 HDFS 集群中設置多個 NameNode 節點。
但是一旦引入多個 NameNode,就有一些問題需要解決。
-
HDFS HA 需要保證的四個問題:
-
保證 NameNode 內存中元數據數據一致,並保證編輯日志文件的安全性。
-
多個 NameNode 如何協作
-
客戶端如何能正確地訪問到可用的那個 NameNode。
-
怎么保證任意時刻只能有一個 NameNode 處於對外服務狀態。
-
解決方法
-
對於保證 NameNode 元數據的一致性和編輯日志的安全性,采用 Zookeeper 來存儲編輯日志文件。
-
兩個 NameNode 一個是 Active 狀態的,一個是 Standby 狀態的,一個時間點只能有一個 Active 狀態的
NameNode 提供服務,兩個 NameNode 上存儲的元數據是實時同步的,當 Active 的 NameNode 出現問題時,通過 Zookeeper 實時切換到 Standby 的 NameNode 上,並將 Standby 改為 Active 狀態。 -
客戶端通過連接一個 Zookeeper 的代理來確定當時哪個 NameNode 處於服務狀態。
四十、HDFS HA 架構圖
-
HDFS HA 架構中有兩台 NameNode 節點,一台是處於活動狀態(Active)為客戶端提供服務,另外一台處於熱備份狀態(Standby)。
-
元數據文件有兩個文件:fsimage 和 edits,備份元數據就是備份這兩個文件。JournalNode 用來實時從 Active NameNode 上拷貝 edits 文件,JournalNode 有三台也是為了實現高可用。
-
Standby NameNode 不對外提供元數據的訪問,它從 Active NameNode 上拷貝 fsimage 文件,從 JournalNode 上拷貝 edits 文件,然后負責合並 fsimage 和 edits 文件,相當於 SecondaryNameNode 的作用。
最終目的是保證 Standby NameNode 上的元數據信息和 Active NameNode 上的元數據信息一致,以實現熱備份。
-
Zookeeper 來保證在 Active NameNode 失效時及時將 Standby NameNode 修改為 Active 狀態。
-
ZKFC(失效檢測控制)是 Hadoop 里的一個 Zookeeper 客戶端,在每一個 NameNode 節點上都啟動一個 ZKFC 進程,來監控 NameNode 的狀態,並把 NameNode 的狀態信息匯報給 Zookeeper 集群,其實就是在 Zookeeper 上創建了一個 Znode 節點,節點里保存了 NameNode 狀態信息。
當 NameNode 失效后,ZKFC 檢測到報告給 Zookeeper,Zookeeper把對應的 Znode 刪除掉,Standby ZKFC 發現沒有 Active 狀態的 NameNode 時,就會用 shell 命令將自己監控的 NameNode 改為 Active 狀態,並修改 Znode 上的數據。
Znode 是個臨時的節點,臨時節點特征是客戶端的連接斷了后就會把 znode 刪除,所以當 ZKFC 失效時,也會導致切換 NameNode。 -
DataNode 會將心跳信息和 Block 匯報信息同時發給兩台 NameNode, DataNode 只接受 Active NameNode 發來的文件讀寫操作指令。
四十一、搭建HDFS HA 環境
1. 服務器角色規划
在 bigdata01、bigdata02、bigdata03 三台機器上分別創建目錄 /opt/modules/hadoopha/ 用來存放 Hadoop HA 環境。
2. 創建 HDFS HA 版本 Hadoop 程序目錄
3. 新解壓 Hadoop 2.5.0
4. 配置 Hadoop JDK 路徑
5. 配置 hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?><configuration> <property> <!-- 為namenode集群定義一個services name --> <name>dfs.nameservices</name> <value>ns1</value> </property> <property> <!-- nameservice 包含哪些namenode,為各個namenode起名 --> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <property> <!-- 名為nn1的namenode 的rpc地址和端口號,rpc用來和datanode通訊 --> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>bigdata-senior01.chybinmy.com:8020</value> </property> <property> <!-- 名為nn2的namenode 的rpc地址和端口號,rpc用來和datanode通訊 --> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>bigdata-senior02.chybinmy.com:8020</value> </property> <property> <!--名為nn1的namenode 的http地址和端口號,web客戶端 --> <name>dfs.namenode.http-address.ns1.nn1</name> <value>bigdata-senior01.chybinmy.com:50070</value> </property> <property> <!--名為nn2的namenode 的http地址和端口號,web客戶端 --> <name>dfs.namenode.http-address.ns1.nn2</name> <value>bigdata-senior02.chybinmy.com:50070</value> </property> <property> <!-- namenode間用於共享編輯日志的journal節點列表 --> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://bigdata-senior01.chybinmy.com:8485;bigdata-senior02.chybinmy.com:8485;bigdata-senior03.chybinmy.com:8485/ns1</value> </property> <property> <!-- journalnode 上用於存放edits日志的目錄 --> <name>dfs.journalnode.edits.dir</name> <value>/opt/modules/hadoopha/hadoop-2.5.0/tmp/data/dfs/jn</value> </property> <property> <!-- 客戶端連接可用狀態的NameNode所用的代理類 --> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <!-- --> <name>dfs.ha.fencing.methods</name> <value>sshfence