基於三台雲服務器搭建Hadoop3.3的分布式集群
之前寫過基於三台雲服務器搭建Redis,但是時過境遷那篇文章已經脫離時代了(主要是作者很菜)那時候我連Docker都沒玩過更別說大數據了,現在需求推動人進步,這次我又來記錄我搭建Hadoop的集群的過程。
確認服務器信息和其他
本人使用的是雲服務器相關配置如下:
服務器信息 | 時間 | 配置 | 帶寬 | 硬盤 | 價格 |
---|---|---|---|---|---|
天翼雲主機 | 一年 | 4核8G | 5M | 40G | 366 |
騰訊雲主機 | 一年 | 2核4G | 3M | 50G | 468 |
億速雲主機 | 一月 | 2核2G | 3M | 20G | 39 |
阿里雲主機(備用) | 一年 | 1核2G | 1M | 40G | 117(學生優惠續費) |
如果有上雲需求的小伙伴建議還是買天翼雲,真的很便宜(但是界面友好度還是不夠,很多時候功能需要自己去找,其次我還是推薦騰訊雲和阿里雲畢竟做的久沉淀的東西越多,而且騰訊元的售后服務非常不錯這個我很想點個贊,我遇到的問題很快能幫我解決而且提供技術參考!)白飄黨還是看預算的,當然也又亞馬遜雲,不過得需要VISA信用卡,看你選擇嘍!此處不放連接了,有需要的自己去看。
PS:我還用過華為雲和百度雲,總結下來華為雲是最讓我。。。。的,無腦👎(個人見解!)
SSH工具:FinalShell(真的良心的國產SSH軟件,從我從業以來一直在用!個人感覺非常好!)
IP地址(為了安全脫敏了):
master:182...0
cluster1:1...90
cluster2:42...25
配置服務器相關設置
2.1、所有服務器設置hostname和host
首先的設置hostname,如果你拿到新主機一定要設置hostname和hosts文件
vim /etc/hostname
然后設置成你想要的名稱
vim /etc/hosts
之后可以將如下文件粘貼過去
你本機的ip(內網) localhost
::1 你的hostname 你的hostname
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
你本機的ip(內網) 你的hostname
cluster1的外網ip) cluster1的hostname
cluster2的外網ip) cluster2的hostname
這個host文件是以master為例,如果是在cluster機器上只需要把各自的機器換成master的外網ip和master的hostname
如果你使用的是finalshell的話,可以直接使用它內部的文件系統去尋找和打開,它會自動保存你修改的文件,之后重啟機器
reboot
2.2、所有服務器設置ssh免登錄本地連接
ssh-keygen -t rsa -P ''
將生成的秘鑰添加到本地驗證key中
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
之后
ssh localhost
輸入yes和你的密碼后即可看到你的控制台清空了,代表你已經重新連接這台服務器了了
切換到master主機連接cluster1和cluster2服務
ssh cluster1
ssh cluster2
輸入密碼后即可連接,如果連接失敗,請檢查各自的服務器是否開放端口和ssh服務啟動以及ssh localhost可以成功。
連接之后會切換到對應的服務器,這個時候再新建一個master節點的session terminal,然后輸入如下命令:
scp ~/.ssh/id_rsa.pub 連接的用戶(我使用的是root)@你的cluster1 hostname:~/
scp ~/.ssh/id_rsa.pub 連接的用戶(我使用的是root)@你的cluster2 hostname:~/
出現進度條則表示已經將服務器的驗證公鑰傳輸到兩個從節點服務器了,可以切換到服務器去查看$home下,確認存在后在兩個從節點服務器中輸入如下命令:
```shell
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
```
接着為了安全起見刪除從master傳遞過來的公鑰文件
rm ~/id_rsa.pub
2.3、三個服務器安裝Java和Hadoop
JDK8下載連接:https://www.oracle.com/java/technologies/downloads/#java8
Hadoop3.3下載連接:https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
JDK8不多說了,官網下載Linux版本后上傳到三個服務器
在/home下創建java文件夾和Hadoop
cd /home
mkdir java
mkdir hadoop
將上傳的文件包解壓到/home/java下
tar -zxvf jdk1.8.tar.gz -C /home/java
接着將Hadoop包下載,目前最新的版本我用的是3.3
tar -zxvf hadoop3.3.tar.gz -C /home/hadoop
解壓后建議將jdk和Hadoop解壓后的文件夾重命名,我的是jdk1.8和hadoop-3.3.1
解壓后需要設置環境變量:
vim /etc/profile
將下面的代碼追加到后面
export PATH=/bin:/usr/bin:$PATH
#Java Configuration
export JAVA_HOME=/home/java/jdk1.8
export JRE_HOME=/home/java/jdk1.8/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=.:${JAVA_HOME}/bin:$PATH
#Hadoop Configuration
export HADOOP_HOME=/home/hadoop/hadoop-3.3.1
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export PATH=.:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:$PATH
Esc回車后按:wq保存,接着使我們的配置生效的話使用如下命令
source ~/.bashrc
測試一下環境變量:
java -version
如果出現了Java的環境變量則代表生效了
三台機器只需要做一次,其他的復制過去就可以了
到這我們的第一步就算完成了,接着就是Hadoop的集群設置了
Hadoop搭建
3.1、創建Hadoop文件夾
mkdir ~/hadoop
mkdir ~/hadoop/tmp
mkdir ~/hadoop/var
mkdir ~/hadoop/dfs
mkdir ~/hadoop/dfs/name
mkdir ~/hadoop/dfs/data
3.2、修改core-site.xml文件
cd /home/hadoop/hadoop-3.3.1/etc/hadoop
vim core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<!-- 由於我的是root用戶所以寫成root,如果你創建的文件夾不在root下記得換掉 -->
<value>/root/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://你的hostname:9000</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<!-- 指定靜態角色,HDFS上傳文件的時候需要 -->
<value>root</value>
</property>
</configuration>
Esc按:wq保存
3.3、修改Hadoop-env.sh和yarn-env.sh文件
因為相對路徑不能識別所以使用絕對路徑
vim hadoop-env.sh
將注釋的 export JAVA_HOME =
改為 export JAVA_HOME=/home/java/jdk1.8
Esc按:wq保存
同理修改
vim yarn-env.sh
3.4、修改hdfs-site.xml
下面的HDFS的存放路徑,可以根據自己機器更改。
<configuration>
<property>
<name>dfs.name.dir</name>
<!-- 由於我的是root用戶所以寫成root,如果你創建的文件夾不在root下記得換掉 -->
<value>/root/hadoop/dfs/name</value>
<description>Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently.</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/root/hadoop/dfs/data</value>
<description>Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks.</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<!-- 如果不設置的話,則需要在host文件中配置好映射你的hostnamme -->
<name>dfs.http.address</name>
<value>0.0.0.0:50070</value>
</property>
</configuration>
3.5、修改mapred-site.xml
他是確定執行mapreduce的運行框架配置
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Esc按:wq保存
3.6、修改yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>你的hostname</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>${yarn.resourcemanager.hostname}:8032</value>
</property>
<property>
<description>The address of the scheduler interface.</description>
<name>yarn.resourcemanager.scheduler.address</name>
<value>${yarn.resourcemanager.hostname}:8030</value>
</property>
<property>
<description>The http address of the RM web application.</description>
<name>yarn.resourcemanager.webapp.address</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>
<property>
<description>The https adddress of the RM web application.</description>
<name>yarn.resourcemanager.webapp.https.address</name>
<value>${yarn.resourcemanager.hostname}:8090</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>${yarn.resourcemanager.hostname}:8031</value>
</property>
<property>
<description>The address of the RM admin interface.</description>
<name>yarn.resourcemanager.admin.address</name>
<value>${yarn.resourcemanager.hostname}:8033</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8182</value>
<discription>每個節點可用內存,單位MB,默認8182MB</discription>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
說明:yarn.nodemanager.vmem-check-enabled這個的意思是忽略虛擬內存的檢查,如果你是安裝在虛擬機上,這個配置很有用,配上去之后后續操作不容易出問題。如果是實體機上,並且內存夠多,可以將這個配置去掉。
Esc按:wq保存
3.7、修改集群配置
vim workers
將三台機器的hostname寫入進去,一行一個
所有的操作只需要在master進行一次即可,其他節點的配置只需要將/etc/hadoop的文件直接拷貝即可
scp -r //home/hadoop/hadoop-3.3.1/etc/hadoop 用戶(我是用的是root)@cluster1:/home/hadoop/hadoop-3.3.1/etc/hadoop
或者FinalShell直接將文件夾下載后再上傳拿過去
3.8、格式化NameNode和DataNode
cd /home/hadoop/hadoop-3.3.1/bin
./hdfs namenode -format
./hdfs datanode -format
格式化成功后會生成version文件在~/hadoop/dfs/data/current中看到他基本上就成功了,但是他只會出現在master服務器中,並不會在兩個從節點出現,因為從節點不會啟動ResourceManager和SecondaryNameNode的服務。
測試搭建
cd /home/hadoop/hadoop-3.3.1/sbin
start-dfs.sh
start-yarn.sh
第一次登錄會問你是否連接,輸入yes后再輸入密碼就ok了
由於ssh已經測試過了,所以不會出現詢問。
當主節點啟動完成后在主節點和兩個從節點輸入jps查看
接着訪問master節點的頁面
上述分別為8088端口和50070端口的訪問頁面,出現三個節點則代表你的分布式hadoop集群已經搭建成功了
Hadoop知識回顧
Hadoop是一個開源的大數據框架,是一個分布式計算的解決方案。
Hadoop包含三個核心:
一、HDFS
HDFS是分布式文件系統,有高容錯性的特點,可以部署在價格低廉的服務器上,主要包含namenode和datanode。
Namenode是hdfs中文件目錄和文件分配管理者,它保存着文件名和數據塊的映射管理,數據塊和datanode列表的映射關系。
其中文件名和數據塊的關系保存在磁盤上,但是namenode上不保存數據塊和datanode列表的關系,該列表是通過datanode上報建立起來的。
二、YARN
主要由:ResourceManager,nodeManager,ApplicationMaster,Container組成
ResourceManager(RM)
主要接收客戶端任務請求,接收和監控NodeManager(NM)的資源情況匯報,負責資源的分配與調度,啟動和監控ApplicationMaster(AM),一個集群只有一個。
NodeManager(NM)
主要是節點上的資源管理,啟動Container運行task計算,上報資源、container情況給RM和任務處理情況給AM,整個集群有多個。
ApplicationMaster(AM)
主要是單個Application(Job)的task管理和調度,向RM進行資源的申請,向NM發出launch Container指令,接收NM的task處理狀態信息。每個應用有一個。
Container:
是YARN中資源的抽象,它封裝了某個節點上一定量的資源(CPU和內存兩類資源)。當AM向RM申請資源時,RM為AM返回的資源便是Container表示的。
YARN會為每個任務分配一個Container,且該任務只能使用Container中描述的資源。
三、MapReduce
Hadoop的兩個核心解決了數據存儲問題(HDFS分布式文件系統)和分布式計算問題(MapRe-duce)。
MapReduce是hadoop的一種離線計算框架,適合離線批處理,具有很好的容錯性和擴展性,適合簡單的批處理任務。
Hadoop的特點:
一、擴容能力:能可靠地存儲和處理千兆字節的數據。
二、成本低:可以通過普通機器組成的服務器群來分發以及處理數據,這些服務器群總計可達數千個。
三、高效率:通過分發數據,HADOOP可以在數據所在的節點上並行地處理他們,這使得處理的非常迅速。
四、可靠性:hadoop能自動地維護數據的多份副本,並且在任務失敗后能自動的重新部署計算任務。
結束記錄
在部署雲服務器的時候會遇到很多問題,比如主機通信,安全組端口未開放,服務器無法登錄之類的問題,下面我做個我目前遇到的問題以及解決方案
1、主機通信,確保主機可以ping通,如果ping不通則代表你的服務器是有問題的,但是這種情況很少。
2、安全組端口未開放導致端口50070或8848的頁面無法訪問,找你的安全組添加各自的IP訪問即可。
3、服務器無法訪問:這個情況我是重點要說的,便宜的雲服務器由於沒有任何安全措施設置的話會收到一個名叫kdevtempfsi的挖礦病毒攻擊,而且我的每一台雲服務器都遭受了該攻擊,這個病毒導致我ssh目錄和cron目錄被刪除,導致我無法連接服務器,而且攻擊十分頻繁!基本上每天白天我清理掉后晚上又會被繼續攻擊(主要是我的安全意識低下)
解決方案:
使用VNC登錄服務器(在SSH不可用的前提下)
systemctl status sshd
查看ssh服務狀態后如果是dead的話則需要檢查內部情況
sshd -t
查看是否缺少了文件目錄/var/empty/sshd
如果缺少則創建該目錄
mkdir /var/empty
mkdir /var/empty/sshd
如果不缺少的話則直接啟動ssh服務
service sshd start
此時應該可以連接SSH,
登錄SSH后找到病毒文件地址
find / -name kdevtmpfsi
find / -name kinsing
rm -f 病毒的地址
找到進程並干掉它
ps -ef|grep kinsing
ps -ef|grep kdevtmpfsi
kill -9 pid
接着需要找到定時任務去kill
crontab -l
如果出現一條記錄綁定IP且是國外的,那么就是這個挖礦病毒的,接着刪除它
crontab -r
如果病毒反復攻擊你的服務器,你要檢查你的安全組放行,只針對固定IP固定端口開放,同時搭建Hadoop時沒有啟用kerberos認證,所以在服務安全上hadoop是不可靠的!
4、伴隨着第三種情況,還會出現hadoop子節點異常造成僵屍進程占滿CPU和內存資源,這時候需要kill -9 命令並重啟機器可以解決。
本文引用以及推薦閱讀:
https://blog.csdn.net/lz_1992/article/details/50166101 Hadoop的特點
https://blog.csdn.net/weixin_44161678/article/details/86019336 Hadoop的三大核心
https://segmentfault.com/a/1190000038390745 挖礦病毒解決
http://dblab.xmu.edu.cn/blog/1177-2/ 大數據分布式Hadoop集群部署方案
https://www.zhihu.com/question/333417513 Hadoop到底是干什么的
https://xuwujing.blog.csdn.net/article/details/78637874 大數據Hadoop單機搭建
http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html Hadoop官方文檔
推薦視頻:
https://edu.fanruan.com/video/play/2095 數據倉庫搭建實戰以及Hadoop后續學習路線