引入
本文在兩臺2核2g的雲伺服器上搭建了Hadoop叢集,兩臺雲伺服器分別是阿里雲(hjm)和騰訊雲(gyt),叢集部署規劃如下:
hjm | gyt | |
---|---|---|
HDFS | NameNode\SecondaryNameNode\DataNode | DataNode |
YARN | ResourceManager\NodeManager | NodeManager |
經實驗,目前可以正常實現檔案上傳下載,但跑mapreduce程式還出現伺服器資源不夠的情況
搭建過程
新增使用者
useradd hujinming
passwd hujinming
配置使用者sudo許可權
vim /etc/sudoers
在
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
下面新增一行
hujinming ALL=(ALL) NOPASSWD:ALL
建立目錄並更改許可權
在/opt 目錄下建立 module、software 資料夾
mkdir /opt/module
mkdir /opt/software
切換到root使用者下,修改 module、software 資料夾的所有者和所屬組均為hujinming使用者
chown hujinming:hujinming /opt/module
chown hujinming:hujinming /opt/software
檢視 module、software 資料夾的所有者和所屬組
ll
安裝JDK
- 用xftp工具將jdk匯入到opt目錄下面的software資料夾下面
- 解壓jdk到opt/module目錄下
tar -zxvf jdk-8u212-linux.x64.tar.gz -C /opt/module/
-
配置jdk環境變數
- 新建/etc/profile.d/my_env.sh 檔案
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
- 儲存後退出,source 一下/etc/profile 檔案,讓新的環境變數 PATH 生效
source /etc/profile
- 測試jdk是否安裝成功
java -version
安裝hadoop
-
xftp傳輸
-
解壓安裝到/opt/module下面
-
將hadoop新增到環境變數
-
獲取hadoop安裝路徑
pwd
-
開啟/etc/profile.d/my_env.sh 檔案
sudo vim /etc/profile.d/my_env.sh
-
在 my_env.sh 檔案末尾新增如下內容:
#HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-3.1.3 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin
-
儲存退出,讓修改後的檔案生效
-
測試是否安裝成功
-
伺服器IP對映
- 修改主機名
vim /etc/hostname
分別把兩臺伺服器的名字改成hjm和gyt,這裡以gyt舉例,直接在hostname檔案上輸入
gyt
- 改對映檔案
vim /etc/hosts
在linux中鍵入ifconfig命令可以檢視內網ip。在兩臺伺服器中,填寫自己的私網,訪問別人的填寫公網,這裡以gyt為例,gyt的公網IP是175.178.236.48,內網IP是10.0.12.1。這裡要注意一點,阿里雲在hosts檔案中已經將本地IP對映成了一串英文,把這行資訊刪掉再進行上面的操作
47.115.207.108 hjm
10.0.12.1 gyt
-
在客戶端電腦(預設windows)配置對映
因為在客戶端電腦進行hadoop的操作時,兩臺機子會產生通訊,他們通訊時傳送的網路請求url是gyt或者hjm,這在客戶端電腦是無法識別的,所以要將gyt和hjm都對映為他們的公網IP
-
windows + R
-
輸入drivers,回車
-
進入etc檔案
-
編輯hosts檔案(都是公網IP)
175.178.236.48 gyt 47.115.207.108 hjm
-
ssh免密登入
分別要配置4種免密登入:
- hjm -> gyt
- gyt -> hjm
- hjm -> hjm
- gyt -> gyt
注意切換對應使用者操作。先cd到~/.ssh,生成公鑰和私鑰
ssh-keygen -t rsa
這裡以gyt -> hjm或hjm -> hjm為例:
ssh-copy-id hjm
修改配置檔案
cd到$HADOOP_HOME/etc/hadoop目錄
core-site.xml
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hjm:8020</value>
</property>
<!-- 指定 hadoop 資料的儲存目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置 HDFS 網頁登入使用的靜態使用者為 root -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hujinming</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<!-- nn web 端訪問地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hjm:9870</value>
</property>
<!-- 2nn web 端訪問地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hjm:9868</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hjm</value>
</property>
<!-- 環境變數的繼承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<!-- 指定 MapReduce 程式執行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
workers
hjm
gyt
去伺服器上啟動對應埠
- 用各自的伺服器對雙方暴露所有的埠
- 同時,對公網暴露9864、9866、9870、9868埠
問題與解決
-
./sbin/start-dfs.sh 開啟NameNode 和 DataNode 守護程式報錯:
Starting namenodes on [hjm] ERROR: Attempting to operate on hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation. Starting datanodes ERROR: Attempting to operate on hdfs datanode as root ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation. Starting secondary namenodes [hjm] ERROR: Attempting to operate on hdfs secondarynamenode as root ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
解決方法:
在hjm上的start-dfs.sh和stop-dfs.sh上增加如下幾行:
HDFS_DATANODE_USER=hujinming HADOOP_SECURE_SECURE_USER=hdfs HDFS_NAMENODE_USER=hujinming HDFS_SECONDARYNAMENODE_USER=hujinming
在hjm上的start-yarn.sh和stop-yarn.sh上增加如下幾行:
YARN_RESOURCEMANAGER_USER=hujinming HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=hujinming
-
報錯hjm: ERROR: Cannot set priority of namenode process 23214,沒有啟動NameNode和SecondaryNameNode
解決方法:
在兩臺伺服器的/etc/hosts中,填寫自己的私網,訪問別人的填寫公網
- 找不到NameNode和SecondaryNameNode
解決方法:
把所有節點logs和data刪掉,重新格式化namenode,在hjm機子上,執行下面命令:
hdfs namenode -format
- 客戶端(windows)識別不了hjm和gyt
解決方法:改windows下面的主機名對映
- 配置WebUI可跨域?
解決方法:在兩臺伺服器的core-site.xml加入下面程式碼
<!--web console cors settings-->
<property>
<name>hadoop.http.filter.initializers</name>
<value>org.apache.hadoop.security.HttpCrossOriginFilterInitializer</value>
</property>
<property>
<name>hadoop.http.cross-origin.enabled</name>
<value>true</value>
</property>
<property>
<name>hadoop.http.cross-origin.allowed-origins</name>
<value>*</value>
</property>
<property>
<name>hadoop.http.cross-origin.allowed-methods</name>
<value>*</value>
</property>
<property>
<name>hadoop.http.cross-origin.allowed-headers</name>
<value>X-Requested-With,Content-Type,Accept,Origin</value>
</property>
<property>
<name>hadoop.http.cross-origin.max-age</name>
<value>1800</value>
</property>
- 沒有足夠的副本數量?
解決方法:還得看DataNode的數量。因為目前只有2臺裝置,最多也就2個副本,HDFS預設是3個副本,只有節點數的增加到10臺時,副本數才能達到10。詳細請看https://www.yii666.com/article/664023.html
- hadoop指令碼啟動時,錯誤: ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain?
解決方法:在master主機的slaves檔案中刪除localhost即可。詳細請看https://blog.csdn.net/Mr_ZNC/article/details/80700652
- HDFS的webui介面上傳下載檔案,出現卡死情況?
解決方法:暴露伺服器所有埠給對方