1. 程式人生 > 實用技巧 >一、Apache Hadoop

一、Apache Hadoop

https://www.yuque.com/cdhongit/wzu20x

Apache Hadoop

Apache Hadoop大資料時代的發展趨勢一資料將成為資產什麼是大資料?大資料時代的關鍵技術Hadoop 概述和介紹Hadoop的生態圈Hadoop 發行版Hadoop 優缺點HDFS 分散式檔案系統HDFS 體系結構NameNode元資料管理機制Hadoop環境搭建所需軟體列表安裝 MobaXterm 終端模擬器環境準備安裝 JDK 與 Hadoop配置 Hadoop 偽分散式環境HDFS 的Web 管理介面HDFS 操作常用shell 命令YARN與MapRedcueYARN 架構概述MapReduce概述

MapReduce 程式設計模型配置YARN和MapReduce環境MapReduce 經典入門案例 - WordCount 程式歷史服務和日誌聚合SSH 遠端登入安全協議

大資料時代的發展趨勢一資料將成為資產

長期以來,困擾企業最大的難題就是“如何更瞭解他的客戶” 。傳統企業衰落的根本原因在於難以貼近消費者,難以瞭解消費者的真正需求。網際網路公司的強項恰恰是天然地貼近消費者、瞭解消費者。企業需要花大力氣真正研究消費者的資料,這樣才能瞭解消費者,才能將資料資產化, 將資料變現。

在資訊傳播極其迅速的今天,各種資料滲透我們的生活,並以指數級的速度增長。我們也正從IT進入DT時代

**IT**,英文 Information Technology 的縮寫,即 資訊科技。資訊科技是一項基於計算機和網際網路,用來提升人們資訊傳播能力的技術。

**DT**,英文 Data Technology 的縮寫,即 資料技術。是對資料進行儲存、清洗、加工、分析、挖掘,從資料中發掘規律的技術。DT讓我們能夠藉助計算機的計算能力認知我們的客戶,提升我們認知的同時,影響我們的思考、幫助我們決策。簡單說,**IT提供資訊傳播能力,DT是解決資料決策能力**

**DT是資料技術**它首先需要大量的資料,其次需要強大的計算能力**,`大資料+大算力`是DT的保證**。IT二十年我們在網際網路上積累了海量的資料。同時,5G物聯網的到來,把萬物的連線在一起,產生了全新的資料生產能力。在這種情況下,讓資料技術來幫助人類認知世界,解決思考決策就成為必然。

什麼是大資料?

一般認為,大資料主要具有四方面的典型特徵一一**規模性(Volume)、多樣性(Variety)、高速性(Velocity)和價值性(Value),即所謂的“ 4V ”**

  1. 規模性,即大資料具有相當的規模, 其資料量非常巨大。淘寶網近4億的會員每天產生的商品交易資料約20TB, Facebook (臉書)約10 億的使用者每天產生的日誌資料超過300TB。 資料的數量級別可劃分為B 、KB 、MB 、GB 、TB 、PB 、EB 、ZB 等,而資料的數量級別為PB 級別的才能稱得上是大資料

  2. 多樣性,即大資料的資料型別呈現多樣性。資料型別繁多,不僅包括結構化資料,還包括非結構化資料和半結構化資料。其中,結構化資料即音訊、圖片、文字、視訊、網路日誌、地理位置資訊等。傳統的資料處理物件基本上都是結構化資料,而在現實中非結構化資料也是大量存在的,所以既要分析結構化資料又要分析非結構化資料才能滿足人們對資料處理的要求。

  3. 高速性,即處理大資料的速度越來越快,處理時要求具有時效性,因為資料和資訊更新速度非常快,資訊價值存在的時間非常短, 必須要求在極短的時間下在海量規模的大資料中摒除無用的資訊來蒐集具有價值和能夠利用的資訊。所以隨著大資料時代的到來,蒐集和提取具有價值的資料和資訊必須要求高效性和短時性。

  4. 價值性。從大資料的表面資料進行分析,進而得到大資料背後重要的有價值的資訊,最後可以精確地理解資料背後所隱藏的現實意義。以視訊為例, 一部1小時的視訊,在連續不間斷的監控中,有用資料可能僅有一兩秒。

大資料時代的關鍵技術

