從 0 開始使用 Docker 快速搭建 Hadoop 集群環(huán)境

由于種種原因,簡書等第三方平臺博客不再保證能夠同步更新蔓腐,歡迎移步 GitHub:https://github.com/kingcos/Perspective/矩乐。謝謝!

Hadoop with Docker

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

Preface

自從學(xué)習(xí) iOS/Swift 以來,就沒有太多時間分配給 Java 專業(yè)課散罕,畢竟我不是個三心二用還能樣樣學(xué)好的人分歇。不過作為大三的專業(yè)課,分布式計算技術(shù)還是有去上課的欧漱,畢竟不能最后掛科吧 :]

曾有人說职抡,「開發(fā)一個項目,至少有 50% 時間在配置環(huán)境」硫椰。確實繁调,在折騰了三周的課時之后,我才按照老師給的詳細(xì)步驟配置好 Hadoop 的環(huán)境靶草。盡管如此蹄胰,由于種種原因,班里仍有很多同學(xué)還沒有配置好 Hadoop 的環(huán)境奕翔,導(dǎo)致課程一直停滯裕寨。在偶然中,我想到了 Docker派继,Docker 這個詞我至少在半年前已經(jīng)聽說(當(dāng)然宾袜,恕我孤陋寡聞,Docker 早在 13 年即發(fā)行)驾窟,但一直沒有去了解和使用庆猫。時至今日,我對 Docker 的了解也十分少绅络,簡單的來說月培,Docker 是一種容器(Container)管理工具,通過 Docker 我們可以配置可移植的環(huán)境恩急,方便發(fā)布杉畜。Docker 基于 Linux,但也提供了 macOS 和 Windows 桌面版衷恭,方便在我們的本地機器測試此叠、使用。

雖然本文是一個小白向的文章随珠,但下載和安裝的過程也不會在本文涉及灭袁。一是官方網(wǎng)站必然提供了相應(yīng)的教程,純粹的翻譯毫無意義窗看;二是下載和安裝可能隨著后續(xù)更新發(fā)生略微的區(qū)別简卧,而本文只著眼于配置 Hadoop 集群環(huán)境的搭建。

不過由于個人對 Hadoop 和 Docker 的了解甚少烤芦,如有錯誤举娩,希望指出,我會學(xué)習(xí)、改正铜涉。

Linux

  • Info:
    • Ubuntu 16.10 x64

Docker 本身就是基于 Linux 的智玻,所以首先以我的一臺服務(wù)器做實驗。雖然最后跑 wordcount 已經(jīng)由于內(nèi)存不足而崩掉芙代,但是之前的過程還是可以參考的吊奢。

連接服務(wù)器

  • 使用 ssh 命令連接遠(yuǎn)程服務(wù)器。
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
  • 當(dāng)遇到輸入是否繼續(xù)時页滚,輸入「Y/y」繼續(xù)。
Y
  • 安裝完成铺呵。
安裝完成
  • 輸入「docker」測試是否安裝成功裹驰。
docker

拉取鏡像

  • 鏡像,是 Docker 的核心片挂,可以通過從遠(yuǎn)程拉取鏡像即可配置好我們所需要的環(huán)境幻林,我們這次需要的是 Hadoop 集群的鏡像。
kiwenlau/hadoop-cluster-docker
  • 在本文中音念,我們將使用 kiwenlau 的 Hadoop 集群鏡像以及其配置沪饺。由于我的服務(wù)器本身即在國外,因此拉取鏡像的速度較快闷愤,國內(nèi)由于眾所周知的原因整葡,可以替換為相應(yīng)的國內(nèi)源,以加快拉取速度讥脐。
sudo docker pull kiwenlau/hadoop:1.0
  • 拉取鏡像完成遭居。
sudo docker pull kiwenlau/hadoop:1.0

克隆倉庫

  • 克隆倉庫到當(dāng)前文件夾(可以自行創(chuàng)建并切換到相應(yīng)文件夾)。
git clone https://github.com/kiwenlau/hadoop-cluster-docker
  • 克隆倉庫完成攘烛。
克隆倉庫完成

橋接網(wǎng)絡(luò)

sudo docker network create --driver=bridge hadoop
sudo docker network create --driver=bridge hadoop

運行容器

cd hadoop-cluster-docker
./start-container.sh
  • 默認(rèn)是 1 個主節(jié)點,2 個從節(jié)點镀首,當(dāng)然也可以根據(jù)性能調(diào)整為 N 節(jié)點坟漱,詳見文末參考鏈接。
./start-container.sh

啟動 Hadoop

./start-hadoop.sh
  • 在上一步更哄,我們已經(jīng)運行容器芋齿,即可直接運行 Hadoop。啟動時長與機器性能有關(guān)成翩,也是難為了我這一臺 512 MB 內(nèi)存的服務(wù)器觅捆。
./start-hadoop.sh

測試 Word Count

./run-wordcount.sh
  • Word Count 是一個測試 Hadoop 的 Shell 腳本,即計算文本中的單詞個數(shù)麻敌。不過由于我的服務(wù)器內(nèi)存不夠分配無法完成栅炒,所以后續(xù)以本機進(jìn)行測試。

網(wǎng)頁管理

  • 我們可以通過網(wǎng)頁遠(yuǎn)程管理 Hadoop:
    • Name Node: [Your IP Address]:50070/
    • Resource Manager: [Your IP Address]:8088/

macOS

  • Info:
    • macOS 10.12.4 beta (16E191a)

下載 & 安裝

  • 打開 Docker 官方網(wǎng)站:https://www.docker.com,選擇社區(qū)版赢赊,并下載乙漓、安裝。Windows 系統(tǒng)用戶可以選擇 Windows 版本释移。
