Hadoop叢集搭建(完全分散式版本) VMWARE虛擬機器
VMWARE虛擬機器
-
三臺虛擬機器:master、node1、node2
-
時間同步
ntpdate ntp.aliyun.com
-
調整時區
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
jdk1.8(以1.8為例,目前大多數企業都是使用1.8版本,最穩定)
java -version
-
修改主機名
三臺分別執行 vim /etc/hostname 並將內容指定為對應的主機名
-
關閉防火牆:systemctl stop firewalld
-
檢視防火牆狀態:systemctl status firewalld
-
取消防火牆自啟:systemctl disable firewalld
-
-
靜態IP配置
-
直接使用圖形化介面配置(不推薦)
-
手動編輯配置檔案進行配置
1、編輯網路配置檔案
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
HWADDR=00:0C:29:E2:B8:F2
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.190.100
GATEWAY=192.168.190.2
NETMASK=255.255.255.0
DNS1=192.168.190.2
DNS2=223.6.6.6
需要修改:HWADDR(mac地址,centos7不需要手動指定mac地址)
IPADDR(根據自己的網段,自定義IP地址)
GATEWAY(根據自己的網段填寫對應的閘道器地址)
2、關閉NetworkManager,並取消開機自啟
systemctl stop NetworkManager
systemctl disable NetworkManager
3、重啟網路服務
systemctl restart network
-
-
免密登入
# 1、生成金鑰
ssh-keygen -t rsa
注意:連敲三次生成方格形狀的金鑰,在當前狀態下,配置免金鑰登陸。
# 2、配置免密登入(三臺虛擬機器都需要進行免密操作,不要怕麻煩!!)
ssh-copy-id master
ssh-copy-id node1
ssh-copy-id node2
# 3、測試免密登入
ssh node1
ssh node2
ssh master -
配置好對映檔案:/etc/hosts(三臺虛擬機器都需要配置)
192.168.170.100 master
192.168.170.101 node1
192.168.170.102 node2
注意:每個人的IP地址都是不一樣的,檢視自己的IP地址使用 ifconfig
使用遠端複製
cd /etc
scp -r hosts/ node1:`pwd`
scp -r hosts/ node2:`pwd`
二、搭建Hadoop叢集
NameNode:接受客戶端的讀/寫服務,收集 DataNode 彙報的 Block 列表資訊
DataNode:真實資料儲存的地方(block)
SecondaryNameNode:做持久化的時候用到
程序 | master(主) | node1(從) | node2(從) |
---|---|---|---|
NameNode | √ | ||
SecondaryNameNode | √ | ||
ResourceManager | √ | ||
DataNode | √ | √ | |
NodeManager | √ | √ |
2.1 完全分散式搭建
1、上傳安裝包並解壓
# 使用xftp上傳壓縮包至master的/usr/local/soft/packages/
cd /urs/local/soft/packages/
# 解壓
tar -zxvf hadoop-2.7.6.tar.gz -C /usr/local/soft/
2、配置環境變數(三臺虛擬機器都需要i配置)
vim /etc/profile JAVA_HOME=/usr/local/soft/jdk1.8.0_171 HADOOP_HOME=/usr/local/soft/hadoop-2.7.6 export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH # 重新載入環境變數 source /etc/profile 使用遠端複製(進行覆蓋) cd /etc scp -r profile/ node1:`pwd` scp -r profile/ node2:`pwd`
3、修改Hadoop配置檔案
-
cd /usr/local/soft/hadoop-2.7.6/etc/hadoop/
-
core-site.xml
fs.defaultFS: 預設檔案系統的名稱。其方案和許可權決定檔案系統實現的URI。uri的方案確定命名檔案系統實現類的配置屬性(fs.scheme.impl)。uri的許可權用於確定檔案系統的主機、埠等。
hadoop.tmp.dir:是 hadoop檔案系統依賴的基本配置,很多配置路徑都依賴它,它的預設位置是在 /tmp/{$user}下面,注意這是個臨時目錄!!!
因此,它的持久化配置很重要的! 如果選擇預設,一旦因為斷電等外在因素影響,/tmp/{$user}下的所有東西都會丟失。
fs.trash.interval:啟用垃圾箱配置,dfs命令刪除的檔案不會立即從HDFS中刪除。相反,HDFS將其移動到垃圾目錄(每個使用者在
/user/<username>/.Trash
下都有自己的垃圾目錄)。只要檔案保留在垃圾箱中,檔案可以快速恢復。<property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/soft/hadoop-2.7.6/tmp</value> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property>
-
hadoop-env.sh
export JAVA_HOME=/usr/local/soft/jdk1.8.0_171
-
hdfs-site.xml
-
dfs.replication:每個datanode上只能存放一個副本。我這裡就2個datanode
dfs.permissions:如果為“true”,則在HDFS中啟用許可權檢查。如果為“false”,則關閉許可權檢查,但所有其他行為保持不變。從一個引數值切換到另一個引數值不會更改檔案或目錄的模式、所有者或組。
<property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property>
-
mapred-site.xml.template
-
mapreduce.framework.name:用於執行MapReduce作業的執行時框架。
mapreduce.jobhistory.address:Hadoop自帶了一個歷史伺服器,可以通過歷史伺服器檢視已經執行完的Mapreduce作業記錄,比如用了多少個Map、用了多少個Reduce、作業提交時間、作業啟動時間、作業完成時間等資訊。預設情況下,Hadoop歷史伺服器是沒有啟動的,我們可以通過*mr-jobhistory-daemon.sh start historyserver命令來啟動Havim doop歷史伺服器。我們可以通過Hadoop jar的命令來實現我們的程式jar包的執行,關於執行的日誌,我們一般都需要通過啟動一個服務來進行檢視,就是我們的JobHistoryServer,我們可以啟動一個程序,專門用於檢視我們的任務提交的日誌。mapreduce.jobhistory.address和mapreduce.jobhistory.webapp.address預設的值分別是0.0.0.0:10020和0.0.0.0:19888
# 1、重新命名檔案 cp mapred-site.xml.template mapred-site.xml # 2、修改 <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property>
-
slaves
-
從節點的資訊
node1 node2
-
yarn-site.xml
-
yarn.resourcemanager.hostname:指定yarn主節點
yarn.nodemanager.aux-services:NodeManager上執行的附屬服務。需配置成mapreduce_shuffle,才可執行MapReduce程式。預設值:“”
yarn.log-aggregation-enable:yarn日誌聚合功能開關
yarn.log-aggregation.retain-seconds:日誌保留時限,預設7天
<property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
4、分發Hadoop到node1、node2
cd /usr/local/soft/ scp -r hadoop-2.7.6/ node1:`pwd` scp -r hadoop-2.7.6/ node2:`pwd`
5、格式化namenode(第一次啟動的時候需要執行,以及每次修改核心配置檔案後都需要)
hdfs namenode -format
6、啟動Hadoop叢集
start-all.sh
7、檢查master、node1、node2上的程序
-
master:
[root@master soft]# jps 2597 NameNode 2793 SecondaryNameNode 2953 ResourceManager 3215 Jps
-
node1:
[root@node1 jdk1.8.0_171]# jps 11361 DataNode 11459 NodeManager 11559 Jps
-
node2:
[root@node2 ~]# jps 11384 DataNode 11482 NodeManager 11582 Jps
8、訪問HDFS的WEB介面
http://master:50070
9、訪問YARN的WEB介面
http://master:8088
Hadoop中的常見的shell命令 1、如何將linux本地的資料上傳到HDFS中呢? hadoop fs -put 本地的檔案 HDFS中的目錄 hdfs dfs -put 本地的檔案 HDFS中的目錄 cd /usr/local/soft hadoop fs -put hadoop-2.7.6.tar.gz / hadoop fs -put students.txt / 2、如何建立HDFS中的資料夾呢? 需求:想建立/shujia/bigdata17 hadoop fs -mkdir -p /shujia/bigdata17 hdfs dfs -mkdir -p /shujia/bigdata17 3、檢視當前HDFS目錄下的檔案和資料夾 hadoop fs -ls /shujia/bigdata17 hdfs dfs -ls /shujia/bigdata17 舉例 [root@master soft]# hadoop fs -ls / Found 4 items -rw-r--r-- 1 root supergroup 216745683 2022-05-21 19:23 /hadoop-2.7.6.tar.gz -rw-r--r-- 1 root supergroup 1415 2022-05-21 19:31 /initdemo.sh drwxr-xr-x - root supergroup 0 2022-05-21 19:33 /shujia drwx------ - root supergroup 0 2022-05-21 19:26 /user 4、將HDFS的檔案下載到Linux本地中 hadoop fs -get HDFS中的檔案目錄 本地要存放檔案的目錄 hdfs dfs -get HDFS中的檔案目錄 本地要存放檔案的目錄 hdfs dfs -get /students.txt /usr/local/soft/data/ 5、刪除命令(如果垃圾回收站大小小於被刪除檔案的大小,直接被刪除,不經過回收站) hadoop fs -rm .... # 僅刪除檔案 hadoop fs -rmr .... # 刪除資料夾 舉例: [root@master soft]# hadoop fs -rmr /students.txt rmr: DEPRECATED: Please use 'rm -r' instead. 22/05/21 19:37:00 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes. 22/05/21 19:37:00 INFO fs.TrashPolicyDefault: Moved: 'hdfs://master:9000/students.txt' to trash at: hdfs://master:9000/user/root/.Trash/Current/students.txt Moved: 'hdfs://master:9000/students.txt' to trash at: hdfs://master:9000/user/root/.Trash/Current 6、移動檔案 hadoop fs -mv 目標檔案 目的地路徑 hadoop fs -mv /user/root/.Trash/Current/students.txt / 7、HDFS內部複製檔案 hadoop fs -cp [-p] ... ... # 如果想複製資料夾,加上-p引數 hadoop fs -cp -p /hadoop-2.7.6.tar.gz /shujia/bigdata/
強制格式化叢集(遇到問題的簡單暴力的方法)
1、停止正在執行的叢集
stop-all.sh
2、刪除所有節點hadoop根目錄中的tmp資料夾
3、在主節點(master)中hadoop的根目錄中的bin目錄下,重新格式化HDFS
./hdfs namenode -format
4、啟動叢集
start-all.sh
2.2 程序理解
2.1.1 HDFS相關(NN,DN,SSN)
NameNode(NN)
功能:
1、接受客戶端的讀/寫服務
因為NameNode知道檔案與DataNode的對應關係
2、儲存檔案的時候會儲存檔案的元資料資訊
a. 檔案的歸屬
b. 檔案的許可權
c. 檔案的大小,時間
d. Block資訊,但是block的位置資訊不會持久化,需要每次開啟叢集的時候DN向NN彙報。(帶同學們畫圖講解,引出這4個點)
3、收集Block的位置資訊
3.1 系統啟動
a. NN關機的時候是不會儲存任意的Block與DataNode的對映資訊的
b. DN啟動的時候會自動將自己節點上儲存的Block資訊彙報給NN
c. NN接收請求之後會重新生成對映關係
File ----> Block
Block---> DN
d. 如果資料塊的副本數小於設定數,那麼NN會將這個副本拷貝到其他節點
3.2 叢集執行中
a. NN與DN保持心跳機制,三秒鐘傳送一次
b. 如果客戶端需要讀取或者上傳資料的時候,NN可以知道DN的健康情況
c. 可以讓客戶端讀取存活的DN節點
d. 如果NN與DN三秒沒有心跳則認為DN出現異常,此時不會讓新的資料寫到這個異常的DN中,客戶端訪問的時候不提供異常DN節點地址
e. 如果超過十分鐘沒有心跳,那麼NN會將當前DN節點儲存的資料轉移到其他的節點
4、NameNode為了效率,將所有的操作都在記憶體中進行
a. 執行速度快
b. NameNode不會和磁碟進行任何的資料交換
但是會存在兩個問題:
1)資料的持久化
2)資料儲存在記憶體中,斷電丟失
DataNode(DN)
1、存放的是檔案的資料資訊,以及驗證檔案完整性的校驗資訊
2、資料會存放在硬碟上
a. 1m=1條元資料
b. 1G=1條元資料
c. NameNode非常排斥儲存小檔案(能存,但是不推薦!!)
一般小檔案在儲存之前需要進行壓縮
3、彙報
1)啟動時
彙報之前會驗證Block檔案是否被損壞
向NN彙報當前DN上block的資訊
2)執行中
向NN保持心跳機制
4、當客戶端讀寫資料的時候,首先會先去NN查詢file與block與DN的對映,然後直接與DN建立連線,然後讀寫資料
SecondaryNameNode(SNN)
1、傳統的那日村持久化方案
1)日誌機制
a. 做任何操作之前先記錄日誌
b. 在資料改變之前先記錄對應的日誌,當NN停止的時候
c. 當我下次啟動的時候,只需要重新按照以前的日誌“重做一遍”即可
缺點:
a. log日誌檔案的大小不可控,隨著時間的發展,叢集啟動的時間會越來越長
b. 有可能日誌中存在大量的無效日誌
優點:
a. 絕對不會丟失資料
2)拍攝快照
a. 我們可以將記憶體中的資料寫出到硬碟上(序列化)
b. 啟動時還可以將硬碟上的資料寫回到記憶體中(反序列化)
缺點:
a. 關機時間過長
b. 如果是異常關機,資料還在記憶體中,沒法寫入到硬碟
c. 如果寫出的頻率過高,導致記憶體使用效率低
優點:
啟動時間較短
2、SNN的解決方案
1)解決思路
a. 讓日誌大小可控
b. 快照需要定時儲存
c. 日誌+快照
2)解決方案
a. 當我們啟動一個叢集的時候,會產生4個檔案 ..../name/current/
b.