大資料時代的關鍵技術一般包括大資料來集、大資料預處理、大資料儲存及管理、大資料分析及挖掘、大資料視覺化展現等。

  1. 大資料採集技術 大資料採集是指通過對社交網路互動資料、移動網際網路資料以及感測器資料的收集,獲得各種型別的結構化、半結構化及非結構化的海量資料。

  2. 大資料預處理技術 大資料預處理技術主要完成對己接收資料的抽取、清洗等操作。因獲取的資料可能具有多種結構和型別, 資料抽取能幫助我們從各種異構的源資料來源系統抽取到目的資料來源系統需要的資料。大資料並不全是有價值的,有些資料並不是我們所關心的內容,而另一些資料則是完全錯誤的干擾項,因此要對資料進行過濾“去噪”,從而提取出有效資料。

  3. 大資料儲存及管理技術 大資料儲存與管理要用儲存器把採集到的資料儲存起來,井進行管理和呼叫。重點解決複雜結構化、半結構化和非結構化大資料儲存管理技術。可靠的分散式檔案系統( DFS , Distributed File System)是高效低成本的大資料儲存技術。

  4. 大資料分析及挖掘技術 大資料探勘就是從大量的、不完全的、有噪聲的、模糊的、隨機的實際應用資料中提取隱含在其中的、人們事先不知道的但又是潛在有用的資訊和知識的過程。大資料探勘根據挖掘方法可粗略地分為機器學習方法、統計方法、神經網路方法和資料庫的多維資料分析方法等,它能夠將隱藏於海量資料中的資訊和知識挖掘出來。

  5. 大資料視覺化展現技術 大資料視覺化無論對於普通使用者或是資料分析專家都是最基本的功能。大資料視覺化可以讓資料自己說話,讓使用者直觀地感受到結果,也可以讓資料分析師根據影象化分析的結果做出一些前瞻性判斷。

Hadoop 概述和介紹

1998年9月4日,Google公司在美國矽谷成立。正如大家所知,它是一家做搜尋引擎起家的公司。無獨有偶,一位名叫Doug Cutting的美國工程師,也迷上了搜尋引擎。他做了一個用於文字搜尋的函式庫,命名為Lucene,Lucene是用JAVA寫成的,目標是為各種中小型應用軟體加入全文檢索功能。因為好用而且開源,非常受程式設計師們的歡迎。2004年,Doug Cutting再接再勵,在Lucene的基礎上,和Apache開源夥伴合作,開發了一款可以代替當時的主流搜尋的開源搜尋引擎,命名為Nutch。Nutch是一個建立在Lucene核心之上的網頁搜尋應用程式,可以下載下來直接使用。它在Lucene的基礎上加了網路爬蟲和一些網頁相關的功能,目的就是從一個簡單的站內檢索推廣到全球網路的搜尋上,就像Google一樣

隨著時間的推移,無論是Google還是Nutch,都面臨搜尋物件“體積”不斷增大的問題。尤其是Google,作為網際網路搜尋引擎,**需要儲存大量的網頁,並不斷優化自己的搜尋演算法,提升搜尋效率**。在這個過程中,Google確實找到了不少好辦法,並且無私地分享了出來。

  • 2003年,Google發表了一篇技術學術論文,公開介紹了自己的谷歌檔案系統GFS(Google File System)。這是Google公司為了儲存海量搜尋資料而設計的專用檔案系統。第二年,也就是2004年,Doug Cutting基於Google的GFS論文,實現了分散式檔案儲存系統,並將它命名為NDFS(Nutch Distributed File System)

  • 2004年,Google又發表了一篇技術學術論文,介紹自己的MapReduce程式設計模型。這個程式設計模型,用於大規模資料集(大於1TB)的並行分析運算。第二年(2005年),Doug Cutting又基於MapReduce,在Nutch搜尋引擎實現了該功能。

  • 2006年,當時依然很厲害的Yahoo公司,招安了Doug Cutting。加盟Yahoo之後,Doug Cutting將NDFS和MapReduce進行了升級改造,並重新命名為Hadoop(NDFS也改名為HDFS,Hadoop Distributed File System)。這個,就是後來大名鼎鼎的大資料框架系統——Hadoop的由來。而Doug Cutting,則被人們稱為Hadoop之父

隨後在2006年,Google又發論文了。這次,它們介紹了自己的BigTable。這是一種分散式資料儲存系統,一種用來處理海量資料的非關係型資料庫。Doug Cutting當然沒有放過,在自己的Hadoop系統裡面,引入了BigTable,並命名為HBase

2008年1月,Hadoop成功上位,正式成為Apache基金會的頂級專案。

同年2月Yahoo宣佈建成了一個擁有1萬個核心的Hadoop叢集,並將自己的搜尋引擎產品部署在上面。7月,Hadoop打破世界紀錄,成為最快排序1TB資料的系統,用時209秒。此後,Hadoop便進入了高速發展期,直至現在。

Hadoop 改變了企業對資料的儲存、處理和分析的過程,加速了大資料的發展,形成了自己非常火爆的技術生態圈,成為事實上的大資料處理標準

Hadoop的生態圈

Hadoop的核心,說白了,就是HDFS和MapReduce。HDFS為海量資料提供了儲存,而MapReduce為海量資料提供了計算框架

