1. 程式人生 > 其它 >Hadoop入門學習筆記(一)

Hadoop入門學習筆記(一)

Week2 學習筆記

Hadoop核心元件

  1. Hadoop HDFS(分散式檔案儲存系統):解決海量資料儲存

  2. Hadoop YARN(叢集資源管理和任務排程框架):解決資源任務排程

  3. Hadoop MapReduce(分散式計算框架):解決海量資料計算

安裝hadoop環境

叢集角色規劃

伺服器 執行角色
node1 namenode datanode resourcemanager nodemanager
node2 secondarynamenode datanode nodemanager
node3 datanode nodemanager

伺服器基礎環境搭建

下載vmware workstation pro

https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html

百度搜一個金鑰用

金鑰 ZF3R0-FHED2-M80TY-8QYGC-NPKYF

下載centos 7系統映象檔案

https://www.centos.org/download/

在vmware安裝一臺centos 7 虛擬機器 並克隆兩臺


克隆兩臺

進入虛擬機器 修改主機名

檢視當前主機名指令: cat /etc/hostname

修改當前主機名指令:vim /etc/hostname

:wq

儲存後重新載入該配置

重新載入配置指令source /etc/hostname

修改host對映 方便後面操作 省的一直輸ip地址

修改指令vim /etc/hosts

檢視指令cat /etc/hosts

ps:檢視你主機的ip地址指令:ifconfig

防火牆關閉(3臺機器)

systemctl stop firewalld.service關閉防火牆

systemctl disable firewalld.service禁止防火牆開啟自啟

ssh免密登入(node1執行->node1|node2|node3)

ssh-keygen #4個回車 生成公鑰、私鑰 ssh-copy-id node1

ssh-copy-id node2ssh-copy-id node3

叢集時間同步(3臺機器)

yum -y install ntpdate 安裝ntpdate

ntpdate ntp4.aliyun.com從阿里雲同步

建立統一工作目錄(3臺機器)

mkdir -p /export/server/#軟體安裝路徑

mkdir -p /export/data/ #資料儲存路徑

mkdir -p /export/software/ #安裝包存放路徑

jdk安裝

jdk安裝詳細過程 https://www.cnblogs.com/stulzq/p/9286878.html

上傳、解壓Hadoop安裝包(node1) 上傳可以用rz命令或你的連線工具如finalshell自帶的

cd /export/server 進入目錄

tar zxvf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz解壓事先準備好的hadoop安裝包

Hadoop安裝包目錄結構

第一類1個:hadoop-env.sh

第二類4個:

xxxx-site.xml ,site表示的是使用者定義的配置,會覆蓋default中的預設配置。

  1. core-site.xml 核心模組配置

  2. hdfs-site.xml hdfs檔案系統模組配置

  3. mapred-site.xml MapReduce模組配置

  4. yarn-site.xml yarn模組配置

第三類1個:workers

所有的配置檔案目錄:/export/server/hadoop-3.3.0/etc/hadoop

編輯Hadoop配置檔案

hadoop-env.sh

export JAVA_HOME=/export/server/jdk1.8.0_241
#檔案最後新增
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

core-site.xml

!-- 設定預設使用的檔案系統 Hadoop支援file、HDFS、GFS、ali|Amazon雲等檔案系統 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
<!-- 設定Hadoop本地儲存資料路徑 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/data/hadoop-3.3.0</value>
</property>
<!-- 設定HDFS web UI使用者身份 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!-- 整合hive 使用者代理設定 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<!-- 垃圾桶檔案儲存時間 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>

hdfs-site.xml

<!-- 設定SNN程序執行機器位置資訊 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:9868</value>
</property>

mapred-site.xml

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MR程式歷史伺服器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<!-- 歷史伺服器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

yarn-site.xml

<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 是否將對容器實施實體記憶體限制 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!-- 是否將對容器實施虛擬記憶體限制。 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 開啟日誌聚集 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 設定yarn歷史伺服器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
</property>
<!-- 儲存的時間7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>

workers

node1
node2
node3

分發同步安裝包

在node1機器上將Hadoop安裝包scp同步到其他機器

cd /export/server
scp -r hadoop-3.3.0 root@node2:$PWD
scp -r hadoop-3.3.0 root@node3:$PWD

在node1上配置Hadoop環境變數

vim /etc/profile
export HADOOP_HOME=/export/server/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

將修改後的環境變數同步其他機器

scp /etc/profile root@node2:/etc/
scp /etc/profile root@node3:/etc/

重新載入環境變數 驗證是否生效(3臺機器)

source /etc/profile
hadoop #驗證環境變數是否生效

NameNode format(格式化操作)

首次啟動HDFS時,必須對其進行格式化操作。
format本質上是初始化工作,進行HDFS清理和準備工作

hdfs namenode -format

執行結果

PS:1. 首次啟動之前需要format操作; 2. format只能進行一次 後續不再需要; 3. 如果多次format除了造成資料丟失外,還會導致 hdfs叢集主從角色之間互不識別。通過刪除所有機 器hadoop.tmp.dir目錄重新format解決

安裝環境完成 進入使用階段

shell指令碼一鍵啟停

