如何使用 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 http://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 分佈式集羣,並運行了示例程序。


 

作者:自在的影片分享
原文鏈接:http://www.zhihu.com/question/585587113/answer/2918926588
侵刪