早期的Hadoop主要由兩個核心元件構成: HDFSMapReduce 。其中,HDFS為海量資料提供了儲存,而MapReduce為海量資料提供了計算框架。還有一些圍繞在Hadoop 周圍的開源專案,為完善大資料處理的全生命週期提供了必要的配套和補充。

2012 年5 月, Hadoop v2 .0 版本釋出,其中重要的變化是在Hadoop 核心元件中增加了YARN,YARN 的出現是為了把計算框架與資源管理徹底分離,解決Hadoop v1.0 由此帶來的擴充套件性差、單點故障和不能同時支援多種計算框架的問題,至此Hadoop 與Google 的大資料平臺比肩。

2017年12月,Hadoop v3 .0 版本釋出,最低要求的Java版本從Java 7增加到Java 8。

Hadoop 發行版

Hadoop 是一個開源專案,先後有許多公司在其框架基礎上進行了增強並且釋出了商業版本。Hadoop 商業發行版的提供者通過優化核心程式碼、增強易用性、提供技術支援和持續版本升級為Hadoop 平臺實現了許多新功能。市場上受認可的Hadoop 商業發行版的提供者主要有Cloudera 、MapR 和Hortonworks ,這三家公司都把Hadoop核心框架打包到了他們的商業版本中;在這基礎上,他們都提供了技術支援服務和定製化開發服務。

  • Cloudera和MapR的發行版是收費的,他們基於開源技術,提高穩定性,同時強化了一些功能,定製化程度較高,核心技術是不公開的,營收主要來自軟體收入。這類公司,如果一直保持技術領先性,那麼軟體收入溢價空間很大。但一旦技術落後於開源社群,整個產品需要進行較大調整。

  • Hortonworks則走向另一條路,他們將核心技術完全公開,用於推動Hadoop社群的發展。這樣做的好處是,如果開源技術有很大提升,他們受益最大,因為定製化程度較少,自身不會受到技術提升的衝擊。

Cloudera — CDH

Cloudera 是Hadoop領域知名的公司和市場領導者,提供了市場上第一個Hadoop商業發行版本。它擁有350多個客戶並且活躍於Hadoop生態系統開源社群。在多個創新工具的貢獻著排行榜中,它都名列榜首。它的系統管控平臺——Cloudera Manager,易於使用、介面清晰,擁有豐富的資訊內容。Cloudera 專屬的叢集管控套件能自動化安裝部署叢集並且提供了許多有用的功能。同時,Cloudera 也提供諮詢服務來解決各類機構關於在資料管理方案中如何使用Hadoop技術以及開源社群有哪些新內容等疑慮。** **

Hadoop 優缺點

  • Hadoop優點(4高) \1. 高可靠性:Hadoop底層維護多個數據副本,所以即使Hadoop某個計算元素或儲存出現故障,也不會導致資料的丟失。 \2. 高擴充套件性:能在廉價機器組成的叢集間分配任務資料,可方便的擴充套件數以幹計的節點。 \3. 高效性:在MapReduce的思想下,Hadoop是並行工作的,以加快任務處理速度。 \4. 高容錯性:能夠自動將失敗的任務重新分配。

  • Hadoop的缺點 \1. 不適合低延時資料訪問,比如毫秒級的儲存資料,是做不到的。 \2. 無法高效的對大量小檔案進行儲存。 3.不支援併發寫入、檔案隨機修改。

HDFS 分散式檔案系統

為了解決海量資料儲存問題, Google 開發了分散式檔案系統GFS 。HDFS 是GFS 的開源實現,它是Hadoop 的核心元件之一。HDFS 提供了在通用硬體叢集中進行分散式檔案儲存的能力,是一個高容錯性和高吞吐量的海量資料儲存解決方案

HDFS (Hadoop Distributed File system, Hadoop 分散式檔案系統)以流式資料訪問模式來儲存超大檔案,執行在由廉價普通機器組成的叢集上,是管理網路中跨多臺計算機儲存的檔案系統。它的基本原理是將檔案切分成同等大小的資料塊,儲存到多臺機器上,將資料切分、容錯、負載均衡等功能透明化

HDFS 上的檔案被劃分為相同大小的多個block塊,以塊作為獨立的儲存單位。[ Hadoop 2.x 預設大小是128M,Hadoop 1.x 是 64M ]

  1. 大檔案用一個節點是存不下來的,勢必分成塊。.

  2. 網路傳輸時萬一巖掉,可以小部分重傳。

  3. 簡化了儲存管理,同時元資料就不需要和塊一儲存了,用一個單獨的系統就可以管理這些塊的元資料。

所以block 塊是HDFS 中最基本的儲存單位。預設塊大小是可以修改的,可以通過 dfs.block.size 設定。

