因爲種種緣由,掘金等第三方平臺博客再也不保證可以同步更新,歡迎移步 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 |
自從學習 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
Docker 自己就是基於 Linux 的,因此首先以個人一臺服務器作實驗。雖然最後跑 wordcount 已經因爲內存不足而崩掉,可是以前的過程仍是能夠參考的。apache
ssh root@[Your IP Address]
複製代碼
apt-get update
複製代碼
sudo apt-get install docker.io
複製代碼
sudo docker pull kiwenlau/hadoop:1.0
複製代碼
git clone https://github.com/kiwenlau/hadoop-cluster-docker
複製代碼
sudo docker network create --driver=bridge hadoop
複製代碼
cd hadoop-cluster-docker
./start-container.sh
複製代碼
./start-hadoop.sh
複製代碼
./run-wordcount.sh
複製代碼
./run-wordcount.sh
複製代碼
其實最開始就沒有打算放出 Windows 版,倒不是由於以爲 Windows 很差,而是目前手頭沒有 Windows 的電腦,借用同窗的電腦也不是很方便。若是須要安裝 Docker,須要 CPU 支持虛擬化,且安裝了 64 位 Windows 10 Pro/企業版(須要開啓 Hyper-V)。其餘版本的 Windows 能夠安裝 Docker Toolbox。vim
咱們的 Hadoop 集羣已經在容器裏安裝完成,並且已經能夠運行。相比本身一個個創建虛擬機,這樣的確十分方便、快捷。爲了便於開發調試,接下來就須要在 Intellij IDEA 下配置開發環境,包管理工具選擇 Gradle。Maven 配合 Eclipse 的配置網上已經有不少了,須要的同窗能夠自行搜索。bash
docker ps
(注意是在本機,而不是在容器運行該命令)列出全部容器,查看容器映射的端口。cd hadoop-cluster-docker
vim start-container.sh
複製代碼
-p 9000:9000 \
複製代碼
該步非必須。爲了方便在網頁端管理,所以開啓 Web 端,默認關閉。服務器
which hadoop
cd /usr/local/hadoop/etc/hadoop/
ls
vi core-site.xml
複製代碼
cp /etc/vim/vimrc ~/.vimrc
修復。<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
複製代碼
compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '2.7.2'
compile group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: '2.7.2'
複製代碼
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);
}
}
複製代碼