內容包括:
(1)Hadoop的介紹
(2)集羣環境搭建準備工作
(3)Linux命令和Shell腳本增強
(4)集羣環境搭建
Hadoop學習(一)
1 大數據概述
大數據:就是對海量數據進行分析處理,得到一些有價值的信息,然後幫助企業做出判斷和決策。
處理流程:
- 獲取數據
- 處理數據
- 展示結果
2 Hadoop介紹
Hadoop是一個分佈式系基礎框架,它允許使用簡單的編程模型跨大型計算機的大型數據集進行分佈式處理。
它主要解決兩個問題:
- 大數據存儲問題: HDFS
- 大數據計算問題:MapReduce
2.1 問題一: 大文件怎麼存儲?
假設一個文件非常非常大,大小爲1PB, 大到世界上所有的高級計算機都存儲不下, 怎麼辦?
- 爲了保存大文件, 需要把文件放在多個機器上
- 文件要分塊 block(128M)
- 不同的塊放在不同的
HDFS
節點
- 同時爲了對外提供統一的訪問, 讓外部可以像是訪問本機一樣訪問分佈式文件系統
- 有一個統一的
HDFS Master
- 它保存整個系統的文件信息
- 所有的文件元數據的修改都從
Master
開始
- 有一個統一的
2.2 問題二: 大數據怎麼計算?
從一個網絡日誌文件中計算獨立 IP, 以及其出現的次數
如果數據量特別大,我們可以將,整個任務拆開, 劃分爲比較小的任務, 從而進行計算呢。
2.3 問題三: 如何將這些計算任務跑在集羣中?
如果能夠在不同的節點上並行執行, 更有更大的提升, 如何把這些任務跑在集羣中?
可以設置一個集羣的管理者, 這個地方叫做 Yarn
- 這個集羣管理者有一個
Master
, 用於接收和分配任務 - 這個集羣管理者有多個
Slave
, 用於運行任務
2.4 Hadoop 的組成
- Hadoop分佈式文件系統(HDFS) 提供對應用程序數據的高吞吐量訪問的分佈式文件系統
- Hadoop Common 其他Hadoop模塊所需的Java庫和實用程序。這些庫提供文件系統和操作系統級抽象,幷包含啓動Hadoop所需的必要Java文件和腳本
- Hadoop MapReduce 基於YARN的大型數據集並行處理系統
- Hadoop YARN 作業調度和集羣資源管理的框架
2 環境搭建
在 Hadoop 具體開始前, 先來搭建一下環境:
- 創建虛擬機
- 安裝虛擬機 VMWare
- 創建虛擬機
- 安裝 CentOS
- 組成集羣
- 配置每臺主機
- 關閉防火牆
- 關閉 SELinux
- 設置主機名
- 重啓
- 設置時鐘同步服務
- 配置用戶權限
- 免密登錄
- 安裝輔助軟件
- JDK
- Zookeeper
- 安裝 Hadoop
- 下載並解壓
- 修改配置
- 分發到每個節點
- 格式化 HDFS
- 啓動集羣
2.1 創建虛擬機
1:通過ISO鏡像安裝
2: 直接複製安裝好的虛擬機
注意事項:windows系統確認所有的關於VmWare的服務都已經啓動
確認好VmWare生成的網關地址,
另外確認VmNet8網卡已經配置好了IP地址。
- 網絡模式
- 內存設置
- 規劃集羣, 創建多臺虛擬機
2.2 網絡模式詳解
橋接
- 把虛擬出來的網卡直接連接外部的路由器, 看起來就好像是網絡中多出了一臺真正的計算機一樣
- 從路由器來看, 虛擬機等同於局域網內其它的物理機
NAT
- 在宿主機中創建一個子網, 把虛擬機放入子網中, 子網中有一個NAT服務
僅主機
- 創建子網, 把虛擬機放入這個子網
2.3 內存設置
- 需要三臺虛擬機, 並且需要同時運行, 所以總體上的佔用爲:
- 在分配的時候, 需要在總內存大小的基礎上, 減去1-2G作爲系統內存, 剩餘的除以3, 作爲每臺虛擬機的內存
2.4 集羣規劃
IP | 主機名 | 環境配置 | 安裝 |
---|---|---|---|
192.168.188.100 | node01 | 關防火牆和selinux, host映射, 時鐘同步 | JDK, NameNode, ResourceManager, Zookeeper |
192.168.188.110 | node02 | 關防火牆和selinux, host映射, 時鐘同步 | JDK, DataNode, NodeManager, Zeekeeper |
192.168.188.120 | node03 | 關防火牆和selinux, host映射, 時鐘同步 | JDK, DataNode, NodeManager, Zeekeeper |
2.5 設置網卡名
- 用
ifconfig
查看網卡名稱爲ens33,現在要將它修改成eth0
- 編輯配置文件
/etc/sysconfig/network-scripts/ifcfg-ens33
- 重命名該配置文件
cd /etc/sysconfig/network-scripts/
mv ifcfg-ens33 ifcfg-eth0
- 編輯
/etc/default/grub
並加入net.ifnames=0 biosdevname=0
5. 運行命令grub2-mkconfig -o /boot/grub2/grub.cfg
來重新生成GRUB配置並更新內核參數
6. 使用reboot
命令重啓操作系統
7. 再次查看網卡名稱
2.6 設置ip和Mac地址
- 更改mac地址:
vim /etc/udev/rules.d/70-persistent-net.rules
- 更改IP地址:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
,更改內容同2.5 - 修改主機名(重啓後永久生效)
vi /ect/sysconfig/network
,增加內容如下:
- 設置ip和域名映射
vim /etc/hosts
,增加內容如下:
5. 執行reboot
重啓,並執行ping www.baidu.com
看是否配置網絡成功
3 Liux常用的命令
3.1 查找命令
grep命令 命令是一種強大的文本搜索工具
格式: grep [option] pattern [file] 可使用 —help 查看更多參數。 使用實例:
ps -ef | grep sshd
查找指定 ssh 服務進程
ps -ef | grep sshd | grep -v grep
查找指定服務進程,排除 gerp 本身
grep -n 'hello' a.txt
從文件中查找關鍵詞,並顯示行號
find命令
find 命令在目錄結構中搜索文件,並對搜索結果執行指定的操作。
使用實例:
find . -name "*.log" -ls
在當前目錄查找以.log 結尾的文件, 並顯示詳細信息。
find /root/ -perm 777
查找/root/目錄下權限爲 777 的文件
find . -size +100M
查找當前目錄大於 100M 的文件
Locate命令
locate 讓使用者可以很快速的搜尋檔案系統內是否有指定的檔案。其方法
是先建立一個包括系統內所有檔案名稱及路徑的數據庫。之後當尋找時就只需查
詢這個數據庫( /var/lib/locatedb)。
Linux 系統自動創建這個數據庫, 默認每天自動更新一次,所以使用 locate
命令查不到最新變動過的文件。爲了避免這種情況,可以在使用 locate 之前,
先使用 updatedb 命令,手動更新數據庫。
yum -y install mlocate
使用實例:
locate /etc/sh
搜索 etc 目錄下所有以 sh 開頭的文件
locate pwd
查找和 pwd 相關的所有文件
3.2 用戶管理命令
添加普通用戶
useradd hadoop # 這個就表示我們創建了一個普通用戶
passwd hadoop # 表示我們需要給hadoop這個普通用戶分配一個密碼
切換用戶:
su - 用戶名
規則:(1)root用戶到其他用戶不需要輸入密碼,反之要輸入;(2) " - "可以理解爲切換用戶的同時切換環境,而不加它僅僅切換用戶。
3.3 用戶權限管理命令
chmod 777 a.txt
#表示給某個文件賦予所有人的所有權限
chmod u-x a.txt
#取消a.txt文件,用戶“執行”權限
chmod g+x a.txt
#添加a.txt文件,組“執行”權限
chown -R hadoop:hadoop a.txt
改變某個文件或者文件夾的所屬的用戶以及用戶組
3.4 系統服務命令
service iptables status
#查看防火牆狀態
service iptables stop
#關閉防火牆
service --status-all
# 查看系統所有的後臺服務進程
service sshd status
# 查看指定的後臺服務進程的狀態
service sshd stop
service sshd start
service sshd restart
配置後臺服務進程的開機自啓或關閉
chkconfig iptables on
#配置防火牆開機開啓
chkconfig iptables off
#配置防火牆開機關閉
chkconfig httpd on
## 讓 httpd 服務開機自啓
chkconfig httpd off
## 讓 httpd 服務開機不要自啓
4 Linux的Shell編程
Shell 編程一般指 shell 腳本編程。
語法:
使用 vi 編輯器新建一個文件 hello.sh
#!/bin/bash
echo "Hello World !"
執行:
方式1:
sh hello.sh
方式2
chmod +x ./hello.sh #使腳本具有執行權限
./hello.sh #執行腳本
4.1 變量
局部變量
#!/bin/bash
str="hello"
echo ${str}world
環境變量
可以自己設置新的環境變量,通過export key=value
完成設置。
之後,先通過source /etc/profile
使生效,再通過env
命令查詢所有環境變量:
ps:可以通過echo $PATH
、echo $HOME
打印某一環境變量的值
4.2 特殊字符
命令 | 作用 |
---|---|
$# | 傳遞到腳本的參數個數 |
$* | 以一個單字符串顯示所有向腳本傳遞的參數。 |
$$ | 腳本運行的當前進程 ID 號 |
$! | 後臺運行的最後一個進程的 ID 號 |
$@ | 與$*相同,但是使用時加引號,並在引號中返回每個參數。 |
$? | 顯示最後命令的退出狀態。 0 表示沒有錯誤,其他任何值表明有錯誤。 |
#!/bin/bash
echo "第一個參數爲: $1";
echo "參數個數爲: $#";
echo "傳遞的參數作爲一個字符串顯示: $*";
執行: ./test.sh 1 2 3
4.3 運算符
#!/bin/bash
a=1;
b=2;
echo `expr $a + $b`;
echo $((a+b));
echo $[a+b];
執行結果:
4.4 if語句
#!/bin/bash
read -p "please input your name:" NAME ## read命令用於從控制檯讀取輸入數據
## printf '%s\n' $NAME
if [ $NAME = root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME = itcast ]
then
echo "hello ${NAME}, welcome !"
else
echo "Get out Please!"
fi
執行結果:
4.5 for語句
方式1:
#!/bin/bash
for N in 1 2 3
do
echo $N
done
執行結果:
方式2:
#!/bin/bash
for ((i = 0; i <= 5; i++))
do
echo "welcome $i times"
done
4.6 函數
#!/bin/bash
funWithReturn(){
echo "這個函數會對輸入的兩個數字進行相加運算..."
echo "輸入第一個數字: "
read aNum
echo "輸入第二個數字: "
read anotherNum
echo "兩個數字分別爲 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個數字之和爲 $? !"
執行結果:
5 環境配置
5.1 三臺虛擬機關閉防火牆
三臺機器執行以下命令(root用戶來執行)
systemctl stop iptables #關閉防火牆
systemctl disable iptables.service #禁止開機啓動
5.2 三臺機器關閉selinux
- 什麼是SELinux
- SELinux是Linux的一種安全子系統
- Linux中的權限管理是針對於文件的, 而不是針對進程的, 也就是說, 如果root啓動了某個進程, 則這個進程可以操作任何一個文件
- SELinux在Linux的文件權限之外, 增加了對進程的限制, 進程只能在進程允許的範圍內操作資源
- 爲什麼要關閉SELinux
- 如果開啓了SELinux, 需要做非常複雜的配置, 才能正常使用系統, 在學習階段, 在非生產環境, 一般不使用SELinux
- SELinux的工作模式
enforcing
強制模式permissive
寬容模式disable
關閉
# 修改selinux的配置文件
vi /etc/selinux/config
改成SELINUX=disabled
5.3 三臺機器機器免密碼登錄
- 爲什麼要免密登錄
- Hadoop 節點衆多, 所以一般在主節點啓動從節點, 這個時候就需要程序自動在主節點登錄到從節點中, 如果不能免密就每次都要輸入密碼, 非常麻煩
- 免密 SSH 登錄的原理
- 需要先在 B節點 配置 A節點 的公鑰
- A節點 請求 B節點 要求登錄
- B節點 使用 A節點 的公鑰, 加密一段隨機文本
- A節點 使用私鑰解密, 併發回給 B節點
- B節點 驗證文本是否正確
第一步:三臺機器生成公鑰與私鑰
在三臺機器執行以下命令,生成公鑰與私鑰
ssh-keygen -t rsa
執行該命令之後,按下三個回車即可
第二步:拷貝公鑰到同一臺機器
三臺機器將拷貝公鑰到第一臺機器
三臺機器執行命令:
ssh-copy-id node01
第三步:複製第一臺機器的認證到其他機器
將第一臺機器的公鑰拷貝到其他機器上
在第一臺機器上面指向以下命令
scp /root/.ssh/authorized_keys node02:/root/.ssh
scp /root/.ssh/authorized_keys node03:/root/.ssh
測試免密登錄:
5.4 三臺機器時鐘同步
- 爲什麼需要時間同步
- 因爲很多分佈式系統是有狀態的, 比如說存儲一個數據, A節點 記錄的時間是 1, B節點 記錄的時間是 2, 就會出問題
## 安裝
yum install -y ntp
## 啓動定時任務
crontab -e
## 查看定時任務
crontab -l
隨後在輸入界面鍵入
*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;
6 裝輔助軟件
6.1 每臺主機安裝jdk
查看自帶的openjdk
rpm -qa | grep java
卸載系統自帶的openjdk
rpm -e java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64 tzdata-java-2019c-1.el7.noarch java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7.x86_64 python-javapackages-3.4.1-11.el7.noarch javapackages-tools-3.4.1-11.el7.noarch --nodeps
上傳jdk並解壓然後配置環境變量
所有軟件的安裝路徑
mkdir -p /export/services
所有軟件壓縮包的存放路徑
mkdir -p /export/softwares
上傳jdk到/export/softwares路徑下去
rz -E
,若不能使用該命令,請先執行yum -y install lrzsz
進行下載。
解壓
tar -zxvf jdk-8u251-linux-x64.tar.gz -C ../services/
配置環境變量
vim /etc/profile
export JAVA_HOME=/export/services/jdk1.8.0_251
export PATH=:$JAVA_HOME/bin:$PATH
修改完成之後記得 source /etc/profile生效
快捷方式:當裝完一臺虛擬機的jdk後,可通過scp -r jdk1.8.0_251/ node03:$PWD
分發已上傳的jdk
7 Zookeeper
7.1 Zookeeper 的概述
- Zookeeper 是一個開源的分佈式協調服務框架 ,主要用來解決分佈式集羣中 應用系統的一致性問題
- Zookeeper 是 Google Chubby 思想的一個開源實現
- Zookeeper 本質上是一個分佈式文件系統, 適合存放小文件, 通過文件系統來實現分佈式協調
分佈式文件系統?
- 在上圖左側, Zookeeper 中存儲的其實是一個又一個 Znode, Znode 是 Zookeeper 中的節點
- Znode 是有路徑的, 例如
/data/host1
,/data/host2
, 這個路徑也可以理解爲是 Znode 的 Name - Znode 也可以攜帶數據, 例如說某個 Znode 的路徑是
/data/host1
, 其值是一個字符串"192.168.0.1"
- Znode 是有路徑的, 例如
- 正因爲 Znode 的特性, 所以 Zookeeper 可以對外提供出一個類似於文件系統的試圖, 可以通過操作文件系統的方式操作 Zookeeper
- 使用路徑獲取 Znode
- 獲取 Znode 攜帶的數據
- 修改 Znode 攜帶的數據
- 刪除 Znode
- 添加 Znode
- 等等…
Zookeeper 是分佈式的
首先呢, Zookeeper 是分爲服務端和客戶端的, 客戶端有 Java 的客戶端, 有 Shell 命令行的客戶端等, 客戶端通過一個類似於文件系統的 API 來訪問 Zookeeper 集羣
但是事實上, 客戶端最終是直接訪問 Zookeeper 集羣, 集羣中有兩大類角色, 一類是 Leader, 一類是 Follower, 其實就是主從, Leader 負責讀和寫, Follower 只能讀, 遇到會產生修改的請求會轉發給 Leader 處理, 這是因爲 Zookeeper 本質上就是爲了在分佈式環境中對消息的一致性的支持, 而 Zookeeper 所基於的 ZAB 協議是 Paxos 協議的一個變種, ZAB 協議中是有一個全局的事務生成者, 就是 Leader, 修改設計到在分佈式環境下對事務達成一致, 必須由 Leader 發起
舉個例子?
比如說一個常見的分佈式主從系統, 如果有 ZK 在的話, 主節點不需要和每個從節點保持連接, 只需要監聽從節點創建的 Znode, 便可以知道誰在線
Zookeeper 能做什麼?
- 發佈訂閱
- 命名服務
- 分佈式鎖
- 分佈式協調
7.2 Zookeeper安裝
服務器IP | 主機名 | myid的值 |
---|---|---|
192.168.188.100 | node01 | 1 |
192.168.188.110 | node02 | 2 |
192.168.188.120 | node03 | 3 |
第一步:下載zookeeeper的壓縮包,下載網址如下
http://archive.apache.org/dist/zookeeper/
我們在這個網址下載我們使用的zk版本爲3.4.9
下載完成之後,上傳到我們的linux的/export/softwares路徑下準備進行安裝
第二步:解壓
解壓zookeeper的壓縮包到/export/services路徑下去,然後準備進行安裝
cd /export/software
tar -zxvf zookeeper-3.4.9.tar.gz -C ../services/
第三步:修改配置文件
第一臺機器修改配置文件
cd /export/services/zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
mkdir -p /export/services/zookeeper-3.4.9/zkdatas/
vim zoo.cfg
dataDir=/export/services/zookeeper-3.4.9/zkdatas
# 保留多少個快照
autopurge.snapRetainCount=3
# 日誌多少小時清理一次
autopurge.purgeInterval=1
# 集羣中服務器地址
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
第四步:添加myid配置
在第一臺機器的
/export/services/zookeeper-3.4.9/zkdatas /這個路徑下創建一個文件,文件名爲myid ,文件內容爲1
echo 1 > /export/services/zookeeper-3.4.9/zkdatas/myid
第五步:安裝包分發並修改myid的值
安裝包分發到其他機器
第一臺機器上面執行以下兩個命令
scp -r /export/services/zookeeper-3.4.9/ node02:/export/services/
scp -r /export/services/zookeeper-3.4.9/ node03:/export/services/
第二臺機器上修改myid的值爲2
echo 2 > /export/services/zookeeper-3.4.9/zkdatas/myid
第三臺機器上修改myid的值爲3
echo 3 > /export/services/zookeeper-3.4.9/zkdatas/myid
第六步:三臺機器啓動zookeeper服務
三臺機器啓動zookeeper服務
這個命令三臺機器都要執行
/export/services/zookeeper-3.4.9/bin/zkServer.sh start
查看啓動狀態
/export/services/zookeeper-3.4.9/bin/zkServer.sh status
遇到錯誤:java.net.NoRouteToHostException: 沒有到主機的路由 (Host unreachable)
解決:
原因:防火牆沒關!,每一臺機器依次執行:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啓動
firewall-cmd --state #查看默認防火牆狀態(關閉後顯示notrunning,開啓後顯示running)
7.3 Zookeeper的Shell 客戶端操作
通過zkCli.sh
命令啓動。
命令 | 說明 | 參數 |
---|---|---|
create [-s] [-e] path data acl |
創建Znode | -s 指定是順序節點 -e 指定是臨時節點 |
ls path [watch] |
列出Path下所有子Znode | |
get path [watch] |
獲取Path對應的Znode的數據和屬性 | |
ls2 path [watch] |
查看Path下所有子Znode以及子Znode的屬性 | |
set path data [version] |
更新節點 | version 數據版本 |
delete path [version] |
刪除節點, 如果要刪除的節點有子Znode則無法刪除 | version 數據版本 |
rmr path |
刪除節點, 如果有子Znode則遞歸刪除 | |
setquota -n|-b val path |
修改Znode配額 | -n 設置子節點最大個數 -b 設置節點數據最大長度 |
history |
列出歷史記錄 |
1:創建普通節點
create /app1 hello
2: 創建順序節點
create -s /app3 world
3:創建臨時節點
create -e /tempnode world
4:創建順序的臨時節點
create -s -e /tempnode2 aaa
5:獲取節點數據
get /app1
6:修改節點數據
set /app1 xxx
7:刪除節點
delete /app1
刪除的節點不能有子節點
rmr /app1
遞歸刪除
Znode 的特點
- 文件系統的核心是
Znode
- 如果想要選取一個
Znode
, 需要使用路徑的形式, 例如/test1/test11
- Znode 本身並不是文件, 也不是文件夾, Znode 因爲具有一個類似於 Name 的路徑, 所以可以從邏輯上實現一個樹狀文件系統
- ZK 保證 Znode 訪問的原子性, 不會出現部分 ZK 節點更新成功, 部分 ZK 節點更新失敗的問題
Znode
中數據是有大小限制的, 最大隻能爲1M
Znode
是由三個部分構成stat
: 狀態, Znode的權限信息, 版本等data
: 數據, 每個Znode都是可以攜帶數據的, 無論是否有子節點children
: 子節點列表
Znode 的類型
- 每個
Znode
有兩大特性, 可以構成四種不同類型的Znode
- 持久性
持久
客戶端斷開時, 不會刪除持有的Znode臨時
客戶端斷開時, 刪除所有持有的Znode, 臨時Znode不允許有子Znode
- 順序性
有序
創建的Znode有先後順序, 順序就是在後面追加一個序列號, 序列號是由父節點管理的自增無序
創建的Znode沒有先後順序
- 持久性
Znode
的屬性dataVersion
數據版本, 每次當Znode
中的數據發生變化的時候,dataVersion
都會自增一下cversion
節點版本, 每次當Znode
的節點發生變化的時候,cversion
都會自增aclVersion
ACL(Access Control List)
的版本號, 當Znode
的權限信息發生變化的時候aclVersion會自增zxid
事務IDctime
創建時間mtime
最近一次更新的時間ephemeralOwner
如果Znode
爲臨時節點,ephemeralOwner
表示與該節點關聯的SessionId
通知機制
- 通知類似於數據庫中的觸發器, 對某個Znode設置
Watcher
, 當Znode發生變化的時候,WatchManager
會調用對應的Watcher
- 當Znode發生刪除, 修改, 創建, 子節點修改的時候, 對應的
Watcher
會得到通知 Watcher
的特點- 一次性觸發 一個
Watcher
只會被觸發一次, 如果需要繼續監聽, 則需要再次添加Watcher
- 事件封裝:
Watcher
得到的事件是被封裝過的, 包括三個內容keeperState, eventType, path
- 一次性觸發 一個
KeeperState | EventType | 觸發條件 | 說明 |
---|---|---|---|
None | 連接成功 | ||
SyncConnected | NodeCreated | Znode被創建 | 此時處於連接狀態 |
SyncConnected | NodeDeleted | Znode被刪除 | 此時處於連接狀態 |
SyncConnected | NodeDataChanged | Znode數據被改變 | 此時處於連接狀態 |
SyncConnected | NodeChildChanged | Znode的子Znode數據被改變 | 此時處於連接狀態 |
Disconnected | None | 客戶端和服務端斷開連接 | 此時客戶端和服務器處於斷開連接狀態 |
Expired | None | 會話超時 | 會收到一個SessionExpiredException |
AuthFailed | None | 權限驗證失敗 | 會收到一個AuthFailedException |
會話
- 在ZK中所有的客戶端和服務器的交互都是在某一個
Session
中的, 客戶端和服務器創建一個連接的時候同時也會創建一個Session
Session
會在不同的狀態之間進行切換:CONNECTING
,CONNECTED
,RECONNECTING
,RECONNECTED
,CLOSED
- ZK中的會話兩端也需要進行心跳檢測, 服務端會檢測如果超過超時時間沒收到客戶端的心跳, 則會關閉連接, 釋放資源, 關閉會話
8 Hadoop
8.1 Hadoop的介紹
- Hadoop最早起源於Nutch。Nutch的設計目標是構建一個大型的全網搜索引擎,包括網頁抓取、索引、查詢等功能,但隨着抓取網頁數量的增加,遇到了嚴重的可擴展性問題——如何解決數十億網頁的存儲和索引問題。
- 2003年、2004年穀歌發表的兩篇論文爲該問題提供了可行的解決方案。
——分佈式文件系統(GFS),可用於處理海量網頁的存儲
——分佈式計算框架MAPREDUCE,可用於處理海量網頁的索引計算問題。
- Nutch的開發人員完成了相應的開源實現HDFS和MAPREDUCE,並從Nutch中剝離成爲獨立項目HADOOP,到2008年1月,HADOOP成爲Apache頂級項目.
狹義上來說,hadoop就是單獨指代hadoop這個軟件,
HDFS :分佈式文件系統
MapReduce : 分佈式計算系統
廣義上來說,hadoop指代大數據的一個生態圈,包括很多其他的軟件
8.2 hadoop的歷史版本介紹
1.x版本系列:hadoop版本當中的第二代開源版本,主要修復0.x版本的一些bug等
2.x版本系列:架構產生重大變化,引入了yarn平臺等許多新特性
3.x版本系列: 加入多namenoode新特性
8.3 hadoop三大公司髮型版本介紹
免費開源版本apache:
優點:擁有全世界的開源貢獻者,代碼更新迭代版本比較快,
缺點:版本的升級,版本的維護,版本的兼容性,版本的補丁都可能考慮不太周到,\
apache所有軟件的下載地址(包括各種歷史版本):
http://archive.apache.org/dist/
免費開源版本hortonWorks:
hortonworks主要是雅虎主導Hadoop開發的副總裁,帶領二十幾個核心成員成立Hortonworks,核心產品軟件HDP(ambari),HDF免費開源,並且提供一整套的web管理界面,供我們可以通過web界面管理我們的集羣狀態,web管理界面軟件HDF網址(http://ambari.apache.org/)
軟件收費版本ClouderaManager:
cloudera主要是美國一家大數據公司在apache開源hadoop的版本上,通過自己公司內部的各種補丁,實現版本之間的穩定運行,大數據生態圈的各個版本的軟件都提供了對應的版本,解決了版本的升級困難,版本兼容性等各種問題
8.4、hadoop的架構模型(1.x,2.x的各種架構模型介紹)
8.4.1 1.x的版本架構模型介紹
文件系統核心模塊:
NameNode:集羣當中的主節點,管理元數據(文件的大小,文件的位置,文件的權限),主要用於管理集羣當中的各種數據
secondaryNameNode:主要能用於hadoop當中元數據信息的輔助管理
DataNode:集羣當中的從節點,主要用於存儲集羣當中的各種數據
數據計算核心模塊:
JobTracker:接收用戶的計算請求任務,並分配任務給從節點
TaskTracker:負責執行主節點JobTracker分配的任務
8.4.2 2.x的版本架構模型介紹
第一種:NameNode與ResourceManager單節點架構模型
文件系統核心模塊:
NameNode:集羣當中的主節點,主要用於管理集羣當中的各種數據
secondaryNameNode:主要能用於hadoop當中元數據信息的輔助管理
DataNode:集羣當中的從節點,主要用於存儲集羣當中的各種數據
數據計算核心模塊:
ResourceManager:接收用戶的計算請求任務,並負責集羣的資源分配
NodeManager:負責執行主節點APPmaster分配的任務
第二種:NameNode單節點與ResourceManager高可用架構模型
文件系統核心模塊:
NameNode:集羣當中的主節點,主要用於管理集羣當中的各種數據
secondaryNameNode:主要能用於hadoop當中元數據信息的輔助管理
DataNode:集羣當中的從節點,主要用於存儲集羣當中的各種數據
數據計算核心模塊:
ResourceManager:接收用戶的計算請求任務,並負責集羣的資源分配,以及計算任務的劃分,通過zookeeper實現ResourceManager的高可用
NodeManager:負責執行主節點ResourceManager分配的任務
第三種:NameNode高可用與ResourceManager單節點架構模型
文件系統核心模塊:
NameNode:集羣當中的主節點,主要用於管理集羣當中的各種數據,其中nameNode可以有兩個,形成高可用狀態
DataNode:集羣當中的從節點,主要用於存儲集羣當中的各種數據
JournalNode:文件系統元數據信息管理
數據計算核心模塊:
ResourceManager:接收用戶的計算請求任務,並負責集羣的資源分配,以及計算任務的劃分
NodeManager:負責執行主節點ResourceManager分配的任務
第四種:NameNode與ResourceManager高可用架構模型
文件系統核心模塊:
NameNode:集羣當中的主節點,主要用於管理集羣當中的各種數據,一般都是使用兩個,實現HA高可用
JournalNode:元數據信息管理進程,一般都是奇數個
DataNode:從節點,用於數據的存儲
數據計算核心模塊:
ResourceManager:Yarn平臺的主節點,主要用於接收各種任務,通過兩個,構建成高可用
NodeManager:Yarn平臺的從節點,主要用於處理ResourceManager分配的任務
8.5 Hadoop的安裝
集羣的規劃:
服務器IP | 192.168.174.100 | 192.168.174.110 | 192.168.174.120 |
---|---|---|---|
主機名 | node01 | node02 | node03 |
NameNode | 是 | 否 | 否 |
SecondaryNameNode | 是 | 否 | 否 |
dataNode | 是 | 是 | 是 |
ResourceManager | 是 | 否 | 否 |
NodeManager | 是 | 是 | 是 |
- 上傳並解壓
- 修改配置文件
- 分發安裝包
- 格式化HDFS
- 啓動集羣
8.5.1 上傳並解壓
- 上傳壓縮包到/export/software目錄
cd /export/software
tar xzvf hadoop-3.1.1.tar.gz -C ../services
8.5.2 修改配置文件
配置文件的位置在 hadoop/etc/hadoop
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:8020</value>
</property>
<!-- 臨時文件存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/services/hadoop-3.1.1/datas/tmp</value>
</property>
<!-- 緩衝區大小,實際工作中根據服務器性能動態調整 -->
<property>
<name>io.file.buffer.size</name>
<value>8192</value>
</property>
<!-- 開啓hdfs的垃圾桶機制,刪除掉的數據可以從垃圾桶中回收,單位分鐘 -->
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
</configuration>
hadoop-env.sh
export JAVA_HOME=/export/services/jdk1.8.0_251
hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///export/services/hadoop-3.1.1/datas/namenode/namenodedatas</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>10</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///export/services/hadoop-3.1.1/datas/datanode/datanodeDatas</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>node01:50070</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.checkpoint.edits.dir</name>
<value>file:///export/services/hadoop-3.1.1/datas/dfs/nn/snn/edits</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node01.hadoop.com:50090</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///export/services/hadoop-3.1.1/datas/dfs/nn/edits</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///export/services/hadoop-3.1.1/datas/dfs/snn/name</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx512M</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx512M</value>
</property>
<property>
<name>mapreduce.task.io.sort.mb</name>
<value>256</value>
</property>
<property>
<name>mapreduce.task.io.sort.factor</name>
<value>100</value>
</property>
<property>
<name>mapreduce.reduce.shuffle.parallelcopies</name>
<value>25</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>node01.hadoop.com:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node01.hadoop.com:19888</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/export/services/hadoop-3.1.1/datas/jobhsitory/intermediateDoneDatas</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/export/services/hadoop-3.1.1/datas/jobhsitory/DoneDatas</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/export/services/hadoop-3.1.1</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/export/services/hadoop-3.1.1/</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/export/services/hadoop-3.1.1</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>node01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>node01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>node01:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>node01:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>node01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node01</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<!-- 設置不檢查虛擬內存的值,不然內存不夠會報錯 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>true</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>file:///export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerDatas</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>file:///export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerLogs</value>
</property>
<property>
<name>yarn.nodemanager.log.retain-seconds</name>
<value>10800</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/export/services/hadoop-3.1.1/datas/remoteAppLog/remoteAppLogs</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir-suffix</name>
<value>logs</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>18144000</value>
</property>
<property>
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
<value>86400</value>
</property>
<!-- yarn上面運行一個任務,最少需要1.5G內存,虛擬機沒有這麼大的內存就調小這個值,不然會報錯 -->
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>1024</value>
</property>
</configuration>
workers
node01
node02
node03
8.5.3 創建數據和臨時文件夾
mkdir -p /export/services/hadoop-3.1.1/datas/tmp
mkdir -p /export/services/hadoop-3.1.1/datas/dfs/nn/snn/edits
mkdir -p /export/services/hadoop-3.1.1/datas/namenode/namenodedatas
mkdir -p /export/services/hadoop-3.1.1/datas/datanode/datanodeDatas
mkdir -p /export/services/hadoop-3.1.1/datas/dfs/nn/edits
mkdir -p /export/services/hadoop-3.1.1/datas/dfs/snn/name
mkdir -p /export/services/hadoop-3.1.1/datas/jobhsitory/intermediateDoneDatas
mkdir -p /export/services/hadoop-3.1.1/datas/jobhsitory/DoneDatas
mkdir -p /export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerDatas
mkdir -p /export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerLogs
mkdir -p /export/services/hadoop-3.1.1/datas/remoteAppLog/remoteAppLogs
8.5.4 分發安裝包到其它機器
cd /export/services
scp -r hadoop-3.1.1/ node02:$PWD
scp -r hadoop-3.1.1/ node03:$PWD
8.5.5 在每個節點配置環境變量
vi /etc/profile
export HADOOP_HOME=/export/services/hadoop-3.1.1/
export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
8.5.6 格式化HDFS
- 爲什麼要格式化HDFS
- HDFS需要一個格式化的過程來創建存放元數據(image, editlog)的目錄
bin/hdfs namenode -format
8.5.7 啓動集羣
注意:啓動集羣前,一定要啓動zookeeper
# 會登錄進所有的worker啓動相關進行, 也可以手動進行, 但是沒必要
/export/services/hadoop-3.1.1/sbin/start-dfs.sh
/export/services/hadoop-3.1.1/sbin/start-yarn.sh
mapred --daemon start historyserver
執行結果:
此時便可以通過如下三個URL訪問Hadoop了
- HDFS:
http://192.168.174.100:50070/dfshealth.html#tab-overview
- Yarn:
http://192.168.174.100:8088/cluster
報錯:ERROR: Attempting to operate on hdfs namenode as root \n ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
解決:設置hadoop-env.sh
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"
修改完後,向以前一樣分發到其他兩臺機器
8.5.8 測試使用
創建測試文件,並加入到根目錄下
查看控制檯:
成功!撒花~~~
8.5.9 正常關閉集羣(附加)
很重要,不然啓動虛擬機都很難,會有各種怪事情出現!謹慎
- node01執行
/export/services/hadoop-3.1.1/sbin/stop-yarn.sh
- node01執行
/export/services/hadoop-3.1.1/sbin/stop-dfs.sh
- 三臺機器都要執行
/export/services/zookeeper-3.4.9/bin/zkServer.sh stop
shutdown -h now
關機睡覺!