如何使用 docker 搭建 hadoop 分散式叢集?

語言: CN / TW / HK

在 Docker 中搭建 Hadoop 分散式叢集,可以按照以下步驟進行操作:

1 安裝 Docker

首先需要在作業系統中安裝 Docker,具體步驟可以參考官方文件,這裡不再贅述。

2 建立 Docker 映象

在 Docker 中建立 Hadoop 映象,可以通過編寫 Dockerfile 檔案,然後使用 docker build 命令構建映象。

以下是一個示例 Dockerfile:


FROM ubuntu:18.04

RUN apt-get update && apt-get install -y wget ssh openjdk-8-jdk

RUN wget https://downloads.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz \
    && tar -xzvf hadoop-3.3.1.tar.gz \
    && mv hadoop-3.3.1 /usr/local/hadoop \
    && rm hadoop-3.3.1.tar.gz

ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
ENV HADOOP_HOME=/usr/local/hadoop
ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

COPY config/* /usr/local/hadoop/etc/hadoop/

RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa && \
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \
    chmod 0600 ~/.ssh/authorized_keys

CMD [ "sh", "-c", "service ssh start; bash"]

其中:

  • FROM 指定使用的基礎映象,這裡選擇的是 Ubuntu 18.04。
  • RUN 指定在容器中執行的命令,這裡安裝了 wget、SSH 和 JDK,並下載和解壓了 Hadoop 軟體包。
  • ENV 設定環境變數,指定了 Java 和 Hadoop 的安裝路徑,以及將 Hadoop 的二進位制檔案新增到 PATH 環境變數中。
  • COPY 將本地的配置檔案複製到容器中,這裡將 Hadoop 的配置檔案複製到容器中。
  • RUN 執行 SSH 相關的命令,生成 SSH 金鑰,將公鑰新增到授權列表中,以便容器間可以相互通訊。
  • CMD 指定容器啟動後執行的命令,這裡啟動 SSH 服務,並進入到互動式 Shell。

在 Dockerfile 所在的目錄中執行以下命令可以構建 Docker 映象:

docker build -t hadoop .

其中 hadoop 是映象的名稱,可以根據實際情況進行修改。

3 建立 Docker 容器

在建立了 Hadoop 映象之後,需要在 Docker 中建立多個容器,模擬 Hadoop 分散式叢集。

首先建立一個 Hadoop 的 Namenode 容器,命名為 namenode

docker run -d -p 50070:50070 -p 9000:9000 --name namenode hadoop

其中:

  • -d 引數指定容器在後臺執行。
  • -p 引數指定容器的埠對映,將容器內的埠對映到主機上,這裡將 Namenode 的 Web UI 埠 50070 和 HDFS 埠 9000 對映到主機的對應埠上。
  • --name 引數指定容器的名稱。
  • hadoop 引數指定使用的映象名稱。

接著建立多個 Hadoop 的 Datanode 容器,命名為 datanode1datanode2datanode3 等等:

docker run -d --name datanode1 hadoop
docker run -d --name datanode2 hadoop
docker run -d --name datanode3 hadoop
可以在執行命令中通過  --link  引數將多個容器連線起來,但這種方法已經過時,推薦使用 Docker 的網路功能進行連線。以下是通過 Docker 網路進行連線的示例:
docker network create hadoop

docker run -d --network hadoop --name namenode -p 50070:50070 -p 9000:9000 hadoop

docker run -d --network hadoop --name datanode1 hadoop
docker run -d --network hadoop --name datanode2 hadoop
docker run -d --network hadoop --name datanode3 hadoop

其中:

  • docker network create hadoop 建立名為 hadoop 的 Docker 網路。
  • --network hadoop 引數指定使用 hadoop 網路。
  • --name 引數指定容器的名稱。

4 配置 Hadoop

在建立好容器之後,需要對 Hadoop 進行一些配置,以使其能夠在分散式叢集中正常工作。

首先需要進入 Namenode 容器,執行以下命令:

docker exec -it namenode bash

接著進入 Hadoop 的配置目錄,執行以下命令:

cd $HADOOP_HOME/etc/hadoop/

修改 hdfs-site.xml 檔案,新增以下配置:

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

這裡設定了 HDFS 的副本數為 3,以及 Namenode 和 Datanode 的資料儲存目錄。

接著修改 core-site.xml 檔案,新增以下配置:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://namenode:9000</value>
    </property>
</configuration>

這裡指定了 Hadoop 的預設檔案系統為 HDFS,使用的是 Namenode 的地址和埠。

最後修改 workers 檔案,將 Datanode 的主機名或 IP 地址新增進去:

datanode1
datanode2
datanode3

這裡使用容器的名稱作為主機名,因為容器之間可以直接通過名稱進行通訊。

5 啟動 Hadoop

在配置好 Hadoop 之後,可以啟動叢集。首先需要進入 Namenode 容器,執行以下命令啟動 Hadoop:

cd $HADOOP_HOME/sbin
./start-dfs.sh

這裡啟動了 HDFS。 接著可以執行以下命令檢視叢集狀態:

jps

輸出應該包含以下程序:

NameNode
DataNode
SecondaryNameNode

這表明叢集已經成功啟動了。

6 執行示例程式

最後可以執行 Hadoop 的示例程式,以確保叢集能夠正常工作。以下是一個簡單的示例,統計一段文字中每個單詞出現的次數:

cd $HADOOP_HOME
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount input output

這裡使用 Hadoop 的 `wordcount` 程式,將輸入檔案路徑設定為 `input` 目錄,將輸出檔案路徑設定為 `output` 目錄。 執行結束後可以檢視輸出目錄中的結果:

hdfs dfs -cat output/*

這裡使用 Hadoop 自帶的 `hdfs` 命令,將輸出目錄中的所有檔案合併並輸出到控制檯上。 至此,已經成功使用 Docker 搭建了一個 Hadoop 分散式叢集,並運行了示例程式。


 

作者:自在的影片分享
原文連結:https://www.zhihu.com/question/585587113/answer/2918926588
侵刪