引入 本文在兩台2核2g的雲伺服器上搭建了Hadoop集群,兩台雲伺服器分別是阿裡雲(hjm)和騰訊雲(gyt),集群部署規劃如下: hjm gyt HDFS NameNode\SecondaryNameNode\DataNode DataNode YARN ResourceManager\Node ...
引入
本文在兩台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界面上傳下載文件,出現卡死情況?
解決方法:暴露伺服器所有埠給對方