在 Ubuntu 22 的基礎上進行 Hadoop 偽分散式(HDFS)的搭建

2023-03-02 18:02:07

一、使用VMware安裝Ubuntu虛擬機器器

在Linux系統各個發行版中,Ubuntu系統在伺服器端和桌面端使用佔比最高,網路上資料最是齊全,所以這裡使用Ubuntu LTS。

整體的系統安裝檔案較大(>1G),這裡採用了迅雷加速下載。迅雷下載地址:下載迅雷工具

下載地址:Download Ubuntu Desktop

 

對於虛擬機器器,這裡採用VMware,因為在諸多免費軟體裡面VMware是最好用的。

VMware 官網連結 https://www.vmware.com/

使用版本:VMware Workstation 16 Pro

百度一個祕鑰就好了,有很多可以查得到的。

 

推薦可以再下個Xshell用於操作終端。

Xshell免費版官網下載地址:https://www.xshell.com/zh/free-for-home-school/

 

這裡採用的是來自CSDN部落格的流程,圖文相當詳細所以就不再繼續贅述。

唯一需要強調一下的是在「13. 設定磁碟容量,並選擇 "將虛擬磁碟拆分成多個檔案" 。(這裡的磁碟大小看個人需求,大於等於推薦的大小)」時,可以將磁碟大小調大一點,像我這裡選擇的是80GB,這並不是意味著會馬上佔用你電腦80GB,而是一個類似上限的意思,這東西初始設定好改,後面不夠用了就很麻煩,所以初始給多一點。

二、偽分散式平臺搭建

Part1: 準備工作

首先按 ctrl+alt+t 開啟終端視窗,輸入如下命令建立新使用者 。這條命令建立了可以登陸的 hadoop 使用者,並使用 /bin/bash 作為 shell。

sudo useradd -m hadoop -s /bin/bash
  • sudo命令: 本文中會大量使用到sudo命令。sudo是ubuntu中一種許可權管理機制,管理員可以授權給一些普通使用者去執行一些需要root許可權執行的操作。當使用sudo命令時,就需要輸入您當前使用者的密碼。

接著使用如下命令設定密碼,如果提示密碼過於簡單可以無視,只要兩次相同即可:

sudo passwd hadoop

可為 hadoop 使用者增加管理員許可權,方便部署:

sudo adduser hadoop sudo

然後切換到新建的hadoop使用者下:

su hadoop

更新 apt,在 Ubuntu 中使用 apt 來下載安裝軟體,如果沒更新可能有一些軟體安裝不了。

sudo apt-get update

按照下圖依次點選 ① ②:

 選擇「其他」然後選擇阿里雲映象伺服器。這等效於我們平時在 Windows 系統下安裝 python 包時使用清華映象站。

 選擇關閉後會提醒你資訊過時

 後續操作將不再需要圖形化介面,故建議使用 xshell 軟體,下面演示一下,如不需要可以直接跳轉至Part2。

  • step1:查詢本機的ip地址:
  • step2:建立Windows與虛擬機器器的連線。
  • step3:連線建議勾選「記住使用者名稱」「記住密碼」

Part2: SSH無密碼登入設定

安裝vim,提示時按y即可:

sudo apt-get install vim

  安裝SSH,設定無密碼登入:

sudo apt-get install openssh-server

 SSH首次登陸提示),輸入 yes 。然後按提示輸入密碼,利用 ssh-keygen 生成金鑰,並將金鑰加入到授權中:

ssh localhost
exit
cd ~/.ssh/                     # 若沒有該目錄,再執行一次ssh localhost
ssh-keygen -t rsa              # 會有提示,都按回車就可以
cat ./id_rsa.pub >> ./authorized_keys  # 加入授權

此時再用 ssh localhost 命令,無需輸入密碼就可以直接登入了。

Part3: JDK的安裝與設定

我們需要先將 JDK1.8 (目前企業中主流的 java 版本仍然是 jdk1.8)下載到電腦。

然後將檔案上傳到 Ubuntu 中,這裡我採用的是 rz 的上傳方式,需要借用 xshell 工具。

cd ~
sudo mkdir Downloads # 建立 ~/Downloads 目錄用來存放下載的檔案
cd Downloads     # 進入目標目錄
rz            # 上傳檔案到 Ubuntu 系統中

解壓 JDK 檔案:

cd /usr/lib
sudo mkdir jvm # 建立/usr/lib/jvm目錄用來存放JDK檔案
cd ~ # 進入hadoop使用者的主目錄
cd Downloads  
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm  # 把JDK檔案解壓到 /usr/lib/jvm 目錄下

設定環境變數:

cd ~
vim ~/.bashrc

在檔案中輸入以下內容後,按 Esc 鍵,輸入「:wq」儲存並退出

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

執行如下命令讓.bashrc檔案的設定立即生效:

source ~/.bashrc

驗證環境變數是否生效:

java -version

如果能夠在螢幕上返回如下資訊,則說明安裝成功:

Part4: Hadoop的安裝與設定

首先,你需要下載一個 hadoop-3.3.4.tar.gz(這是一個官網連結),當然你也可以下載 3.1.3 的版本,這並沒有很大的改變。

