由于種種原因,簡書等第三方平臺博客不再保證能夠同步更新蔓腐,歡迎移步 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]
更新軟件列表
apt-get update
- 更新完成纹烹。
安裝 Docker
sudo apt-get install docker.io
- 當(dāng)遇到輸入是否繼續(xù)時页滚,輸入「Y/y」繼續(xù)。
- 安裝完成铺呵。
- 輸入「docker」測試是否安裝成功裹驰。
拉取鏡像
- 鏡像,是 Docker 的核心片挂,可以通過從遠(yuǎn)程拉取鏡像即可配置好我們所需要的環(huán)境幻林,我們這次需要的是 Hadoop 集群的鏡像。
- 在本文中音念,我們將使用 kiwenlau 的 Hadoop 集群鏡像以及其配置沪饺。由于我的服務(wù)器本身即在國外,因此拉取鏡像的速度較快闷愤,國內(nèi)由于眾所周知的原因整葡,可以替換為相應(yīng)的國內(nèi)源,以加快拉取速度讥脐。
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
運行容器
cd hadoop-cluster-docker
./start-container.sh
- 默認(rèn)是 1 個主節(jié)點,2 個從節(jié)點镀首,當(dāng)然也可以根據(jù)性能調(diào)整為 N 節(jié)點坟漱,詳見文末參考鏈接。
啟動 Hadoop
./start-hadoop.sh
- 在上一步更哄,我們已經(jīng)運行容器芋齿,即可直接運行 Hadoop。啟動時長與機器性能有關(guān)成翩,也是難為了我這一臺 512 MB 內(nèi)存的服務(wù)器觅捆。
測試 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
- 打開 Docker叭披。為了簡單,我沒有改動配置玩讳,如需更改涩蜘,可以在 Preferences 中修改。
- 我們可以在終端(Terminal)輸入「docker」熏纯,測試是否安裝成功同诫。
拉取鏡像 & 克隆倉庫 & 橋接網(wǎng)絡(luò) & 運行容器 & 啟動 Hadoop
- 同 Linux。
測試 Word Count
./run-wordcount.sh
- 同 Linux豆巨,但這次我們可以運算出結(jié)果了剩辟。
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 \
- 重啟容器济蝉,并查看容器狀態(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ù)悠抹。
- 添加以下內(nèi)容珠月。
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
啟動 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í)酱塔、改正沥邻。
- 如果有時間危虱,我會再折騰一下其他的玩法 :]