在node1上,使用軟體自帶的shell指令碼一鍵啟動。前提:配置好機器之間的SSH免密登入和workers檔案。

HDFS叢集

start-dfs.sh  

stop-dfs.sh  

YARN叢集

start-yarn.sh 

stop-yarn.sh 

Hadoop叢集

 start-all.sh 

stop-all.sh 

啟動完畢之後可以使用jps命令檢視程序是否啟動成功

Hadoop啟動日誌路徑:/export/server/hadoop-3.3.0/logs/

HDFS叢集UI頁面瀏覽

地址:http://namenode_host:9870

namenode用你指定的node替代

如http://node1:9870/dfshealth.html#tab-overview

HDFS檔案系統UI頁面瀏覽

YARN叢集 UI體驗

地址:http://resourcemanager_host:8088

其中resourcemanager_host是resourcemanager執行所在機器的主機名或者ip

如我訪問的就是http://node1:8088/cluster

HDFS 初體驗

shell命令操作

hadoop fs -mkdir /itcast
hadoop fs -put zookeeper.out /itcast
hadoop fs -ls /

Web UI頁面操作

執行Hadoop官方自帶的MapReduce案例,評估圓周率π的值。

cd /export/server/hadoop-3.3.0/share/hadoop/mapreduce/
hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 4

HDFS shell命令列常用操作

建立資料夾

hadoop fs -mkdir [-p] ...

path 為待建立的目錄

-p選項的行為與Unix mkdir -p非常相似,它會沿著路徑建立父目錄

檢視指定目錄下內容

hadoop fs -ls [-h] [-R] [ ...]

path 指定目錄路徑

-h 人性化顯示檔案size

-R 遞迴檢視指定目錄及其子目錄

上傳檔案到HDFS指定目錄下

hadoop fs -put [-f] [-p] ...

-f 覆蓋目標檔案(已存在下)

-p 保留訪問和修改時間,所有權和許可權

localsrc 本地檔案系統(客戶端所在機器)

dst 目標檔案系統(HDFS)

檢視HDFS檔案內容

hadoop fs -cat ...

讀取指定檔案全部內容,顯示在標準輸出控制檯。 注意:對於大檔案內容讀取,慎重。

下載HDFS檔案

hadoop fs -get [-f] [-p] ...

下載檔案到本地檔案系統指定目錄

-f 覆蓋目標檔案(已存在下)

-p 保留訪問和修改時間,所有權和許可權。

拷貝HDFS檔案

hadoop fs -cp [-f] ...

-f 覆蓋目標檔案(已存在下)

追加資料到HDFS檔案中

hadoop fs -appendToFile ...

將所有給定本地檔案的內容追加到給定dst檔案。 dst如果檔案不存在,將建立該檔案。 如果為-,則輸入為從標準輸入中讀取。

HDFS資料移動操作

hadoop fs -mv ...

移動檔案到指定資料夾下 可以使用該命令移動資料,重新命名檔案的名稱

各個角色

官方架構圖

主角色:namenode

  • NameNode是Hadoop分散式檔案系統的核心,架構中的主角色。

  • NameNode維護和管理檔案系統元資料,包括名稱空間目錄樹結構、檔案和塊的位置資訊、訪問許可權等資訊。

  • 基於此,NameNode成為了訪問HDFS的唯一入口。

  • NameNode內部通過記憶體和磁碟檔案兩種方式管理元資料。

  • 其中磁碟上的元資料檔案包括Fsimage記憶體元資料映象檔案和edits log(Journal)編輯日誌。

namenode職責

  • NameNode僅儲存HDFS的元資料:檔案系統中所有檔案的目錄樹,並跟蹤整個叢集中的檔案,不儲存實際資料。
  • NameNode知道HDFS中任何給定檔案的塊列表及其位置。使用此資訊NameNode知道如何從塊中構建檔案。
  • NameNode不持久化儲存每個檔案中各個塊所在的datanode的位置資訊,這些資訊會在系統啟動時從DataNode 重建。
  • NameNode是Hadoop叢集中的單點故障。
  • NameNode所在機器通常會配置有大量記憶體(RAM)。

從角色:datanode

  • DataNode是Hadoop HDFS中的從角色,負責具體的資料塊儲存。

  • DataNode的數量決定了HDFS叢集的整體資料儲存能力。

  • 通過和NameNode配合維護著資料塊。

datanode職責

  • DataNode負責最終資料塊block的儲存。是叢集的從角色,也稱為Slave。
  • DataNode啟動時,會將自己註冊到NameNode並彙報自己負責持有的塊列表。
  • 當某個DataNode關閉時,不會影響資料的可用性。 NameNode將安排由其他DataNode管理的塊進行副本複製 。
  • DataNode所在機器通常配置有大量的硬碟空間,因為實際資料儲存在DataNode中。

主角色輔助角色: secondarynamenode

  • Secondary NameNode充當NameNode的輔助節點,但不能替代NameNode。

  • 主要是幫助主角色進行元資料檔案的合併動作。可以通俗的理解為主角色的“祕書”

寫資料完整流程圖