除了將檔案分塊, 每個塊檔案也有副本,這是為了容錯性。當一個機器掛了,想要恢復裡面的檔案,就可以去其他機器找檔案的副本。預設是三個副本,也可通過 hdfs-site.xml 中的 replication 屬性修改副本數量。

HDFS 體系結構

HDFS 採用主從( Master/Slave )架構模型,分為NameNode (名稱節點)、SecondaryNameNode(第二名稱節點)、DataNode (資料節點)這幾個角色。

一個典型的HDFS 叢集是由 NameNode 、SecondaryNameNode 和若干個DataNode (通常大於3 個)組成的,通常是一個節點一個機器,它來管理對應節點的儲存。

  • NameNode:主要負責檔案系統名稱空間的管理、儲存檔案目錄的Metadata 元資料資訊,主要包括檔案目錄、block 塊和檔案對應關 系,以及block 塊和DataNode 資料節點的對應關係。

  • DataNode:負責儲存客戶端( Client )發來的Block 資料塊,執行資料塊的讀寫操作。

  • Block:檔案切分成塊(預設大小128M),以塊為單位,每個塊有多個副本儲存在不同的機器上,為了增加可靠性,每一個檔案切片都會有3個副本。

  • SecondaryNameNode:用來監控 HDFS 狀態的輔助後臺程式,每隔一段時間獲取HDFS資料的快照。用來減少NameNode 的工作量,定期與NameNode通訊進行元資料更新。也可以在NameNode重啟的時候,能夠快速恢復啟動。

NameNode元資料管理機制

HDFS 叢集的名稱空間是由NameNode 來儲存的。NameNode 使用Fslmage 和EditLog 兩個核心的資料結構,EditLog 事務日誌檔案記錄每一個對檔案系統元資料的改變,如在HDFS 中建立一個新的檔案,名稱節點將會在EditLog 中插入一條記錄來記錄這個改變。整個名稱空間的資訊包括檔案塊的對映表等都存放在Fslmage 檔案中。

名稱節點啟動時,它將從磁碟中讀取Fslmage 和EditLog ,將EditLog 中的所有事務應用到Fslmage,然後將新的Fslmage 重新整理到本地磁碟中,因為事務己經被處理井已經持久化到Fslmage中,然後就可以截去舊的EditLog 。這個過程叫作檢查點。

Fslmage 和Editlog 是HDFS 的重要資料結構,如果這些檔案損壞,就會導致整個叢集的失效。因此可以配置成複製多個Fslmage 和EditLog 的副本, 一般會在本地磁碟和網路檔案系統NFS 中分別存放。

SecondaryNameNode 是HDFS 架構中的一個組成部分,它用來儲存名稱節點中對HDFS 元資料資訊的備份,減小Editlog 檔案大小,從而縮短名稱節點重啟的時間。它一般是單獨執行在一臺機器上。

  1. SecondaryNameNode 會定期和NameNode 通訊,請求其停止使用EditLog 檔案,暫時將新的寫操作寫到一個新的檔案edit.new 中,這個操作是瞬間完成的,上層寫日誌的函式完全感覺不到差別。

  2. SecondaryNameNode 通過HTTP 方式從NameNode 上獲取到Fslmage 和EditLog 檔案,井下載到本地的相應目錄下。

  3. SecondaryNameNode 將下載下來的Fslmage 載入到記憶體,然後一條一條地執行EditLog檔案中的各項更新操作,使記憶體中的Fslmage 保持最新。

  4. SecondaryNameNode 執行完 3 操作之後,會通過post 方式將新的Fslmage 檔案傳送到NameNode 節點上。

  5. NameNode 將從SecondaryNameNode 接收到的新的Fslmage 替換舊的Fslmage 檔案,同時將Edit.new 替換EditLog 檔案,從而減小EditLog 檔案大小。

第二名稱節點相當於為名稱節點設定一個“檢查點” ,週期性備份名稱節點中的元資料資訊,但第二名稱節點在HDFS 設計中只是一個冷備份,並不能起到“熱備份”的作用。HDFS 設計並不支援當名稱節點故障時直接切換到第二名稱節點。

Hadoop環境搭建

Hadoop 是 一個用 Java 語言實現的開源軟體框架,Hadoop的核心就是HDFSMapReduceYARN。HDFS為海量資料提供了儲存,MapReduce為海量資料提供了計算框架,YARN把計算框架與資源管理徹底分離,統一管理計算框架的資源排程

所需軟體列表

軟體型別名稱
VMware虛擬機器 VMware-workstation-full-14.0.0-6661328.exe
Linux 作業系統 CentOS-7-x86_64-DVD-1810.iso
MobaXterm 終端模擬器 MobaXterm_20.0漢化.rar
JDK Java 語言的軟體開發工具包 jdk-8u251-linux-x64.tar.gz
Hadoop 分散式系統基礎架構 hadoop-2.7.3.tar.gz

