linux
info:
- ubuntu 16.10 x64
docker 本身就是基于 linux 的,所以首先以我的一台服务器做实验。虽然最后跑 wordcount 已经由于内存不足而崩掉,但是之前的过程还是可以参考的。
连接服务器
使用 ssh 命令连接远程服务器。
1
|
ssh root@[your ip address]
|
更新软件列表
apt-get update
更新完成。
安装 docker
1
|
sudo apt-get install docker.io
|
当遇到输入是否继续时,输入「y/y」继续。
安装完成
输入「docker」测试是否安装成功。
拉取镜像
镜像,是 docker 的核心,可以通过从远程拉取镜像即可配置好我们所需要的环境,我们这次需要的是 hadoop 集群的镜像。
在本文中,我们将使用 kiwenlau 的 hadoop 集群镜像以及其配置。由于我的服务器本身即在国外,因此拉取镜像的速度较快,国内由于众所周知的原因,可以替换为相应的国内源,以加快拉取速度。
1
|
sudo docker pull kiwenlau /hadoop :1.0
|
拉取镜像完成。
克隆仓库
克隆仓库到当前文件夹(可以自行创建并切换到相应文件夹)。
1
|
git clone https: //github .com /kiwenlau/hadoop-cluster-docker
|
克隆仓库完成
桥接网络
1
|
sudo docker network create --driver=bridge hadoop
|
运行容器
1
2
|
cd hadoop-cluster-docker
. /start-container .sh
|
默认是 1 个主节点,2 个从节点,当然也可以根据性能调整为 n 节点,详见文末参考链接。
启动 hadoop
1
|
. /start-hadoop .sh
|
在上一步,我们已经运行容器,即可直接运行 hadoop。启动时长与机器性能有关,也是难为了我这一台 512 mb 内存的服务器。
测试 word count
1
|
. /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 中修改。
我们可以在终端(terminal)输入「docker」,测试是否安装成功。
拉取镜像 & 克隆仓库 & 桥接网络 & 运行容器 & 启动 hadoop
同 linux。
测试 word count
1
|
. /run-wordcount .sh
|
同 linux,但这次我们可以运算出结果了。
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(注意是在本机,而不是在容器运行该命令)列出所有容器,查看容器映射的端口。
1
2
|
cd hadoop-cluster-docker
vim start-container.sh
|
切换到脚本文件夹,使用 vim 编辑 start-container.sh。在图中光标处添加以下内容,保存并退出。
1
|
-p 9000:9000 \
|
重启容器,并查看容器状态,如图即为映射成功。
开启 web hdfs 管理*
该步非必须。为了方便在网页端管理,因此开启 web 端,默认关闭。
1
2
3
4
5
|
which hadoop
cd /usr/local/hadoop/etc/hadoop/
ls
vi core-site.xml
|
找到 hadoop 配置文件路径,使用 vi 编辑,若 vi 的插入模式(insert mode)中,上下左右变成了 abcd,那么可以使用以下命令即可:cp /etc/vim/vimrc ~/.vimrc
修复。
添加以下内容。
1
2
3
4
|
< property >
< name >dfs.webhdfs.enabled</ name >
< value >true</ value >
</ property >
|
启动 hadoop
同 linux。
构建依赖
使用 intellij idea 新建一个 gradle 项目,在 build.gradle 中加入以下依赖(对应容器 hadoop 版本)。
1
2
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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