核心概念--Pipeline管道

  • Pipeline,中文翻譯為管道。這是HDFS在上傳檔案寫資料過程中採用的一種資料傳輸方式。
  • 客戶端將資料塊寫入第一個資料節點,第一個資料節點儲存資料之後再將塊複製到第二個資料節點,後者儲存後將 其複製到第三個資料節點。

核心概念--ACK應答響應

  • ACK (Acknowledge character)即是確認字元,在資料通訊中,接收方發給傳送方的一種傳輸類控制字元。表示 發來的資料已確認接收無誤。
  • 在HDFS pipeline管道傳輸資料的過程中,傳輸的反方向會進行ACK校驗,確保資料傳輸安全

讀資料完整流程圖

  1. HDFS客戶端建立物件例項DistributedFileSystem, 呼叫該物件的open()方法來開啟希望讀取的檔案。

  2. DistributedFileSystem使用RPC呼叫namenode來確定檔案中前幾個塊的塊位置(分批次讀取)資訊。 對於每個塊,namenode返回具有該塊所有副本的datanode位置地址列表,並且該地址列表是排序好的,與客戶端的 網路拓撲距離近的排序靠前。

  3. DistributedFileSystem將FSDataInputStream輸入流返回到客戶端以供其讀取資料。

  4. 客戶端在FSDataInputStream輸入流上呼叫read()方法。然後,已儲存DataNode地址的InputStream連線到檔案 中第一個塊的最近的DataNode。資料從DataNode流回客戶端,結果客戶端可以在流上重複呼叫read()

  5. 當該塊結束時,FSDataInputStream將關閉與DataNode的連線,然後尋找下一個block塊的最佳datanode位置。 這些操作對使用者來說是透明的。所以使用者感覺起來它一直在讀取一個連續的流。 客戶端從流中讀取資料時,也會根據需要詢問NameNode來檢索下一批資料塊的DataNode位置資訊。

  6. 一旦客戶端完成讀取,就對FSDataInputStream呼叫close()方法

MapReduce學習

一個完整的MapReduce程式在分散式執行時有三類

  • MRAppMaster:負責整個MR程式的過程排程及狀態協調

  • MapTask:負責map階段的整個資料處理流程

  • ReduceTask:負責reduce階段的整個資料處理流程

示例 評估圓周率π(PI)的值

執行MapReduce程式評估一下圓周率的值,執行中可以去YARN頁面上觀察程式的執行的情況。

  • 第一個引數:pi表示MapReduce程式執行圓周率計算任務;

  • 第二個引數:用於指定map階段執行的任務task次數,併發度,這裡是10;

  • 第三個引數:用於指定每個map任務取樣的個數,這裡是50。

[root@node1 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 10 50

示例位置:/export/server/hadoop-3.3.0/share/hadoop/mapreduce



示例 wordcount單詞詞頻統計

  • 上傳文字檔案1.txt到HDFS檔案系統的/input目錄下,如果沒有這個目錄,使用shell建立

  • hadoop fs -mkdir /input 建立hdfs輸入目錄

  • hadoop fs -put 1.txt /input 提交檔案到hdfs檔案系統

  • 準備好之後,執行官方MapReduce例項,對上述檔案進行單詞次數統計

  • 第一個引數:wordcount表示執行單詞統計任務;

  • 第二個引數:指定輸入檔案的路徑;

  • 第三個引數:指定輸出結果的路徑(該路徑不能已存在)

[root@node1 mapreduce]# pwd
/export/server/hadoop-3.3.0/share/hadoop/mapreduce
[root@node1 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount 
/input /output

上傳到檔案系統

執行結果

第一個success沒用 只是一個成功失敗的標識 第二個part才是真正的結果

執行原理

map階段執行流程

  • 第一階段:把輸入目錄下檔案按照一定的標準逐個進行邏輯切片,形成切片規劃。 預設Split size = Block size(128M),每一個切片由一個MapTask處理。(getSplits)

  • 第二階段:對切片中的資料按照一定的規則讀取解析返回對。 預設是按行讀取資料。key是每一行的起始位置偏移量,value是本行的文字內容。(TextInputFormat)

  • 第三階段:呼叫Mapper類中的map方法處理資料。 每讀取解析出來的一個 ,呼叫一次map方法。

  • 第四階段:按照一定的規則對Map輸出的鍵值對進行分割槽partition。預設不分割槽,因為只有一個reducetask。 分割槽的數量就是reducetask執行的數量。

  • 第五階段:Map輸出資料寫入記憶體緩衝區,達到比例溢位到磁碟上。溢位spill的時候根據key進行排序sort。 預設根據key字典序排序。

  • 第六階段:對所有溢位檔案進行最終的merge合併,成為一個檔案。

reduce階段執行流程

  • 第一階段:ReduceTask會主動從MapTask複製拉取屬於需要自己處理的資料。

  • 第二階段:把拉取來資料,全部進行合併merge,即把分散的資料合併成一個大的資料。再對合並後的資料排序 。

  • 第三階段是對排序後的鍵值對呼叫reduce方法。鍵相等的鍵值對呼叫一次reduce方法。最後把這些輸出的鍵值對 寫入到HDFS檔案中。