Docker CE
macOS or Windows

運行 Docker

  • 打開 Docker叭披。為了簡單,我沒有改動配置玩讳,如需更改涩蜘,可以在 Preferences 中修改。
Docker is running
  • 我們可以在終端(Terminal)輸入「docker」熏纯,測試是否安裝成功同诫。
docker

拉取鏡像 & 克隆倉庫 & 橋接網(wǎng)絡(luò) & 運行容器 & 啟動 Hadoop

  • 同 Linux。

測試 Word Count

./run-wordcount.sh
  • 同 Linux豆巨,但這次我們可以運算出結(jié)果了剩辟。
./run-wordcount.sh

Windows

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

  • 暫無艇棕。

Intellij IDEA

我們的 Hadoop 集群已經(jīng)在容器里安裝完成,而且已經(jīng)可以運行串塑。相比自己一個個建立虛擬機沼琉,這樣的確十分方便、快捷桩匪。為了便于開發(fā)調(diào)試打瘪,接下來就需要在 Intellij IDEA 下配置開發(fā)環(huán)境,包管理工具選擇 Gradle傻昙。Maven 配合 Eclipse 的配置網(wǎng)上已經(jīng)有很多了闺骚,需要的同學(xué)可以自行搜索。

Docker 開啟 9000 端口映射

  • 由于我們使用的是 kiwenlau 的鏡像和開源腳本妆档,雖然加快了配置過程僻爽,但是也屏蔽了很多細(xì)節(jié)。比如在其腳本中只默認(rèn)開啟了 50070 和 8088 的端口映射贾惦,我們可以通過 docker ps(注意是在本機胸梆,而不是在容器運行該命令)列出所有容器敦捧,查看容器映射的端口。
cd hadoop-cluster-docker
vim start-container.sh
  • 切換到腳本文件夾乳绕,使用 Vim 編輯 start-container.sh绞惦。在圖中光標(biāo)處添加以下內(nèi)容,保存并退出洋措。
-p 9000:9000 \
映射 9000 端口
  • 重啟容器济蝉,并查看容器狀態(tài),如圖即為映射成功菠发。
映射端口成功

開啟 Web HDFS 管理*

該步非必須王滤。為了方便在網(wǎng)頁端管理,因此開啟 Web 端滓鸠,默認(rèn)關(guān)閉雁乡。

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

vi core-site.xml
  • 找到 Hadoop 配置文件路徑,使用 Vi 編輯糜俗,若 Vi 的插入模式(Insert Mode)中踱稍,上下左右變成了 ABCD,那么可以使用以下命令即可:cp /etc/vim/vimrc ~/.vimrc 修復(fù)悠抹。
Hadoop 配置文件
  • 添加以下內(nèi)容珠月。
<property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
</property>
添加以上內(nèi)容

啟動 Hadoop

  • 同 Linux。

構(gòu)建依賴

  • 使用 Intellij IDEA 新建一個 Gradle 項目楔敌,在 Build.gradle 中加入以下依賴(對應(yīng)容器 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 直接寫代碼來測試,這里簡單寫了幾個方法卵凑。

總結(jié)

  • 在寫這篇文章之前庆聘,其實我對 Docker 的概念很不了解。但是通過 Learn by do it. 大致知道了其中的概念和原理勺卢。我們完全可以構(gòu)建自己的容器 Dockerfile伙判,來部署生產(chǎn)和開發(fā)環(huán)境,其強大的可移植性大大縮短配置的過程黑忱。
  • 由于個人對 Hadoop 和 Docker 的了解甚少宴抚,如有錯誤,希望指出杨何,我會學(xué)習(xí)酱塔、改正沥邻。
  • 如果有時間危虱,我會再折騰一下其他的玩法 :]

Reference

也歡迎您關(guān)注我的微博 @萌面大道V & 簡書

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市唐全,隨后出現(xiàn)的幾起案子埃跷,更是在濱河造成了極大的恐慌蕊玷,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弥雹,死亡現(xiàn)場離奇詭異垃帅,居然都是意外死亡,警方通過查閱死者的電腦和手機剪勿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門贸诚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厕吉,你說我怎么就攤上這事酱固。” “怎么了头朱?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵运悲,是天一觀的道長。 經(jīng)常有香客問我项钮,道長班眯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任烁巫,我火速辦了婚禮署隘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘程拭。我一直安慰自己定踱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布恃鞋。 她就那樣靜靜地躺著崖媚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恤浪。 梳的紋絲不亂的頭發(fā)上畅哑,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天寝衫,我揣著相機與錄音库正,去河邊找鬼瓶您。 笑死尉间,一個胖子當(dāng)著我的面吹牛社露,可吹牛的內(nèi)容都是我干的扁瓢。 我是一名探鬼主播忽匈,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼种蘸,長吁一口氣:“原來是場噩夢啊……” “哼鞠值!你這毒婦竟也來了媚创?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤彤恶,失蹤者是張志新(化名)和其女友劉穎钞钙,沒想到半個月后鳄橘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡芒炼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年瘫怜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片本刽。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲸湃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出子寓,到底是詐尸還是另有隱情唤锉,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布别瞭,位于F島的核電站窿祥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蝙寨。R本人自食惡果不足惜晒衩,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墙歪。 院中可真熱鬧听系,春花似錦、人聲如沸虹菲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毕源。三九已至浪漠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霎褐,已是汗流浹背址愿。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冻璃,地道東北人响谓。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像省艳,于是被迫代替她去往敵國和親娘纷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容