在阿里雲和騰訊雲的輕量應用伺服器上搭建Hadoop叢集

ZeroZeroSeven發表於2023-09-20

引入

本文在兩臺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埠

問題與解決

  1. ./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
    
  2. 報錯hjm: ERROR: Cannot set priority of namenode process 23214,沒有啟動NameNode和SecondaryNameNode

​ 解決方法:

​ 在兩臺伺服器的/etc/hosts中,填寫自己的私網,訪問別人的填寫公網

  1. 找不到NameNode和SecondaryNameNode

​ 解決方法:

​ 把所有節點logs和data刪掉,重新格式化namenode,在hjm機子上,執行下面命令:

hdfs namenode -format
  1. 客戶端(windows)識別不了hjm和gyt

​ 解決方法:改windows下面的主機名對映

  1. 配置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>
  1. 沒有足夠的副本數量?

​ 解決方法:還得看DataNode的數量。因為目前只有2臺裝置,最多也就2個副本,HDFS預設是3個副本,只有節點數的增加到10臺時,副本數才能達到10。詳細請看https://www.yii666.com/article/664023.html

  1. hadoop指令碼啟動時,錯誤: ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain?

​ 解決方法:在master主機的slaves檔案中刪除localhost即可。詳細請看https://blog.csdn.net/Mr_ZNC/article/details/80700652

  1. HDFS的webui介面上傳下載檔案,出現卡死情況?

​ 解決方法:暴露伺服器所有埠給對方

相關文章