安裝 MobaXterm 終端模擬器

直接在虛擬機器上進行命令操作和檔案修改比較麻煩,通過一個仿終端工具來操作,提高效率,使用也更加方便。當然使用 XShell6 也是可以的。MobaXterm 是免費的,不過它的介面是英文的,初次使用可能不會太方便,我們這裡提供一箇中文漢化版,直接解壓到指定目錄即可使用。

熟悉 MobaXterm 工具,並建立一個會話,連線上述 Liunx 系統。

環境準備

Hadoop2.7.3 環境搭建官方地址

安裝虛擬機器和Linux作業系統,配置IP地址、主機名、防火牆、地址對映等

# 修改 ens32 虛擬網絡卡的IP地址
[root@node01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32
IPADDR="192.168.242.101" # 把 IP 地址修改為 101 ,儲存退出
# 重啟網路
[root@node01 ~]# systemctl restart network
# 修改主機名,永久(靜態)修改 hostnamectl set-hostname node01 | echo node01 > /etc/hostname
[root@node01 ~]# vim /etc/hostname
node01
# 新增主機訪問虛擬機器的地址對映,HDFS節點訪問和外部Web介面訪問HDFS都會用到 | echo 192.168.242.101 node01 >> /etc/hosts
[root@node01 ~]# vim /etc/hosts
192.168.242.101 node01
# 關閉防火牆,禁用開機啟動,Web介面訪問Hadoop相關介面不會被攔截
[root@node01 ~]# firewall-cmd --state # 檢視防火牆狀態
[root@node01 ~]# systemctl stop firewalld # 關閉防火牆
[root@node01 ~]# systemctl disable firewalld # 禁用防火牆開機啟動
# 關閉 SELinux 安全子系統
[root@node01 ~]# vim /etc/selinux/config
#把 SELINUX=enforcing 改為 SELINUX=disabled
[root@node01 ~]# reboot 重啟系統 / poweroff 關機
#####################測試配置是否生效#################################
[root@node01 ~]# firewall-cmd --state # 檢視防火牆狀態
not running
# 修改宿主機 hosts 對映,新增虛擬機器訪問對映名 node01
$ C:\Windows\System32\drivers\etc\hosts
192.168.242.101 node01

安裝 JDK 與 Hadoop

使用 MobaXterm 遠端連線虛擬機器,進入 /usr/local 目錄,進行 JDKHadoop 安裝。

# 解壓jdk 1.8
[root@node01 local]# tar -zxvf jdk-8u251-linux-x64.tar.gz

# 重新命名解壓資料夾為 jdk ,方便後續配置和訪問
[root@node01 local]# mv jdk1.8.0_251/ jdk

# 解壓hadoop 2.7.3
[root@node01 local]# tar -zxvf hadoop-2.7.3.tar.gz

# 重新命名解壓資料夾為 hadoop ,方便後續配置和訪問
[root@node01 local]# mv hadoop-2.7.3 hadoop

# 配置 JDK 和 Hadoop 環境變數
[root@node01 local]# vim /etc/profile
# JAVA_HOME
export JAVA_HOME=/usr/local/jdk/
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/usr/local/hadoop/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# 重新載入 環境變數配置檔案
[root@node01 local]# source /etc/profile

# 使用命令測試 java 環境是否配置正確
[root@node01 local]# java -version
java version "1.8.0_251"

# 使用命令測試 hadoop 環境是否配置正確
[root@node01 local]# hadoop version
Hadoop 2.7.3

配置 Hadoop 偽分散式環境

使用 MobaXterm 工具進行 Hadoop 配置檔案編輯,/usr/local/hadoop/etc/hadoop/

  • 修改 hadoop-env.sh 設定 Hadoop 環境對應的 JDK

export JAVA_HOME=/usr/local/jdk
  • 修改 core-site.xml 配置檔案

<configuration>
<!--NameNode的訪問URI,也可以寫為IP,8020為預設埠-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:8020</value>
</property>

<!--臨時資料目錄,用來存放資料,格式化時會自動生成-->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data/tmp</value>
</property>
</configuration>
  • 修改 hdfs-site.xml 配置檔案

<configuration>
<!--Block的副本數,偽分散式要改為1-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>

<!--NameNode 元資料存放地址-->
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/data/namenode</value>
</property>

<!--DataNode 副本存放地址-->
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/data/datanode</value>
</property>

<!--HDFS 臨時存放地址-->
<property>
<name>dfs.tmp.dir</name>
<value>/usr/local/hadoop/data/tmp</value>
</property>

<!--配置有secondarynamenode的主機-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node01:50090</value>
</property>
</configuration>
  • 修改 slaves 配置檔案

# 替換 slaves 中的節點名稱
[root@node01 local]# echo node01 > /usr/local/hadoop/etc/hadoop/slaves
  • 格式化HDFS並啟動

# 格式化 HDFS ,由於已經配置過 Hadoop 的 bin 環境變數,則該命令可以在任意目錄下執行
[root@node01 local]# hdfs namenode -format

# 啟動 HDFS 分散式檔案系統 - 啟動 namenode 元資料節點,負責管理檔案切片儲存
sbin/hadoop-daemon.sh start namenode

# 啟動 datanode 副本節點,負責儲存檔案切片,定時傳送心跳和塊狀態報告
sbin/hadoop-daemon.sh start datanode

# 啟動 secondarynamenode 映象備份節點,同步元資料和操作日誌
sbin/hadoop-daemon.sh start secondarynamenode

# 檢視所有 java 程序,驗證 HDFS 的節點是否啟動成功
[root@node01 local]# jps
12176 DataNode
12085 NameNode
12270 SecondaryNameNode
12318 Jps

HDFS 的Web 管理介面

HDFS 提供了Web 管理介面,可以很方便地檢視HDFS 相關資訊,在瀏覽器位址列中輸入HDFS 的NameNodeWeb 訪問地址,埠號為預設埠是 50070 ,如圖所示。

可以使用 IP 地址訪問 HDFS Web ,也可使用之前在 window 系統中配置的 hosts 對映名稱 node01

在瀏覽器位址列中輸入HDFS 的 SecondaryNameNode 的Web 訪問地址,埠號為預設埠是 50090 ,如圖所示。

HDFS 操作常用shell 命令

我們可以利用HDFS shell 命令對 Hadoop 進行操作,利用這些命令可以完成 HDFS 中文件的上傳、下載、複製、檢視檔案資訊、格式化名稱節點等操作。在終端輸入命令, 檢視 hdfs dfs 總共支援哪些操作。

可以看出hdfs dfs 命令的統一格式類似“ hdfs dfs -ls ”這種形式,即在“ - ”後面跟上具體的操作,絕大部分功能與Linux命令相似。需要檢視某個命令的作用時,可以使用 hdfs dfs -help ls 檢視。

[root@node01 ~]# vim hello.txt   # 建立檔案
[root@node01 ~]# hdfs dfs -mkdir /input # HDFS上建立資料夾 hadoop fs -mkdir /input
[root@node01 ~]# hdfs dfs -put ./hello.txt /input # 將檔案上傳到HDFS
[root@node01 ~]# hdfs dfs -ls /input # 檢視
[root@node01 ~]# hdfs dfs -cat /input/hello.txt # 本地檢視
[root@node01 ~]# hdfs dfs -rm /input/hello.txt # 刪除
[root@node01 ~]# hdfs dfs -rm -r /input 遞迴刪除

# 迴圈檢視目錄資訊
[root@node01 ~]# hdfs dfs -ls -R /

也可以通過 WebUI介面檢視

YARN與MapRedcue

Hadoop YARN(Yet Another Resource Negotiator的縮寫)是Hadoop的資源管理器系統,YARN 從Hadoop 2 引入,設計YARN 的最初目的是改善 MapReduce 的實現。後來YARN演變為一種資源排程框架,具有通用性,可為上層應用提供統一的資源管理和排程,可以支援其他的分散式計算模型(如Spark)。它的引用為叢集在利用率、資源統一管理和資料共享方面帶來了巨大的好處

它的基本設計思想是將MapRrsource V1.0 中的 JobTracker 拆分成了兩個獨立的服務:一個全域性的資源管理器 ResourceManager 和每個應用程式特有的 ApplicationMaster 。其中 ResourceManager 負責整個系統的資源管理和分配,而 ApplicationMaster 負責單個應用程式的管理。

YARN 架構概述

下圖所示是YARN的架構圖,它由 Container、ResourceManager、NodeManager、ApplicationMaster 幾個主要部分組成。

  • ResourceManager:負責整個系統的資源分配和管理,是一個全域性的資源管理器。

  • ApplicationMaser: 管理一個在 YARN 內執行的應用程式的每個例項,負責協調來自 ResourceManager 的資源,與NodeManager 通訊監視容器的執行和資源使用(CPU、記憶體等的資源分配)。

  • NodeManager: NodeManager 管理一個 YARN 叢集中的每個節點。它定時向 ResourceManager 彙報本節點上的資源使用情況和各個Container 的執行狀態,接收並處理來自 ApplicationManager 的 Container 啟動/停止等請求。

  • Container: 是 YARN 中的資源抽象,它封裝了某個節點上的多維度資源。如記憶體、CPU、磁碟、網路等,當ApplicationManager 向 ResourceManager 申請資源時,ResourceManager 為ApplicationManager 返回的資源便是用Container表示。YARN會為每個任務分配一個Container,且該任務只能使用該Container中描述的資源。

MapReduce概述

MapReduce 是 Google 公司開源的一項重要技術,它是一個程式設計模型,用以進行大資料量的計算。MapReduce 是一種簡化的平行計算程式設計模型,它使那些沒有多少平行計算經驗的開發人員也可以開發並行應用程式。

MapReduce 採用 “分而治之”思想,把對大規模資料集的操作,分發給一個主節點管理下的各個位元組點共同完成,然後整合各個位元組點的中間結果,得到最終的計算結果。簡而言之,MapReduce 就是“分散任務,彙總結果”,“分而治之,聚而合之”。

MapReduce的特點

  1. 易於程式設計。用它的一些簡單介面,就可以完成一個分散式程式,這個分散式程式可以分佈到大量廉價的 PC 上執行。也就是說寫一個分散式程式,跟寫一個簡單的序列程式是一樣的。也是因為這個特點,使得 MapReduce 程式設計變得非常流行。

  2. 良好的擴充套件性。當計算資源不能得到滿足的時候,可以通過簡單地增加計算機來擴充套件它的計算能力。

  3. 高容錯性。設計MapReduce 的初衷就是使程式能夠部署在廉價的 PC 上,這就要求它具有很高的容錯性。比如一臺主機出問題了,它可以把上面的計算任務轉移到另外一個節點上執行,不至於使這個任務執行失敗,而且這個過程不需要人工干預,完全由MapReduce 在內部完成。

  4. 能對PB級以上海量資料進行離線處理。MapReduce 適合離線處理而不適合實時處理。比如毫秒級別地返回一個結果,MapReduce 很難

MapReduce 不擅長的場景

  1. 實時計算:MapReduce 無法像 MySQL 一樣,在毫秒或秒級內返回結果。

  2. 流式計算:流式計算的輸入資料式動態的,而 MapReduce 的輸入資料集是靜態的,不能動態變化。比如:實時計算 Web Server 產生的日誌,這是 MapReduce 不擅長的。

  3. DAG(有向圖)計算:多個應用程式存在依賴關係,後一個應用程式的輸入為前一個的輸出。在這種情況下,MapRedice 並不是不能做,而是使用 MapReduce 做完後,每個MapReduce作業的輸出結果都會寫入磁碟,會製作大量的磁碟 I/O,降低效能。

MapReduce 程式設計模型

從MapReduce 自身的命名特點可以看出,MapReduce 至少由兩部分組成:Map 和 Reduce。Map理解為“對映”,Reduce理解為“化簡”。使用者只需要編寫 map() 和 reduce() 兩個方法,即可完成簡單的分散式程式的設計。

MapReduce 執行過程簡要說明如下

  1. 讀取 HDFS 檔案內容,把內容中的每一行解析成一個個的<key, value >鍵值對。key是每行行首相對於檔案起始位置的位元組偏移量,value 就是具體的值,一個檔案切片對應一個 map task ,每讀取一行就會呼叫一次 map

  2. 自定義 map 函式,編寫自己的業務邏輯,對輸入的<key, value>處理,轉換成新的<key,value>輸出作為中間結果,每一個 map task 都是相互獨立的,互不干擾

  3. 為了讓 reduce 可以並行處理 map 的結果,根據業務要求需要對 map 的輸出進行一定的分割槽( Partition) 對不同分割槽上的資料,按照 key 進行排序分組,相同 key的value 放到一個集合中,把分組後的資料進行歸約。每個 reduce 會接收各個map中相同分割槽中的資料,對多個 map任務的輸出,按照不同的分割槽通過網路 copy 到不同 reduce 節點。這個過程稱為 Shuffle洗牌 ,即Shuffle就是把我們 map 中的資料分發到 reduce 中去的一個過程。

  4. 自定義 reduce 函式,編寫自己的業務邏輯,對輸入的<key,value>鍵值對進行處理,轉換成新的<key,value>輸出,reduce 預設分割槽規則:key.hashcode() % reduce 數量 = 分割槽號,reduce task 數量我們可以設定的,預設是1 ,job.setNumReduceTasks(3);

  5. 把 reduce 的輸出儲存到新的檔案中。

MapReduce 要求<key , value>的key 和value都要實現 Writable 介面,從而支援Hadoop的序列化和反序列化。

MapReduce 處理的資料都是HDFS的資料(或 HBase)。

配置YARN和MapReduce環境

通過設定一些引數並另外執行ResourceManager守護程式和NodeManager守護程式,以偽分散式模式在YARN上執行MapReduce作業。

  • yarn-env.sh、mapred-env.sh 新增 JAVA_HOME 配置

export JAVA_HOME=/usr/local/jdk
  • mapred-site.xml ,把 mapred-sit.xml.template 複製一份,修改為 mapred-site.xml 並新增如下資訊。

<configuration>
<!---計算框架的執行平臺配置 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
  • yarn-site.xml 新增相應配置

<configuration>
<!---YARN 的節點輔助服務配置 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<!--預設是0.0.0.0 本地訪問-->
<value>node01</value>
</property>
</configuration>
  • slaves 配置 IP 地址或主機名,它指定了 DataNodeNodeManager所在的機器。DataNode一般和NodeManager在同一臺機器上。

node01
  • 啟動 yarn 中的 resourcemanagernodemanager

# 啟動資全域性源管理器
[root@node01 ~]# yarn-daemon.sh start resourcemanager

# 啟動節點資源管理器
[root@node01 ~]# yarn-daemon.sh start nodemanager

# 檢視啟動的所有 Java 程序
[root@node01 ~]# jps
16768 SecondaryNameNode
17601 ResourceManager
16579 DataNode
17875 Jps
17835 NodeManager
16477 NameNode
  • 訪問 YARN 的Web UI介面,驗證是否配置成功,預設埠號是 8088**``**

MapReduce 經典入門案例 - WordCount 程式

WordCount 案例是大資料平行計算的經典案例,它實現的主要功能是統計文字中每個單詞出現的次數。

  1. 案例目錄:/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar

  2. 資料準備:在 ~ 目錄下建立一個words.txt 檔案,並錄入要統計的單詞資訊,注意以空格分隔

  3. 把測試資料上傳到 HDFS 上,因為 MapReduce 是讀取不到本地資料的:hdfs dfs -put ./words.txt /input

  4. 使用 yarn 命令來執行 mapreduce 程式:mapreduce程式的結果輸出目錄不能提前存在,如果存在就報錯 yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input/words.txt /output

  5. 檢視執行結果 : hdfs dfs -text /output/part-r-00000

    hdfs dfs ---->> hadoop fs

歷史服務和日誌聚合

歷史服務:檢視已經執行完成的MapReduce作業記錄,比如本次作業用了多少Mapper、Reducer,還能看到作業提交時間、作業啟動時間、作業完成時間等資訊。

  • 配置日誌伺服器

  1. 修改 yarn-site.xml 檔案

<!--啟用日誌聚合功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<!--日誌保留時間,單位秒-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
  1. 修改 mapred-site.xml 檔案

<!--JobHistory服務的IPC地址(IPC:Inter-Process Communication程序間通訊)-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node01:10020</value>
</property>

<!--日誌的web訪問地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node01:19888</value>
</property>
  • 重啟 YARN 服務

[root@node01 ~]# stop-yarn.sh  
[root@node01 ~]# start-yarn.sh
[root@node01 ~]# mr-jobhistory-daemon.sh start historyserver
  • 再次執行任務,必需改變輸出目錄

[root@node01 ~]# yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input/words /output/words
[root@node01 ~]# hdfs dfs -text /output/words/part*

需要在(注意:是Windows目錄,而不是Linux)C:\Windows\System32\drivers\etc裡面的hosts檔案裡新增對映 192.168.242.131 node01

此時再點選 history,就能看到結果。

SSH 遠端登入安全協議

SSH(Secure Shell)是建立在應用層和傳輸層基礎上的安全協議。SSH是目前較可靠,專為遠端登陸會話和其他網路服務提供安全性的協議。利用SSH協議可以有效防止遠端管理過程中的資訊洩露問題。

在Hadoop中,我們啟動HDFS時,是 NameNodeDataNodeSecondaryNameNode 依次啟動,關閉依然,那麼可不可以一個命令搞定呢?答案是肯定的,使用 sbin/start-dfs.sh,但是每一個服務啟動都需要輸入一次密碼,比較麻煩,我們就可以使用 SSH 遠端登入安全協議配置免密登入

# 在/root/.ssh/目錄下會生成 id_rsa(私鑰)、id_rsa.pub(公鑰)
[root@node01 ~]# ssh-keygen # 4個回車
# 拷貝公鑰到其它機器上,用於免密訪問
[root@node01 ~]# ssh-copy-id node01 # 每臺機器都執行一次,則對應的公鑰資訊會儲存在 /root/.ssh/authorized_keys 檔案中
# 驗證免密登入配置
[root@node01 ~]# ssh node01 # 使用 ssh 登入到 node01
[root@node01 ~]# exit # 退出 node01 訪問
# Hadoop 一個命名啟動 或 停止 HDFS所有節點
[root@node01 ~]# start-dfs.sh