從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

Linux

  • Info:
    • Ubuntu 16.10 x64

Docker 本身就是基於 Linux 的,所以首先以我的一台服務器做實驗。雖然最後跑 wordcount 已經由於內存不足而崩掉,但是之前的過程還是可以參考的。

連接服務器

  • 使用 ssh 命令連接遠程服務器。
ssh root@[Your IP Address]
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

ssh root@127.0.0.1

更新軟件列表

apt-get update
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

apt-get update

  • 更新完成。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

更新完成

安裝 Docker

sudo apt-get install docker.io
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

sudo apt-get install docker.io

  • 當遇到輸入是否繼續時,輸入「Y/y」繼續。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

Y

  • 安裝完成。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

安裝完成

  • 輸入「docker」測試是否安裝成功。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

docker

拉取鏡像

  • 鏡像,是 Docker 的核心,可以通過從遠程拉取鏡像即可配置好我們所需要的環境,我們這次需要的是 Hadoop 集羣的鏡像。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

kiwenlau/hadoop-cluster-docker

  • 在本文中,我們將使用 kiwenlau 的 Hadoop 集羣鏡像以及其配置。由於我的服務器本身即在國外,因此拉取鏡像的速度較快,國內由於眾所周知的原因,可以替換為相應的國內源,以加快拉取速度。
sudo docker pull kiwenlau/hadoop:1.0
  • 拉取鏡像完成。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

sudo docker pull kiwenlau/hadoop:1.0

克隆倉庫

  • 克隆倉庫到當前文檔夾(可以自行創建並切換到相應文檔夾)。
git clone https://github.com/kiwenlau/hadoop-cluster-docker
  • 克隆倉庫完成。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

克隆倉庫完成

橋接網絡

sudo docker network create --driver=bridge hadoop
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

sudo docker network create –driver=bridge hadoop

運行容器

cd hadoop-cluster-docker
./start-container.sh
  • 默認是 1 個主節點,2 個從節點,當然也可以根據性能調整為 N 節點,詳見文末參考鏈接。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

./start-container.sh

啟動 Hadoop

./start-hadoop.sh
  • 在上一步,我們已經運行容器,即可直接運行 Hadoop。啟動時長與機器性能有關,也是難為了我這一台 512 MB 內存的服務器。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

./start-hadoop.sh

測試 Word Count

./run-wordcount.sh
  • Word Count 是一個測試 Hadoop 的 Shell 腳本,即計算文本中的單詞個數。不過由於我的服務器內存不夠分配無法完成,所以後續以本機進行測試。

網頁管理

  • 我們可以通過網頁遠程管理 Hadoop:
    • Name Node: [Your IP Address]:50070/
    • Resource Manager: [Your IP Address]:8088/

macOS

  • Info:
    • macOS 10.12.4 beta (16E191a)

下載 & 安裝

  • 打開 Docker 官方網站:https://www.docker.com,選擇社區版,並下載、安裝。Windows 系統用户可以選擇 Windows 版本。

Docker CE

從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

macOS or Windows

運行 Docker

  • 打開 Docker。為了簡單,我沒有改動配置,如需更改,可以在 Preferences 中修改。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

Docker is running

  • 我們可以在終端(Terminal)輸入「docker」,測試是否安裝成功。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

docker

拉取鏡像 & 克隆倉庫 & 橋接網絡 & 運行容器 & 啟動 Hadoop

  • 同 Linux。

測試 Word Count

./run-wordcount.sh
  • 同 Linux,但這次我們可以運算出結果了。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

./run-wordcount.sh

Windows

其實最開始就沒有打算放出 Windows 版,倒不是因為覺得 Windows 不好,而是目前手頭沒有 Windows 的電腦,借用同學的電腦也不是很方便。如果需要安裝 Docker,需要 CPU 支持虛擬化,且安裝了 64 位 Windows 10 Pro/企業版(需要開啟 Hyper-V)。其他版本的 Windows 可以安裝 Docker Toolbox。

  • 暫無。

Intellij IDEA

我們的 Hadoop 集羣已經在容器裏安裝完成,而且已經可以運行。相比自己一個個創建虛擬機,這樣的確十分方便、快捷。為了便於開發調試,接下來就需要在 Intellij IDEA 下配置開發環境,包管理工具選擇 Gradle。Maven 配合 Eclipse 的配置網上已經有很多了,需要的同學可以自行搜索。

Docker 開啟 9000 端口映射

  • 由於我們使用的是 kiwenlau 的鏡像和開源腳本,雖然加快了配置過程,但是也屏蔽了很多細節。比如在其腳本中只默認開啟了 50070 和 8088 的端口映射,我們可以通過 docker ps (注意是在本機,而不是在容器運行該命令)列出所有容器,查看容器映射的端口。
cd hadoop-cluster-docker
vim start-container.sh
  • 切換到腳本文檔夾,使用 Vim 編輯 start-container.sh。在圖中光標處添加以下內容,保存並退出。
-p 9000:9000 \
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

映射 9000 端口

  • 重啟容器,並查看容器狀態,如圖即為映射成功。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

映射端口成功

開啟 Web HDFS 管理*

該步非必須。為了方便在網頁端管理,因此開啟 Web 端,默認關閉。

which hadoop
cd /usr/local/hadoop/etc/hadoop/
ls

vi core-site.xml
  • 找到 Hadoop 配置文檔路徑,使用 Vi 編輯,若 Vi 的插入模式(Insert Mode)中,上下左右變成了 ABCD,那麼可以使用以下命令即可: cp /etc/vim/vimrc ~/.vimrc 修復。
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

Hadoop 配置文檔

  • 添加以下內容。
<property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
</property>
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境
從 0 開始使用 Docker 快速搭建 Hadoop 集羣環境

添加以上內容

啟動 Hadoop

  • 同 Linux。

構建依賴

  • 使用 Intellij IDEA 新建一個 Gradle 項目,在 Build.gradle 中加入以下依賴(對應容器 Hadoop 版本)。
compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '2.7.2'
compile group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: '2.7.2'

Demo

import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;

/**
 * Created by kingcos on 25/03/2017.
 */
public class HDFSOperations {

    FileSystem fileSystem;

    @Before
    public void configure() throws Exception {
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://192.168.1.120:9000");
        fileSystem = FileSystem.get(URI.create("hdfs://192.168.1.120:9000"), configuration, "root");
    }

    @Test
    public void listFiles() throws IOException {
        Path path = new Path("/");
        RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(path, true);

        while (iterator.hasNext()) {
            LocatedFileStatus status = iterator.next();
            System.out.println(status.getPath().getName());
        }
    }

    @Test
    public void rm() throws IOException {
        Path path = new Path("/");
        fileSystem.delete(path, true);
    }

    @Test
    public void mkdir() throws IOException {
        Path path = new Path("/demo");
        fileSystem.mkdirs(path);
    }
}
  • 之後便可以通過 IDEA 直接寫代碼來測試,這裏簡單寫了幾個方法。

總結

  • 在寫這篇文章之前,其實我對 Docker 的概念很不瞭解。但是通過 Learn by do it. 大致知道了其中的概念和原理。我們完全可以構建自己的容器 Dockerfile,來部署生產和開發環境,其強大的可移植性大大縮短配置的過程。
  • 由於個人對 Hadoop 和 Docker 的瞭解甚少,如有錯誤,希望指出,我會學習、改正。
  • 如果有時間,我會再折騰一下其他的玩法 :]

來源:http://www.jianshu.com/p/b75f8bc9346d