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

因爲種種緣由,掘金等第三方平臺博客再也不保證可以同步更新,歡迎移步 GitHub:github.com/kingcos/Per…。謝謝!java

Hadoop with Dockergit

Date Notes Hadoop Other
2017-03-27 首次提交 2.7.2 Docker CE, Intellij IDEA 2016.3

Preface

自從學習 iOS/Swift 以來,就沒有太多時間分配給 Java 專業課,畢竟我不是個三心二用還能樣樣學好的人。不過做爲大三的專業課,分佈式計算技術仍是有去上課的,畢竟不能最後掛科吧 :]github

曾有人說,「開發一個項目,至少有 50% 時間在配置環境」。確實,在折騰了三週的課時以後,我才按照老師給的詳細步驟配置好 Hadoop 的環境。儘管如此,因爲種種緣由,班裏仍有不少同窗尚未配置好 Hadoop 的環境,致使課程一直停滯。在偶然中,我想到了 Docker,Docker 這個詞我至少在半年前已經據說(固然,恕我孤陋寡聞,Docker 早在 13 年即發行),但一直沒有去了解和使用。時至今日,我對 Docker 的瞭解也十分少,簡單的來講,Docker 是一種容器(Container)管理工具,經過 Docker 咱們能夠配置可移植的環境,方便發佈。Docker 基於 Linux,但也提供了 macOS 和 Windows 桌面版,方便在咱們的本地機器測試、使用。web

雖然本文是一個小白向的文章,但下載和安裝的過程也不會在本文涉及。一是官方網站必然提供了相應的教程,純粹的翻譯毫無心義;二是下載和安裝可能隨着後續更新發生略微的區別,而本文只着眼於配置 Hadoop 集羣環境的搭建。docker

不過因爲我的對 Hadoop 和 Docker 的瞭解甚少,若有錯誤,但願指出,我會學習、改正。shell

Linux

  • Info:
    • Ubuntu 16.10 x64

Docker 自己就是基於 Linux 的,因此首先以個人一臺服務器作實驗。雖然最後跑 wordcount 已經因爲內存不足而崩掉,可是以前的過程仍是能夠參考的。apache

鏈接服務器

  • 使用 ssh 命令鏈接遠程服務器。
ssh root@[Your IP Address]
複製代碼

ssh root@127.0.0.1

更新軟件列表

apt-get update
複製代碼

apt-get update

  • 更新完成。

更新完成

安裝 Docker

sudo apt-get install docker.io
複製代碼

sudo apt-get install docker.io

  • 當遇到輸入是否繼續時,輸入「Y/y」繼續。

Y

  • 安裝完成。

安裝完成

  • 輸入「docker」測試是否安裝成功。

docker

拉取鏡像

  • 鏡像,是 Docker 的核心,能夠經過從遠程拉取鏡像便可配置好咱們所須要的環境,咱們此次須要的是 Hadoop 集羣的鏡像。

kiwenlau/hadoop-cluster-docker

  • 在本文中,咱們將使用 kiwenlau 的 Hadoop 集羣鏡像以及其配置。因爲個人服務器自己即在國外,所以拉取鏡像的速度較快,國內因爲衆所周知的緣由,能夠替換爲相應的國內源,以加快拉取速度。
sudo docker pull kiwenlau/hadoop:1.0
複製代碼
  • 拉取鏡像完成。

sudo docker pull kiwenlau/hadoop:1.0

克隆倉庫

  • 克隆倉庫到當前文件夾(能夠自行建立並切換到相應文件夾)。
git clone https://github.com/kiwenlau/hadoop-cluster-docker
複製代碼
  • 克隆倉庫完成。

克隆倉庫完成

橋接網絡

sudo docker network create --driver=bridge hadoop
複製代碼

sudo docker network create --driver=bridge hadoop

運行容器

cd hadoop-cluster-docker
./start-container.sh
複製代碼
  • 默認是 1 個主節點,2 個從節點,固然也能夠根據性能調整爲 N 節點,詳見文末參考連接。

./start-container.sh

啓動 Hadoop

./start-hadoop.sh
複製代碼
  • 在上一步,咱們已經運行容器,便可直接運行 Hadoop。啓動時長與機器性能有關,也是難爲了我這一臺 512 MB 內存的服務器。

./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 官方網站:www.docker.com,選擇社區版,並下載、安裝。Windows 系統用戶能夠選擇 Windows 版本。

Docker CE

macOS or Windows

運行 Docker

  • 打開 Docker。爲了簡單,我沒有改動配置,如需更改,能夠在 Preferences 中修改。

Docker is running

  • 咱們能夠在終端(Terminal)輸入「docker」,測試是否安裝成功。

docker

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

  • 同 Linux。

測試 Word Count

./run-wordcount.sh
複製代碼
  • 同 Linux,但此次咱們能夠運算出結果了。

./run-wordcount.sh

Windows

其實最開始就沒有打算放出 Windows 版,倒不是由於以爲 Windows 很差,而是目前手頭沒有 Windows 的電腦,借用同窗的電腦也不是很方便。若是須要安裝 Docker,須要 CPU 支持虛擬化,且安裝了 64 位 Windows 10 Pro/企業版(須要開啓 Hyper-V)。其餘版本的 Windows 能夠安裝 Docker Toolbox。vim

  • 暫無。

Intellij IDEA

咱們的 Hadoop 集羣已經在容器裏安裝完成,並且已經能夠運行。相比本身一個個創建虛擬機,這樣的確十分方便、快捷。爲了便於開發調試,接下來就須要在 Intellij IDEA 下配置開發環境,包管理工具選擇 Gradle。Maven 配合 Eclipse 的配置網上已經有不少了,須要的同窗能夠自行搜索。bash

Docker 開啓 9000 端口映射

  • 因爲咱們使用的是 kiwenlau 的鏡像和開源腳本,雖然加快了配置過程,可是也屏蔽了不少細節。好比在其腳本中只默認開啓了 50070 和 8088 的端口映射,咱們能夠經過 docker ps(注意是在本機,而不是在容器運行該命令)列出全部容器,查看容器映射的端口。
cd hadoop-cluster-docker
vim start-container.sh
複製代碼
  • 切換到腳本文件夾,使用 Vim 編輯 start-container.sh。在圖中光標處添加如下內容,保存並退出。
-p 9000:9000 \
複製代碼

映射 9000 端口

  • 重啓容器,並查看容器狀態,如圖即爲映射成功。

映射端口成功

開啓 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 修復。

Hadoop 配置文件

  • 添加如下內容。
<property>
	<name>dfs.webhdfs.enabled</name>
	<value>true</value>
</property>
複製代碼

添加以上內容

啓動 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 的瞭解甚少,若有錯誤,但願指出,我會學習、改正。
  • 若是有時間,我會再折騰一下其餘的玩法 :]

Reference

也歡迎您關注個人微博 @萌面大道V & 簡書

相關文章
相關標籤/搜索