第1章 Hadoop概述
1.1 Hadoop是什麼
1.2 Hadoop發展曆史(了解)
1.3 Hadoop三大發行版本(了解)
Hadoop三大發行版本:Apache、Cloudera、Hortonworks。
Apache版本最原始(最基礎)的版本,對于入門學習最好。2006
Cloudera内部內建了很多大資料架構,對應産品CDH。2008
Hortonworks文檔較好,對應産品HDP。2011
Hortonworks現在已經被Cloudera公司收購,推出新的品牌CDP。
1)Apache Hadoop
官網位址:http://hadoop.apache.org
下載下傳位址:https://hadoop.apache.org/releases.html
2)Cloudera Hadoop
官網位址:https://www.cloudera.com/downloads/cdh
下載下傳位址:https://docs.cloudera.com/documentation/enterprise/6/release-notes/topics/rg_cdh_6_download.html
(1)2008年成立的Cloudera是最早将Hadoop商用的公司,為合作夥伴提供Hadoop的商用解決方案,主要是包括支援、咨詢服務、教育訓練。
(2)2009年Hadoop的創始人Doug Cutting也加盟Cloudera公司。Cloudera産品主要為CDH,Cloudera Manager,Cloudera Support
(3)CDH是Cloudera的Hadoop發行版,完全開源,比Apache Hadoop在相容性,安全性,穩定性上有所增強。Cloudera的标價為每年每個節點10000美元。
(4)Cloudera Manager是叢集的軟體分發及管理監控平台,可以在幾個小時内部署好一個Hadoop叢集,并對叢集的節點及服務進行實時監控。
3)Hortonworks Hadoop
官網位址:https://hortonworks.com/products/data-center/hdp/
下載下傳位址:https://hortonworks.com/downloads/#data-platform
(1)2011年成立的Hortonworks是雅虎與矽谷風投公司Benchmark Capital合資組建。
(2)公司成立之初就吸納了大約25名至30名專門研究Hadoop的雅虎工程師,上述工程師均在2005年開始協助雅虎開發Hadoop,貢獻了Hadoop80%的代碼。
(3)Hortonworks的主打産品是Hortonworks Data Platform(HDP),也同樣是100%開源的産品,HDP除常見的項目外還包括了Ambari,一款開源的安裝和管理系統。
(4)2018年Hortonworks目前已經被Cloudera公司收購。
1.4 Hadoop優勢(4高)
1.5 Hadoop組成(面試重點)
1.5.1 HDFS架構概述
Hadoop Distributed File System,簡稱HDFS,是一個分布式檔案系統。
1.5.2 YARN架構概述
Yet Another Resource Negotiator簡稱YARN ,另一種資源協調者,是Hadoop的資料總管。
1.5.3 MapReduce架構概述
MapReduce将計算過程分為兩個階段:Map和Reduce
1)Map階段并行處理輸入資料
2)Reduce階段對Map結果進行彙總
1.5.4 HDFS、YARN、MapReduce三者關系
1.6 大資料技術生态體系
圖中涉及的技術名詞解釋如下:
1)Sqoop:Sqoop是一款開源的工具,主要用于在Hadoop、Hive與傳統的資料庫(MySQL)間進行資料的傳遞,可以将一個關系型資料庫(例如:MySQL,Oracle 等)中的資料導進到Hadoop的HDFS中,也可以将HDFS的資料導進到關系型資料庫中。
2)Flume:Flume是一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸的系統,Flume支援在日志系統中定制各類資料發送方,用于收集資料;
3)Kafka:Kafka是一種高吞吐量的分布式釋出訂閱消息系統;
4)Spark:Spark是目前最流行的開源大資料記憶體計算架構。可以基于Hadoop上存儲的大資料進行計算。
5)Flink:Flink是目前最流行的開源大資料記憶體計算架構。用于實時計算的場景較多。
6)Oozie:Oozie是一個管理Hadoop作業(job)的工作流程排程管理系統。
7)Hbase:HBase是一個分布式的、面向列的開源資料庫。HBase不同于一般的關系資料庫,它是一個适合于非結構化資料存儲的資料庫。
8)Hive:Hive是基于Hadoop的一個資料倉庫工具,可以将結構化的資料檔案映射為一張資料庫表,并提供簡單的SQL查詢功能,可以将SQL語句轉換為MapReduce任務進行運作。其優點是學習成本低,可以通過類SQL語句快速實作簡單的MapReduce統計,不必開發專門的MapReduce應用,十分适合資料倉庫的統計分析。
9)ZooKeeper:它是一個針對大型分布式系統的可靠協調系統,提供的功能包括:配置維護、名字服務、分布式同步、組服務等。
1.7 推薦系統架構圖
第2章 Hadoop運作環境搭建(開發重點)
2.1 模闆虛拟機環境準備
0)安裝模闆虛拟機,IP位址192.168.10.100、主機名稱hadoop100、記憶體4G、硬碟50G
1)hadoop100虛拟機配置要求如下(本文Linux系統全部以CentOS-7.5-x86-1804為例)
(1)使用yum安裝需要虛拟機可以正常上網,yum安裝前可以先測試下虛拟機聯網情況
[[email protected] ~]# ping www.baidu.com
PING www.baidu.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=128 time=8.60 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=128 time=7.72 ms
(2)安裝epel-release
注:Extra Packages for Enterprise Linux是為“紅帽系”的作業系統提供額外的軟體包,适用于RHEL、CentOS和Scientific Linux。相當于是一個軟體倉庫,大多數rpm包在官方 repository 中是找不到的)
[[email protected] ~]# yum install -y epel-release
(3)注意:如果Linux安裝的是最小系統版,還需要安裝如下工具;如果安裝的是Linux桌面标準版,不需要執行如下操作
- net-tool:工具包集合,包含ifconfig等指令
[[email protected] ~]# yum install -y net-tools
- vim:編輯器
[[email protected] ~]# yum install -y vim
2)關閉防火牆,關閉防火牆開機自啟
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld.service
注意:在企業開發時,通常單個伺服器的防火牆時關閉的。公司整體對外會設定非常安全的防火牆
3)建立atguigu使用者,并修改atguigu使用者的密碼
[[email protected] ~]# useradd atguigu
[[email protected] ~]# passwd atguigu
4)配置atguigu使用者具有root權限,友善後期加sudo執行root權限的指令
[[email protected] ~]# vim /etc/sudoers
修改/etc/sudoers檔案,在%wheel這行下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
atguigu ALL=(ALL) NOPASSWD:ALL
注意:atguigu這一行不要直接放到root行下面,因為所有使用者都屬于wheel組,你先配置了atguigu具有免密功能,但是程式執行到%wheel行時,該功能又被覆寫回需要密碼。是以atguigu要放到%wheel這行下面。
5)在/opt目錄下建立檔案夾,并修改所屬主和所屬組
(1)在/opt目錄下建立module、software檔案夾
[[email protected] ~]# mkdir /opt/module
[[email protected] ~]# mkdir /opt/software
(2)修改module、software檔案夾的所有者和所屬組均為atguigu使用者
[[email protected] ~]# chown atguigu:atguigu /opt/module
[[email protected] ~]# chown atguigu:atguigu /opt/software
(3)檢視module、software檔案夾的所有者和所屬組
[[email protected] ~]# cd /opt/
[[email protected] opt]# ll
總用量12
drwxr-xr-x. 2 atguigu atguigu 4096 5月 28 17:18 module
drwxr-xr-x. 2 root root 4096 9月 7 2017 rh
drwxr-xr-x. 2 atguigu atguigu 4096 5月 28 17:18 software
6)解除安裝虛拟機自帶的JDK
注意:如果你的虛拟機是最小化安裝不需要執行這一步。
[[email protected] ~]# rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
- rpm -qa:查詢所安裝的所有rpm軟體包
- grep -i:忽略大小寫
- xargs -n1:表示每次隻傳遞一個參數
- rpm -e –nodeps:強制解除安裝軟體
7)重新開機虛拟機
[[email protected] ~]# reboot
2.2 克隆虛拟機
1)利用模闆機hadoop100,克隆三台虛拟機:hadoop102 hadoop103 hadoop104
注意:克隆時,要先關閉hadoop100
2)修改克隆機IP,以下以hadoop102舉例說明
(1)修改克隆虛拟機的靜态IP
[[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
改成
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
NAME="ens33"
IPADDR=192.168.10.102
PREFIX=24
GATEWAY=192.168.10.2
DNS1=192.168.10.2
(2)檢視Linux虛拟機的虛拟網絡編輯器,編輯->虛拟網絡編輯器->VMnet8
(3)檢視Windows系統擴充卡VMware Network Adapter VMnet8的IP位址
(4)保證Linux系統ifcfg-ens33檔案中IP位址、虛拟網絡編輯器位址和Windows系統VM8網絡IP位址相同。
3)修改克隆機主機名,以下以hadoop102舉例說明
(1)修改主機名稱
[[email protected] ~]# vim /etc/hostname
hadoop102
(2)配置Linux克隆機主機名稱映射hosts檔案,打開/etc/hosts
[[email protected] ~]# vim /etc/hosts
添加如下内容
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
4)重新開機克隆機hadoop102
[[email protected] ~]# reboot
5)修改windows的主機映射檔案(hosts檔案)
(1)如果作業系統是window7,可以直接修改
(a)進入C:\Windows\System32\drivers\etc路徑
(b)打開hosts檔案并添加如下内容,然後儲存
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
(2)如果作業系統是window10,先拷貝出來,修改儲存以後,再覆寫即可
(a)進入C:\Windows\System32\drivers\etc路徑
(b)拷貝hosts檔案到桌面
(c)打開桌面hosts檔案并添加如下内容
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
(d)将桌面hosts檔案覆寫C:\Windows\System32\drivers\etc路徑hosts檔案
2.3 在hadoop102安裝JDK
1)解除安裝現有JDK
注意:安裝JDK前,一定確定提前删除了虛拟機自帶的JDK。詳細步驟見問文檔3.1節中解除安裝JDK步驟。
2)用XShell傳輸工具将JDK導入到opt目錄下面的software檔案夾下面
3)在Linux系統下的opt目錄中檢視軟體包是否導入成功
[[email protected] ~]$ ls /opt/software/
看到如下結果:
jdk-8u212-linux-x64.tar.gz
4)解壓JDK到/opt/module目錄下
[[email protected] software]$ tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
5)配置JDK環境變量
(1)建立/etc/profile.d/my_env.sh檔案
[[email protected] ~]$ sudo vim /etc/profile.d/my_env.sh
添加如下内容
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
(2)儲存後退出
:wq
(3)source一下/etc/profile檔案,讓新的環境變量PATH生效
[[email protected] ~]$ source /etc/profile
6)測試JDK是否安裝成功
[[email protected] ~]$ java -version
如果能看到以下結果,則代表Java安裝成功。
java version "1.8.0_212"
注意:重新開機(如果java -version可以用就不用重新開機)
[[email protected] ~]$ sudo reboot
2.4 在hadoop102安裝Hadoop
Hadoop下載下傳位址:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/
1)用XShell檔案傳輸工具将hadoop-3.1.3.tar.gz導入到opt目錄下面的software檔案夾下面
2)進入到Hadoop安裝包路徑下
[[email protected] ~]$ cd /opt/software/
3)解壓安裝檔案到/opt/module下面
[[email protected] software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
4)檢視是否解壓成功
[[email protected] software]$ ls /opt/module/
hadoop-3.1.3
5)将Hadoop添加到環境變量
(1)擷取Hadoop安裝路徑
[[email protected] hadoop-3.1.3]$ pwd
/opt/module/hadoop-3.1.3
(2)打開/etc/profile.d/my_env.sh檔案
[at[email protected] hadoop-3.1.3]$ sudo vim /etc/profile.d/my_env.sh
- 在my_env.sh檔案末尾添加如下内容:(shift+g)
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
- 儲存并退出::wq
(3)讓修改後的檔案生效
[[email protected] hadoop-3.1.3]$ source /etc/profile
6)測試是否安裝成功
[[email protected] hadoop-3.1.3]$ hadoop version
Hadoop 3.1.3
7)重新開機(如果Hadoop指令不能用再重新開機虛拟機)
[[email protected] hadoop-3.1.3]$ sudo reboot
2.5 Hadoop目錄結構
1)檢視Hadoop目錄結構
[[email protected] hadoop-3.1.3]$ ll
總用量52
drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 bin
drwxr-xr-x. 3 atguigu atguigu 4096 5月 22 2017 etc
drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 include
drwxr-xr-x. 3 atguigu atguigu 4096 5月 22 2017 lib
drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 libexec
-rw-r--r--. 1 atguigu atguigu 15429 5月 22 2017 LICENSE.txt
-rw-r--r--. 1 atguigu atguigu 101 5月 22 2017 NOTICE.txt
-rw-r--r--. 1 atguigu atguigu 1366 5月 22 2017 README.txt
drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 sbin
drwxr-xr-x. 4 atguigu atguigu 4096 5月 22 2017 share
2)重要目錄
(1)bin目錄:存放對Hadoop相關服務(hdfs,yarn,mapred)進行操作的腳本
(2)etc目錄:Hadoop的配置檔案目錄,存放Hadoop的配置檔案
(3)lib目錄:存放Hadoop的本地庫(對資料進行壓縮解壓縮功能)
(4)sbin目錄:存放啟動或停止Hadoop相關服務的腳本
(5)share目錄:存放Hadoop的依賴jar包、文檔、和官方案例
第3章 Hadoop運作模式
1)Hadoop官方網站:http://hadoop.apache.org/
2)Hadoop運作模式包括:本地模式、僞分布式模式以及完全分布式模式。
- 本地模式:單機運作,隻是用來示範一下官方案例。生産環境不用。
- 僞分布式模式:也是單機運作,但是具備Hadoop叢集的所有功能,一台伺服器模拟一個分布式的環境。個别缺錢的公司用來測試,生産環境不用。
- 完全分布式模式:多台伺服器組成分布式環境。生産環境使用。
3.1 本地運作模式(官方WordCount)
1)建立在hadoop-3.1.3檔案下面建立一個wcinput檔案夾
[[email protected] hadoop-3.1.3]$ mkdir wcinput
2)在wcinput檔案下建立一個word.txt檔案
[[email protected] hadoop-3.1.3]$ cd wcinput
3)編輯word.txt檔案
[[email protected] wcinput]$ vim word.txt
- 在檔案中輸入如下内容
hadoop yarn
hadoop mapreduce
atguigu
atguigu
- 儲存退出::wq
4)回到Hadoop目錄/opt/module/hadoop-3.1.3
5)執行程式
[[email protected] hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput(輸入路徑) wcoutput(輸出路徑)
6)檢視結果
[[email protected] hadoop-3.1.3]$ cat wcoutput/part-r-00000
看到如下結果:
atguigu 2
hadoop 2
mapreduce 1
yarn 1
3.2 完全分布式運作模式(開發重點)
分析:
1)準備3台客戶機(關閉防火牆、靜态IP、主機名稱)
2)安裝JDK
3)配置環境變量
4)安裝Hadoop
5)配置環境變量
6)配置叢集
7)單點啟動
8)配置ssh
9)群起并測試叢集
3.2.1 虛拟機準備
詳見2.1、2.2兩節。
3.2.2 編寫叢集分發腳本xsync
1)scp(secure copy)安全拷貝
(1)scp定義
scp可以實作伺服器與伺服器之間的資料拷貝。(from server1 to server2),(簡單說就是把一台虛拟機的内容服務到其他的虛拟機上)
(2)基本文法
scp -r $pdir/$fname $user@$host:$pdir/$fname
指令 遞歸 要拷貝的檔案路徑/名稱 目的地使用者@主機:目的地路徑/名稱
(3)案例實操
- 前提:在hadoop102、hadoop103、hadoop104都已經建立好的/opt/module、 /opt/software兩個目錄,并且已經把這兩個目錄修改為atguigu:atguigu
[[email protected] ~]$ sudo chown atguigu:atguigu -R /opt/module
- 在hadoop102上,将hadoop102中/opt/module/jdk1.8.0_212目錄拷貝到hadoop103上。
[[email protected] ~]$ scp -r /opt/module/jdk1.8.0_212 [email protected]:/opt/module
- 在hadoop103上,将hadoop102中/opt/module/hadoop-3.1.3目錄拷貝到hadoop103上。rm -rf jdk1.8.0_212/
[[email protected] ~]$ scp -r [email protected]:/opt/module/hadoop-3.1.3 /opt/module/
- 在hadoop103上操作,将hadoop102中/opt/module目錄下所有目錄拷貝到hadoop104上。
[[email protected] opt]$ scp -r [email protected]:/opt/module/* [email protected]:/opt/module
2)rsync遠端同步工具
rsync主要用于備份和鏡像。具有速度快、避免複制相同内容和支援符号連結的優點。
rsync和scp差別:用rsync做檔案的複制要比scp的速度快,rsync隻對差異檔案做更新。scp是把所有檔案都複制過去。(也就是兩個都是用了複制的,rsync效率更高,因為是差異複制,這兩個指令都要求目标路徑不存在,不然會報錯)
(1)基本文法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
指令 選項參數 要拷貝的檔案路徑/名稱 目的地使用者@主機:目的地路徑/名稱
選項參數說明(注意這裡-av是組合在一起的,不能拆開用)
選項 | 功能 |
-a | 歸檔拷貝 |
-v | 顯示複制過程 |
(2)案例實操
(a)删除hadoop103中/opt/module/hadoop-3.1.3/wcinput這個檔案
[[email protected] hadoop-3.1.3]$ rm -rf wcinput/
(b)同步hadoop102中的/opt/module/hadoop-3.1.3到hadoop103
[[email protected] module]$ rsync -av hadoop-3.1.3/ [email protected]:/opt/module/hadoop-3.1.3/
3)xsync叢集分發腳本
(1)需求:循環複制檔案到所有節點的相同目錄下(專門用了複制檔案的,可以把檔案從一個虛拟機複制到多台虛拟機的相同目錄下,通常在多個虛拟機的情況下每一個虛拟機都被稱為節點)
(2)需求分析:
(a)rsync指令原始拷貝(寫這個腳本的具體需求,這個操作不用寫,隻是根據這個來寫下面的腳本):
rsync -av /opt/module [email protected]:/opt/
(b)期望腳本:
xsync要同步的檔案名稱(例如xsync /home/saodai/bin)
(c)期望腳本在任何路徑都能使用(腳本放在聲明了全局環境變量的路徑)
[[email protected] ~]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/root/bin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin
這裡由于我沒有使用echo $PATH指令後全局環境變量沒有/home/saodai/bin,是以我把腳本都放在了/usr/local/bin裡面
(3)腳本實作
(a)在/home/atguigu/bin目錄下建立xsync檔案(也就是一個腳本)
[[email protected] opt]$ cd /home/saodai/bin
[[email protected] bin]$ vim xsync
在xsync檔案中編寫如下代碼(看完這個代碼可以發現xsync底層還是rsync,這個腳本的作用就是把目前節點Hadoop102的檔案同步到Hadoop103、Hadoop104上)
#!/bin/bash
#1. 判斷參數個數 $#是擷取輸入的參數個數
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 周遊叢集所有機器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 周遊所有目錄,挨個發送 $@是擷取所有的值,可以了解為一個host數組
for file in $@
do
#4. -e是判斷檔案是否存在
if [ -e $file ]
then
#5. 擷取父目錄 ;就是指的這是兩句合在一起的,先執行前面這句
pdir=$(cd -P $(dirname $file); pwd)
#6. basename是擷取目前檔案的名稱
fname=$(basename $file)
#7.ssh是連接配接其他虛拟機的指令,然後強制建立目錄(-p是強制的意思)
ssh $host "mkdir -p $pdir"
#8.使用rsync複制到其他節點
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
(b)修改腳本 xsync 具有執行權限
[[email protected] bin]$ chmod +x xsync
(c)測試腳本(編寫腳本并且配置環境變量後就可以把這個腳本當指令來用,後面接的路徑就是要同步到其他節點的檔案的路徑)
[[email protected] ~]$ xsync /root/bin
(d)将腳本複制到/bin中,以便全局調用
[[email protected] bin]$ cp xsync /root/bin/
(e)同步環境變量配置(例如之前的在hadoop102配置的jdk和hadoop的環境變量同步到hadoop102、hadoop103上面去)
[[email protected] ~]$xsync /etc/profile.d/my_env.sh
注意:如果用了sudo,那麼xsync一定要給它的路徑補全。
讓環境變量生效(這裡我沒有這一步,應該是直接用的root權限)
[[email protected] bin]$ source /etc/profile
[[email protected] opt]$ source /etc/profile
3.2.3 SSH無密登入配置
1)配置ssh(隻有執行了ssh後在home路徑下找到.ssh【要用ls -al檢視】-al是指的檢視隐藏檔案)
(1)基本文法
ssh另一台電腦的IP位址
(2)ssh連接配接時出現Host key verification failed的解決方法
[[email protected] ~]$ ssh hadoop103
- 如果出現如下内容
Are you sure you want to continue connecting (yes/no)?
- 輸入yes,并回車
(3)退回到hadoop102
[[email protected] ~]$ exit
2)無密鑰配置
(1)免密登入原理
(2)生成公鑰和私鑰
[[email protected] .ssh]$ pwd
/home/atguigu/.ssh
[[email protected] .ssh]$ ssh-keygen -t rsa
然後敲(三個回車),就會生成兩個檔案id_rsa(私鑰)、id_rsa.pub(公鑰),(要到這個.ssh路徑下才可以執行這兩個指令)
(3)将公鑰拷貝到要免密登入的目标機器上
[[email protected] .ssh]$ ssh-copy-id hadoop102
[[email protected] .ssh]$ ssh-copy-id hadoop103
[[email protected] .ssh]$ ssh-copy-id hadoop104
注意:
還需要在hadoop103上采用atguigu賬号配置一下無密登入到hadoop102、hadoop103、hadoop104伺服器上。
還需要在hadoop104上采用atguigu賬号配置一下無密登入到hadoop102、hadoop103、hadoop104伺服器上。
還需要在hadoop102上采用root賬号,配置一下無密登入到hadoop102、hadoop103、hadoop104;
(4)測試連接配接其他虛拟機
[[email protected] ~]$ ssh hadoop102
Last login: Sat Feb 25 12:01:02 2023 from hadoop104
[[email protected] ~]$ ssh hadoop104
Last login: Sat Feb 25 12:01:40 2023 from hadoop102
[[email protected] ~]$
- .ssh檔案夾下(~/.ssh)的檔案功能解釋
known_hosts | 記錄ssh通路過計算機的公鑰(public key) |
id_rsa | 生成的私鑰 |
id_rsa.pub | 生成的公鑰 |
authorized_keys | 存放授權過的無密登入伺服器公鑰 |
3.2.4 叢集配置
1)叢集部署規劃
注意:
- NameNode和SecondaryNameNode不要安裝在同一台伺服器
- ResourceManager也很消耗記憶體,不要和NameNode、SecondaryNameNode配置在同一台機器上。
hadoop102 | hadoop103 | hadoop104 | |
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
2)配置檔案說明
Hadoop配置檔案分兩類:預設配置檔案和自定義配置檔案,隻有使用者想修改某一預設配置值時,才需要修改自定義配置檔案,更改相應屬性值。(這四個核心配置檔案在hadoop安裝目錄下的/etc/hadoop目錄)
(1)預設配置檔案:
要擷取的預設檔案 | 檔案存放在Hadoop的jar包中的位置 |
[core-default.xml] | hadoop-common-3.1.3.jar/core-default.xml |
[hdfs-default.xml] | hadoop-hdfs-3.1.3.jar/hdfs-default.xml |
[yarn-default.xml] | hadoop-yarn-common-3.1.3.jar/yarn-default.xml |
[mapred-default.xml] | hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml |
(2)自定義配置檔案:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四個配置檔案存放在$HADOOP_HOME/etc/hadoop這個路徑上,使用者可以根據項目需求重新進行修改配置。
3)配置叢集
(1)核心配置檔案(配置core-site.xml)
[[email protected] ~]$ cd $HADOOP_HOME/etc/hadoop
[[email protected] hadoop]$ vim core-site.xml
檔案内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<configuration>
<!-- 指定NameNode的位址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定hadoop資料的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS網頁登入使用的靜态使用者為saodai -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>saodai</value>
</property>
</configuration>
這裡注意在複制的時候要先從一般模式切換到寫入模式再複制進去,如果是在一般模式上寫有時候會丢失内容,這裡解釋一下上面的hadoop.http.staticuser.user配置的含義,不配這個的話,你在hadoop的hdfs提供的web頁面是沒有權限去删除裡面的檔案的,然後這個配置就是賦予你這個saodai角色的權限,這樣就可以在web頁面删除檔案了
(2)HDFS配置檔案(配置hdfs-site.xml)
[[email protected] hadoop]$ vim hdfs-site.xml
檔案内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<configuration>
<!-- nn web端通路位址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web端通路位址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
(3)YARN配置檔案(配置yarn-site.xml)
[[email protected] hadoop]$ vim yarn-site.xml
檔案内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<configuration>
<!-- 指定MR走shuffle協定 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的位址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 環境變量的繼承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME
</value>
</property>
</configuration>
(4)MapReduce配置檔案(配置mapred-site.xml)
[[email protected] hadoop]$ vim mapred-site.xml
檔案内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<configuration>
<!-- 指定MapReduce程式運作在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4)在叢集上分發配置好的Hadoop配置檔案(這裡我是切換到root賬号來同步的)
[atgui[email protected] hadoop]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/
5)去103和104上檢視檔案分發情況
[[email protected] ~]$ cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
[[email protected] ~]$ cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
3.2.5 群起叢集
1)配置workers
[[email protected] hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在該檔案中增加如下内容:
hadoop102
hadoop103
hadoop104
注意:該檔案中添加的内容結尾不允許有空格,檔案中不允許有空行。
同步所有節點配置檔案
[[email protected] hadoop]$ xsync /opt/module/hadoop-3.1.3/etc
2)啟動叢集
(1)初始化
如果叢集是第一次啟動,需要在hadoop102節點格式化NameNode
(注意:格式化NameNode,會産生新的叢集id,導緻NameNode和DataNode的叢集id不一緻,叢集找不到已往資料。如果叢集在運作過程中報錯,需要重新格式化NameNode的話,一定要先停止namenode和datanode程序,并且要删除所有機器的data和logs目錄,然後再進行格式化)
[[email protected] hadoop-3.1.3]$ hdfs namenode -format
(2)啟動HDFS
[[email protected] hadoop-3.1.3]$ sbin/start-dfs.sh
(3)在配置了ResourceManager的節點啟動YARN(注意這個指令是在hadoop103上面執行)
[[email protected] hadoop-3.1.3]$ sbin/start-yarn.sh
(4)Web端檢視HDFS的NameNode
(a)浏覽器中輸入:http://hadoop102:9870
(b)檢視HDFS上存儲的資料資訊
(5)Web端檢視YARN的ResourceManager
(a)浏覽器中輸入:http://hadoop103:8088
(b)檢視YARN上運作的Job資訊
3)叢集如果缺少namenode、datanode等等其他的節點,沒有啟動起來的解決辦法
1、首先進入到hadoop的sbin目錄下來停止所有的服務
(注意:格式化NameNode會産生新的NameNode,然後NameNode的id會變,導緻NameNode和DataNode的叢集id不一緻,叢集找不到已往資料。如果叢集在運作過程中報錯,需要重新格式化NameNode的話,一定要先停止namenode和datanode程序,并且要删除所有機器的data和logs目錄,然後再進行格式化)
2、删除每一個節點的data和logs(注意是每一個節點)
3、格式化namenode節點
4、重新啟動hdfs和yarn節點
5、所有節點運作情況
4)叢集基本測試
(1)上傳檔案到叢集
- 上傳小檔案
[[email protected] ~]$ hadoop fs -mkdir /input
[[email protected] ~]$ hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input
- 上傳大檔案
[[email protected] ~]$ hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /
(2)上傳檔案後檢視檔案存放在什麼位置
- 檢視HDFS檔案存儲路徑
[[email protected] subdir0]$ pwd
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1436128598-192.168.10.102-1610603650062/current/finalized/subdir0/subdir0
- 檢視HDFS在磁盤存儲檔案内容
[[email protected] subdir0]$ cat blk_1073741825
hadoop yarn
hadoop mapreduce
atguigu
atguigu
(3)拼接
cat blk_1073741836>>tmp.tar.gz和cat blk_1073741837>>tmp.tar.gz是把這兩個拼接成一個jdk壓縮包,然後解壓發現就是上傳的jdk壓縮包,是以可以确定hdfs實際上内容存儲的位置就是在這裡。這裡為什麼會把jdk的壓縮包分為兩部分呢?原因就是在hadoop裡存儲的容量是128MB為一個塊,然後jdk的壓縮包有180MB,是以一個塊存不下,需要兩個塊,注意塊的序号是從0開始的
-rw-rw-r--. 1 atguigu atguigu 134217728 5月 23 16:01 blk_1073741836
-rw-rw-r--. 1 atguigu atguigu 1048583 5月 23 16:01 blk_1073741836_1012.meta
-rw-rw-r--. 1 atguigu atguigu 63439959 5月 23 16:01 blk_1073741837
-rw-rw-r--. 1 atguigu atguigu 495635 5月 23 16:01 blk_1073741837_1013.meta
[[email protected] subdir0]$ cat blk_1073741836>>tmp.tar.gz
[[email protected] subdir0]$ cat blk_1073741837>>tmp.tar.gz
[[email protected] subdir0]$ tar -zxvf tmp.tar.gz
(4)下載下傳
[[email protected] software]$ hadoop fs -get /jdk-8u212-linux-x64.tar.gz ./
(5)執行wordcount程式
[[email protected] hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
3.2.6 配置曆史伺服器
為了檢視程式的曆史運作情況,需要配置一下曆史伺服器。具體配置步驟如下:
1)配置mapred-site.xml(先執行cd $HADOOP_HOME/etc/hadoop)
[[email protected] hadoop]$ vim mapred-site.xml
在該檔案裡面增加如下配置。
<!-- 曆史伺服器端位址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 曆史伺服器web端位址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
2)分發配置
[[email protected] hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
3)在hadoop102啟動曆史伺服器(如果啟動了yarn就需要先停止然後再啟動,因為配置檔案改了)
[[email protected] hadoop]$ mapred --daemon start historyserver
4)檢視曆史伺服器是否啟動
[[email protected] hadoop]$ jps
5)檢視JobHistory
http://hadoop102:19888/jobhistory
3.2.7 配置日志的聚集
日志聚集概念:應用運作完成以後,将程式運作日志資訊上傳到HDFS系統上。
日志聚集功能好處:可以友善的檢視到程式運作詳情,友善開發調試。
注意:開啟日志聚集功能,需要重新啟動NodeManager 、ResourceManager和HistoryServer。
開啟日志聚集功能具體步驟如下:
1)配置yarn-site.xml
[[email protected] hadoop]$ vim yarn-site.xml
在該檔案裡面增加如下配置。
<!-- 開啟日志聚集功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 設定日志聚集伺服器位址-->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 設定日志保留時間為7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2)分發配置
[atguig[email protected] hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
3)關閉NodeManager 、ResourceManager和HistoryServer
[[email protected] hadoop-3.1.3]$ sbin/stop-yarn.sh
//停止曆史伺服器
[atg[email protected] hadoop-3.1.3]$ mapred --daemon stop historyserver
4)啟動NodeManager 、ResourceManage和HistoryServer
[[email protected] ~]$ start-yarn.sh
[[email protected] ~]$ mapred --daemon start historyserver
5)删除HDFS上已經存在的輸出檔案
[[email protected] ~]$ hadoop fs -rm -r /output
6)執行WordCount程式
[[email protected] hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
7)檢視日志
(1)曆史伺服器位址
http://hadoop102:19888/jobhistory
(2)曆史任務清單
(3)檢視任務運作日志
(4)運作日志詳情
3.2.8 叢集啟動/停止方式總結
1)各個子產品分開啟動/停止(配置ssh是前提)常用
(1)整體啟動/停止HDFS
start-dfs.sh/stop-dfs.sh
(2)整體啟動/停止YARN
start-yarn.sh/stop-yarn.sh
2)各個服務元件逐一啟動/停止
(1)分别啟動/停止HDFS元件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
(2)啟動/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
3.2.9 編寫Hadoop叢集常用腳本
1)Hadoop叢集啟停腳本(包含HDFS,Yarn,Historyserver):myhadoop.sh
[[email protected] ~]$ cd /usr/local/bin(這裡由于我沒有使用echo $PATH指令後全局環境變量沒有/home/saodai/bin,是以我把腳本都放在了/usr/local/bin裡面)
[[email protected] bin]$ vim myhadoop.sh
- 輸入如下内容
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 啟動 hadoop叢集 ==================="
echo " --------------- 啟動 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 啟動 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 啟動 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 關閉 hadoop叢集 ==================="
echo " --------------- 關閉 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 關閉 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 關閉 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
- 儲存後退出,然後賦予腳本執行權限
[[email protected] bin]$ chmod +x myhadoop.sh
2)檢視三台伺服器Java程序腳本:jpsall
[[email protected] ~]$ cd /usr/local/bin
[[email protected] bin]$ vim jpsall
- 輸入如下内容
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
- 儲存後退出,然後賦予腳本執行權限
[[email protected] bin]$ chmod +x jpsall
3)分發/usr/local/bin目錄,保證自定義腳本在三台機器上都可以使用
[[email protected] ~]$ xsync /usr/local/bin
3.2.10 常用端口号說明
端口名稱 | Hadoop2.x | Hadoop3.x |
NameNode内部通信端口 | 8020 / 9000 | 8020 / 9000/9820 |
NameNode HTTP UI(對外暴露的給使用者使用的web頁面的端口号) | 50070 | 9870 |
MapReduce檢視執行任務端口 | 8088 | 8088 |
曆史伺服器通信端口 | 19888 | 19888 |
3.2.11 叢集時間同步
如果伺服器在公網環境(能連接配接外網),可以不采用叢集時間同步,因為伺服器會定期和公網時間進行校準;
如果伺服器在内網環境,必須要配置叢集時間同步,否則時間久了,會産生時間偏差,導緻叢集執行任務時間不同步。
1)需求
找一個機器,作為時間伺服器,所有的機器與這台叢集時間進行定時的同步,生産環境根據任務對時間的準确程度要求周期同步。測試環境為了盡快看到效果,采用1分鐘同步一次。
2)時間伺服器配置(必須root使用者)
(1)檢視所有節點ntpd服務狀态和開機自啟動狀态
[[email protected] ~]$ sudo systemctl status ntpd
[[email protected] ~]$ sudo systemctl start ntpd
[[email protected] ~]$ sudo systemctl is-enabled ntpd
(2)修改hadoop102的ntp.conf配置檔案
[[email protected] ~]$ sudo vim /etc/ntp.conf
修改内容如下
(a)修改1(授權192.168.10.0-192.168.10.255網段上的所有機器可以從這台機器上查詢和同步時間)
#restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
為restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
(b)修改2(叢集在區域網路中,不使用其他網際網路上的時間)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
為
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
(c)添加3(當該節點丢失網絡連接配接,依然可以采用本地時間作為時間伺服器為叢集中的其他節點提供時間同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改hadoop102的/etc/sysconfig/ntpd 檔案
[[email protected] ~]$ sudo vim /etc/sysconfig/ntpd
增加内容如下(讓硬體時間與系統時間一起同步)
SYNC_HWCLOCK=yes
(4)重新啟動ntpd服務
[[email protected] ~]$ sudo systemctl start ntpd
(5)設定ntpd服務開機啟動
[[email protected] ~]$ sudo systemctl enable ntpd
3)其他機器配置(必須root使用者)
(1)關閉所有節點上ntp服務和自啟動
[[email protected] ~]$ sudo systemctl stop ntpd
[[email protected] ~]$ sudo systemctl disable ntpd
[[email protected] ~]$ sudo systemctl stop ntpd
[[email protected] ~]$ sudo systemctl disable ntpd
(2)在其他機器配置1分鐘與時間伺服器同步一次
[[email protected] ~]$ sudo crontab -e
編寫定時任務如下:
*/1 * * * * /usr/sbin/ntpdate hadoop102
(3)修改任意機器時間
[[email protected] ~]$ sudo date -s "2021-9-11 11:11:11"
(4)1分鐘後檢視機器是否與時間伺服器同步
[[email protected] ~]$ sudo date
學習位址:https://www.bilibili.com/video/BV1Qp4y1n7EN?p=37
第4章 常見錯誤及解決方案
1)防火牆沒關閉、或者沒有啟動YARN
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主機名稱配置錯誤
3)IP位址配置錯誤
4)ssh沒有配置好
5)root使用者和atguigu兩個使用者啟動叢集不統一
6)配置檔案修改不細心
7)不識别主機名稱
java.net.UnknownHostException: hadoop102: hadoop102
at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:146)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
解決辦法:
(1)在/etc/hosts檔案中添加192.168.10.102 hadoop102
(2)主機名稱不要起hadoop hadoop000等特殊名稱
8)DataNode和NameNode程序同時隻能工作一個(這個可以參考3.2.5的第三點解決)
9)執行指令不生效,粘貼Word中指令時,遇到-和長–沒區分開。導緻指令失效
解決辦法:盡量不要粘貼Word中代碼。
10)jps發現程序已經沒有,但是重新啟動叢集,提示程序已經開啟。
原因是在Linux的根目錄下/tmp目錄中存在啟動的程序臨時檔案,将叢集相關程序删除掉,再重新啟動叢集。
11)jps不生效
原因:全局變量hadoop java沒有生效。解決辦法:需要source /etc/profile檔案。
12)8088端口連接配接不上
[[email protected] 桌面]$ cat /etc/hosts
注釋掉如下代碼
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 hadoop102
回爐重造位址:https://www.bilibili.com/video/BV1Qp4y1n7EN?p=38&vd_source=eb68502f30a10ee7e5e6328b4db887ac