Hadoop入門學習筆記(一)
Week2 學習筆記
Hadoop核心元件
-
Hadoop HDFS(分散式檔案儲存系統):解決海量資料儲存
-
Hadoop YARN(叢集資源管理和任務排程框架):解決資源任務排程
-
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 node2
、ssh-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中的預設配置。
-
core-site.xml 核心模組配置
-
hdfs-site.xml hdfs檔案系統模組配置
-
mapred-site.xml MapReduce模組配置
-
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校驗,確保資料傳輸安全
讀資料完整流程圖
-
HDFS客戶端建立物件例項DistributedFileSystem, 呼叫該物件的open()方法來開啟希望讀取的檔案。
-
DistributedFileSystem使用RPC呼叫namenode來確定檔案中前幾個塊的塊位置(分批次讀取)資訊。 對於每個塊,namenode返回具有該塊所有副本的datanode位置地址列表,並且該地址列表是排序好的,與客戶端的 網路拓撲距離近的排序靠前。
-
DistributedFileSystem將FSDataInputStream輸入流返回到客戶端以供其讀取資料。
-
客戶端在FSDataInputStream輸入流上呼叫read()方法。然後,已儲存DataNode地址的InputStream連線到檔案 中第一個塊的最近的DataNode。資料從DataNode流回客戶端,結果客戶端可以在流上重複呼叫read()
-
當該塊結束時,FSDataInputStream將關閉與DataNode的連線,然後尋找下一個block塊的最佳datanode位置。 這些操作對使用者來說是透明的。所以使用者感覺起來它一直在讀取一個連續的流。 客戶端從流中讀取資料時,也會根據需要詢問NameNode來檢索下一批資料塊的DataNode位置資訊。
-
一旦客戶端完成讀取,就對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檔案中。