然後使用同樣的方法將檔案上傳到 Ubuntu 中。

cd ~/Downloads     # 進入目標目錄
rz            # 上傳檔案到 Ubuntu 系統中

將 Hadoop 安裝至 /usr/local/ 中:

sudo tar -zxvf ~/Downloads/hadoop-3.3.4.tar.gz -C /usr/local    # 解壓到/usr/local中
cd /usr/local/
sudo mv ./hadoop-3.3.4/ ./hadoop            # 將資料夾名改為hadoop
sudo chown -R hadoop ./hadoop       # 修改檔案許可權

驗證 hadoop 是否安裝成功:

cd /usr/local/hadoop
bin/hadoop version

如果能夠在螢幕上返回如下資訊,則說明安裝成功:

Part5: Hadoop偽分散式的搭建

Hadoop 的組態檔位於 /usr/local/hadoop/etc/hadoop/ 中,偽分散式需要修改2個組態檔 core-site.xml 和 hdfs-site.xml 。Hadoop的組態檔是 xml 格式,每個設定以宣告 property 的 name 和 value 的方式來實現。

修改組態檔 core-site.xml

vim etc/hadoop/core-site.xml

將原先的<configuration></configuration>改為下面的內容:

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

修改組態檔 hdfs-site.xml

vim etc/hadoop/hdfs-site.xml

將原先的<configuration></configuration>改為下面的內容:

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

設定完成後,執行 NameNode 的格式化:

cd /usr/local/hadoop
bin/hdfs namenode -format

功格式化返回樣例(部分):

STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = hadoop/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:  version = 3.3.4

如果在這一步時提示 Error: JAVA_HOME is not set and could not be found. 的錯誤,首先你要確定前面關於JDK的環境變陣列態檔中沒有出現問題。然後,到hadoop的安裝目錄修改組態檔「/usr/local/hadoop/etc/hadoop/hadoop-env.sh」,在裡面找到「export JAVA_HOME=${JAVA_HOME}」這行,然後,把它修改成JAVA安裝路徑的具體地址,比如,「export JAVA_HOME=/usr/lib/jvm/default-java」,再次啟動Hadoop。

接著開啟 NameNode 和 DataNode 守護行程:

cd /usr/local/hadoop
sbin/start-all.sh  #start-all.sh是個可執行檔案,中間沒有空格

對於偽分散式可以用 start-dfs.sh 啟動hadoop,等效於前面的 start-all.sh

如果啟動 Hadoop 時遇到輸出非常多「ssh: Could not resolve hostname xxx」的異常情況,可通過設定 Hadoop 環境變數來解決。首先按鍵盤的 ctrl + c 中斷啟動,然後在 ~/.bashrc 中,增加如下兩行內容(設定過程與 JAVA_HOME 變數一樣,其中 HADOOP_HOME 為 Hadoop 的安裝目錄):

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

啟動完成後,可以通過命令 jps 來判斷是否成功啟動,若成功啟動則會列出如下程序: "NameNode"、"DataNode" 和 "SecondaryNameNode"(如果 SecondaryNameNode 沒有啟動,請執行 sbin/stop-all.sh 關閉程序,然後再次嘗試啟動嘗試)。如果沒有 NameNode 或 DataNode ,那就是設定不成功,請仔細檢查之前步驟。由於我前面執行的命令為 start-all.sh,所以是下面這個樣子。

 

成功啟動後,可以存取 Web 介面 http://localhost:9870 (由於hadoop版本不同,可能你需要存取的埠號是50070)以及  http://localhost:8088 檢視 NameNode 和 Datanode 資訊,還可以線上檢視 HDFS 中的檔案。

 

 

偽分散式到此就搭建完成啦!

下面會再補充一些報錯以及解決方案

 

 (1)若是 DataNode 沒有啟動,可嘗試如下的方法(注意這會刪除 HDFS 中原有的所有資料,如果原有的資料很重要請不要這樣做)

cd /usr/local/hadoop
sbin/stop-all.sh   # 關閉
rm -r ./tmp     # 刪除 tmp 檔案,注意這會刪除 HDFS 中原有的所有資料
./bin/hdfs namenode -format   # 重新格式化 NameNode
sbin/start-all.sh  # 啟動

 

(2)解決 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable警告問題 

vim ~/.bashrc
# 新增以下內容
export JAVA_LIBRARY_PATH=/usr/local/hadoop/lib/native

然後重新應用環境變數

source ~/.bashrc

 

(3)當遇到9870埠被佔用的問題時,可以通過更改啟動時的埠號來實現啟動,記得先通過 sbin/stop-dfs.sh 關閉服務,然後更改前面的 core-site.xml 檔案,往裡面新增以下內容到<configuration></configuration>中間

<property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>localhost:50090</value>
</property>

 

(4)無法存取網站,這可能是Linux中的防火牆未關閉的問題:

sudo ufw status    # 檢視防火牆狀態
sudo ufw disable    # 關閉防火牆

 

 

 


 

啊,好累,這篇寫了巨久

整理:BDT20040