从 0 开始使用 Docker 快速搭建 Hadoop 集群环境

由于种种原因,简书等第三方平台博客不再保证能够同步更新,欢迎移步 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

自从学习 iOS/Swift 以来,就没有太多时间分配给 Java 专业课,毕竟我不是个三心二用还能样样学好的人。不过作为大三的专业课,分布式计算技术还是有去上课的,毕竟不能最后挂科吧 :]

曾有人说,「开发一个项目,至少有 50% 时间在配置环境」。确实,在折腾了三周的课时之后,我才按照老师给的详细步骤配置好 Hadoop 的环境。尽管如此,由于种种原因,班里仍有很多同学还没有配置好 Hadoop 的环境,导致课程一直停滞。在偶然中,我想到了 Docker,Docker 这个词我至少在半年前已经听说(当然,恕我孤陋寡闻,Docker 早在 13 年即发行),但一直没有去了解和使用。时至今日,我对 Docker 的了解也十分少,简单的来说,Docker 是一种容器(Container)管理工具,通过 Docker 我们可以配置可移植的环境,方便发布。Docker 基于 Linux,但也提供了 macOS 和 Windows 桌面版,方便在我们的本地机器测试、使用。

虽然本文是一个小白向的文章,但下载和安装的过程也不会在本文涉及。一是官方网站必然提供了相应的教程,纯粹的翻译毫无意义;二是下载和安装可能随着后续更新发生略微的区别,而本文只着眼于配置 Hadoop 集群环境的搭建。

不过由于个人对 Hadoop 和 Docker 的了解甚少,如有错误,希望指出,我会学习、改正。

Linux

  • Info:
    • Ubuntu 16.10 x64

Docker 本身就是基于 Linux 的,所以首先以我的一台服务器做实验。虽然最后跑 wordcount 已经由于内存不足而崩掉,但是之前的过程还是可以参考的。

连接服务器

  • 使用 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 官方网站:https://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。

  • 暂无。

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 \
映射 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 & 简书

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容