1. 程式人生 > >Hadoop系列(一)Docker部署Hadoop叢集

Hadoop系列(一)Docker部署Hadoop叢集

搭建一個Hadoop叢集環境時需要多臺伺服器,對於我們個人,這通常是個門檻,需要使用虛擬機器,安裝作業系統,然後執行起來多個虛機。

安裝作業系統是個不太輕鬆的任務,並且執行多個虛機對個人電腦效能也有一定要求,這些門檻影響了很多小夥伴的實踐積極性

使用Docker的話就簡單了,不用安裝作業系統,直接下載一個映象,如centos,這樣作業系統就有了,基於這個系統映象執行多個容器,就相當於起了多個虛機,而且系統性能的消耗要遠小於虛擬機器。

假設我們有一個 centos7 映象,啟動多個容器,每個容器都有一個IP,都能通過SSH連線操作,這樣就可以在每個容器中安裝 JAVA Hadoop,從而搭建起叢集環境了。

使用Docker搭建Hadoop叢集的過程包括:

  • 1、安裝Docker
  • 2、獲取centos映象
  • 3、安裝SSH
  • 4、構建Hadoop映象
  • 5、為容器配置IP及SSH無密碼登陸
  • 6、配置Hadoop
  • 7、Hadoop叢集啟動測試

一、安裝Docker

第1步比較簡單,參考Docker系列之前的文章Docker簡介及安裝

二、獲取centos映象

$ docker pull centos

檢視映象列表的命令:

$ docker images

三、安裝SSH

以centos7映象為基礎,構建一個帶有SSH功能的centos,使用Dockerfile建立

$ vi Dockerfile

內容:

FROM centos
MAINTAINER dys

RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum  install -y openssh-clients

RUN echo "root:111111" | chpasswd
RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f
/etc/ssh/ssh_host_dsa_key RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key RUN mkdir /var/run/sshd EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]

這段內容的大意是:以 centos 映象為基礎,安裝SSH的相關包,設定了root使用者的密碼為 111111,並啟動SSH服務

執行構建映象的命令,新映象命名為 centos7-ssh

$ docker build -t="centos7-ssh" .

執行完成後,可以在映象列表中看到centos7-ssh映象

$ docker images

四、構建Hadoop映象

以前面構建的centos7-ssh映象為基礎,安裝Java、Hadoop構建Hadoop映象

$ vi Dockerfile

內容:

FROM centos7-ssh
ADD jdk-8u101-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_101 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH

ADD hadoop-2.7.3.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.7.3 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

RUN yum install -y which sudo

這裡是基於 centos7-ssh 這個映象,把 JAVA 和 Hadoop 的環境都配置好了

前提:在Dockerfile所在目錄下準備好 jdk-8u101-linux-x64.tar.gz 與 hadoop-2.7.3.tar.gz

執行構建命令,新映象命名為 hadoop

$ docker build -t="hadoop" .

執行3個hadoop容器,分別命名為 hadoop0,hadoop1,hadoop2,hadoop0 作為master

$ docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 hadoop
$ docker run --name hadoop1 --hostname hadoop1 -d -P hadoop
$ docker run --name hadoop2 --hostname hadoop2 -d -P hadoop

容器hadoop0啟動時,映射了埠號,50070和8088,是用來在瀏覽器中訪問hadoop WEB介面的。

檢視容器是否都正常啟動:

$ docker ps

五、為容器配置IP及SSH無密碼登陸

5.1、為容器配置IP

設定固定IP,需要用到 pipework,用於給容器設定IP

#先下載
$ git clone https://github.com/jpetazzo/pipework.git
$ cp pipework/pipework /usr/local/bin/

#安裝bridge-utils
$ yum -y install bridge-utils

#建立網路
$ brctl addbr br1
$ ip link set dev br1 up
$ ip addr add 192.168.10.1/24 dev br1

此時已經建立好網橋br1,為前面啟動的容器hadoop0、hadoop1、hadoop2分別指定IP

配置IP

$ pipework br1 hadoop0 192.168.10.30/24
$ pipework br1 hadoop1 192.168.10.31/24
$ pipework br1 hadoop2 192.168.10.32/24

分別使用 ping 與 ssh 命令進行驗證,看是否可以ping通和成功登入

$ ping 192.168.10.30
$ ssh 192.168.10.30

5.2、容器間SSH無密碼登陸

前面已經為容器配置IP了,在進行ssh 時需要輸入要登陸的容器的root密碼,Hadoop叢集要求叢集間機器SSH連線時無密碼登陸,下面講述容器間如何配置 SSH無密碼登陸。

新開3個終端視窗,分別連線到 hadoop0,hadoop1,hadoop2,便於操作

$ docker exec -it hadoop0 /bin/bash
$ docker exec -it hadoop1 /bin/bash
$ docker exec -it hadoop2 /bin/bash

(1)修改HOST
在各個容器中修改 /etc/hosts,新增:

192.168.10.30    hadoop0
192.168.10.31    hadoop1
192.168.10.32    hadoop2

注意:將原先容器建立時產生的host去掉,比如172.17.0.0這個網段的host,具體類似如下

172.17.0.1 hadoop0

(2)SSH無密碼登陸配置

Hadoop映象時基於centos7-ssh映象建立的,而centos7-ssh映象在centos映象基礎上安裝了SSH相關的工具包,所以在每個Hadoop容器命令視窗內執行下面命令:

$ ssh-keygen
(執行後會有多個輸入提示,不用輸入任何內容,全部直接回車即可)
$ ssh-copy-id -i /root/.ssh/id_rsa -p 22 [email protected]
$ ssh-copy-id -i /root/.ssh/id_rsa -p 22 [email protected]
$ ssh-copy-id -i /root/.ssh/id_rsa -p 22 [email protected]
#測試
$ ssh hadoop1
#測試完,回退到原先視窗
$ exit

六、配置Hadoop

(1)環境確認檢查

在配置Hadoop之前,在hadoop0、hadoop1、hadoop2各命令視窗檢查下java、hadoop環境變數是否設定正確(構建Hadoop映象的時候,已經安裝Java、Hadoop並設定了相關環境變數)

$ java
$ hadoop

如上述兩命令不起作用,則需要手動配置下兩者的環境變數

$ vi /etc/profile

新增以下環境變數

export JAVA_HOME=/opt/module/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin

export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

載入重新整理環境變數

source /etc/profile

重新檢查下java 和hadoop命令

(2)Hadoop檔案配置

hadoop0中執行

$ cd /opt/module/hadoop
$ mkdir tmp hdfs
$ mkdir hdfs/data hdfs/name

1、core-site.xml配置

vi /opt/module/hadoop/etc/hadoop/core-site.xml

在 < configuration> 塊兒中新增:

    <!-- 指定HDFS中NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop0:9000</value>
    </property>
    <!-- 指定hadoop執行時產生檔案的儲存目錄 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/opt/module/hadoop/tmp</value>
    </property>
    <property>
        <name>io.file.buffer.size</name>
        <value>131702</value>
    </property>

2、hdfs-site.xml配置

vi /opt/module/hadoop/etc/hadoop/hdfs-site.xml

在 < configuration> 塊兒中新增:

    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/opt/module/hadoop/hdfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/opt/module/hadoop/hdfs/data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop0:9001</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>

3、mapred-site.xml配置

這個檔案預設不存在,需要從 mapred-site.xml.template 複製過來

$ cp mapred-site.xml.template mapred-site.xml
vi /opt/module/hadoop/etc/hadoop/mapred-site.xml

在 < configuration> 塊兒中新增:

    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop0:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop0:19888</value>
    </property>

4、yarn-site.xml配置

vi /opt/module/hadoop/etc/hadoop/yarn-site.xml

在 < configuration> 塊兒中新增:

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>hadoop0:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>hadoop0:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>hadoop0:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>hadoop0:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>hadoop0:8088</value>
    </property>

5、slaves配置

vi /opt/module/hadoop/etc/hadoop/slaves

刪除已有內容,新增:

hadoop1
hadoop2

6、hadoop-env.sh配置

找到 export JAVA_HOME=${JAVA_HOME},改為自己JAVA_HOME的絕對路徑,比如:

export JAVA_HOME=/opt/module/hadoop/jdk1.8

7、hadoop叢集配置分發

在 hadoop0 上執行

$ scp -r /opt/module/hadoop hadoop1:/opt/module
$ scp -r /opt/module/hadoop hadoop2:/opt/module

注意:如果各臺伺服器中JAVA_HOME位置不同,記得對 hadoop-env.sh 進行相應修改

七、Hadoop叢集啟動測試

(1)、叢集啟動

在主節點(hadoop0)啟動hadoop,從節點(hadoop1、hadoop2)會自動啟動

1、初始化

第一次啟動叢集時,需要初始化

$ hdfs namenode -format

2、依次啟動配置檔案

$ hadoop-daemon.sh start namenode
$ hadoop-daemon.sh start datanode
$ start-dfs.sh
$ start-yarn.sh
$ mr-jobhistory-daemon.sh start historyserver

附:停止hadoop叢集

$ hadoop-daemon.sh stop namenode
$ hadoop-daemon.sh stop datanode
$ stop-dfs.sh
$ stop-yarn.sh
$ mr-jobhistory-daemon.sh stop historyserver

注:hadoop叢集啟動和停止可以使用start/stop-all.sh,但不推薦。

3、檢查

檢視狀態,在3臺伺服器上分別執行jps

[root@hadoop0 hadoop]# jps
10257 Jps
9122 JobHistoryServer
8675 SecondaryNameNode
8376 DataNode
8281 NameNode
8828 ResourceManager
[root@hadoop0 hadoop]# 
[root@hadoop1 hadoop]# jps
2263 NodeManager
2152 DataNode
2523 Jps
[root@hadoop1 hadoop]# 

瀏覽器中訪問(宿主機Host可以配置下hadoop0的IP地址):

這裡寫圖片描述

這裡寫圖片描述

可以正常訪問的話,可以說明叢集啟動成功了,但不一定可以正常執行,還需要下面的實際驗證。

(2)測試驗證

1、hdfs 操作

建立本地測試檔案
在/opt/module/hadoop目錄下建立測試檔案目錄

$ mkdir wcinput
$ cd wcinput
$ vi wc.input

wc.input檔案內容如下:

hadoop mapreduce
hadoop yarn
hadoop hdfs
mapreduce spark
hadoop hello

建立HDFS目錄

$ hdfs dfs -mkdir -p /user/hadoop/input

上傳檔案,把測試檔案上傳到剛剛建立的目錄中

$ hdfs dfs -put /opt/module/hadoop/wcinput/wc.input /user/hadoop/input

檢視檔案上傳是否正確

[root@hadoop0 hadoop]# hdfs dfs -ls /user/hadoop/input
Found 1 items
-rw-r--r--   2 root supergroup         71 2018-04-17 09:12 /user/hadoop/input/wc.input
[root@hadoop0 hadoop]# 

執行mapreduce程式

hadoop 安裝包中提供了一個示例程式,我們可以使用它對剛剛上傳的檔案進行測試

hadoop jar /home/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /user/hadoop/input /user/hadoop/output

注:在執行過程中,如果長時間處於 running 狀態不動,雖然沒有報錯,但實際上是出錯了,後臺在不斷重試,需要到 logs 目錄下檢視日誌檔案中的錯誤資訊。

檢視輸出結果

[[email protected] hadoop]# hdfs dfs -ls /user/hadoop/output
Found 2 items
-rw-r--r--   2 root supergroup          0 2018-04-17 09:14 /user/hadoop/output/_SUCCESS
-rw-r--r--   2 root supergroup         51 2018-04-17 09:14 /user/hadoop/output/part-r-00000
[[email protected] hadoop]# 

_SUCCESS表示HDFS檔案狀態,生成的結果在part-r-00000中,可檢視

[root@hadoop0 hadoop]# hdfs dfs -cat /user/hadoop/output/part-r-00000
hadoop  4
hdfs    1
hello   1
mapreduce   2
spark   1
yarn    1
[root@hadoop0 hadoop]# 

總結:以上就是使用Docker環境搭建Hadoop映象容器,配置Hadoop叢集,並啟動和測試的例項,測試用的是hadoop官方給的一個wordcount統計,利用hadoop安裝包裡的mapreduce示例jar 計算指定HDFS檔案裡的單詞數,並將結果輸出到指定HDFS目錄。後面會介紹HDFS常用檔案操作命令。

相關推薦

Hadoop系列()Docker部署Hadoop叢集

搭建一個Hadoop叢集環境時需要多臺伺服器,對於我們個人,這通常是個門檻,需要使用虛擬機器,安裝作業系統,然後執行起來多個虛機。 安裝作業系統是個不太輕鬆的任務,並且執行多個虛機對個人電腦效能也有一定要求,這些門檻影響了很多小夥伴的實踐積極性 使用Dock

Kubernetes部署大資料元件系列二:部署Hadoop叢集

系列一中忘了說明,用Kubernetes部署大資料容器平臺,有一個很大的好處是壓根不用操心容器間的網路通訊,不管是同一物理伺服器內,還是跨物理伺服器間的網路通訊,你都不用操心,只需要把容器間互相關心的埠暴露好,把容器間的service name對映好,就OK了。 本篇教大家部署Hadoop 2.7.3叢集,暫

Docker部署Hadoop叢集

前幾天寫了文章“Hadoop 叢集搭建”之後,一個朋友留言說希望介紹下如何使用Docker部署,這個建議很好,Docker不僅在生產環境威力巨大,對於我們在自己電腦中搭建學習實驗環境更是非常便利 搭建一個叢集環境時需要多臺伺服器,對於我們個人,這通常是個門檻,需要使用虛擬

使用docker部署hadoop叢集

> 最近要在公司裡搭建一個hadoop測試叢集,於是採用docker來快速部署hadoop叢集。 ## 0. 寫在前面 網上也已經有很多教程了,但是其中都有不少坑,在此記錄一下自己安裝的過程。 **目標**:使用docker搭建一個一主兩從三臺機器的hadoop2.7.7版本的叢集 **準備**

Docker部署Hadoop集群

功能 rfi rom dock 所在 tle mar oot rac 一、主機規劃3臺主機:1個master、2個slaver/workerip地址使用docker默認的分配地址:master:主機名: hadoop2、ip地址: 172.17.0.2slaver1:主機名

docker部署hadoop+ffmpeg分散式轉碼系統

本系統應用程式部分是基於此專案,也非常感謝這位大神修復了專案中的部分bug。 公司最近需要做一個分散式轉碼系統,百度之後發現使用hadoop+ffmpeg的人居多,因此決定使用上面提到的專案實現分散式轉碼的功能。該專案包含兩個程式:TranscoderClient和Tran

使用Shell指令碼部署Hadoop

測試環境 Linux系統版本:CentOS 7 實現功能 1、Java環境一鍵配置 2、Hadoop單機版一鍵安裝 3、Hadoop偽分散式一鍵安裝 4、Hadoop叢集部署 5、偽分散式hadoop初始化 6、叢集設定SSH免密登入(使用hadoop使用者操作)

Hadoop系列-HDFS HA高可用叢集

前言: 在HDFS叢集的時候我們知道,NameNode只有一個,如果現在NameNode掛掉了,或者NameNode需要硬體或者軟體的升級,那麼勢必就有單點問題。那麼HDFS HA就是來解決這個問題

Hadoop系列(): Hadoop的偽分散式安裝

在進行Hadoop的偽分散式安裝之前,我們首先對Hadoop的一些基礎的要點進行一下說明。關於Hadoop的詳細概念,我們可以在搜狗百科上找到很詳細的答案。 Hadoop是由Apache基金會開發的一個分散式檔案系統,用來儲存,訪問和計算海量資料的框架。 Hadoop

Kubernetes部署大資料元件系列部署Zookeeper叢集

目前的大資料平臺存在的問題: 通過手工方式直接部署在物理機上,過程複雜、效率低,不適合大規模叢集的部署和動態擴容。 由於平臺元件繁多,對宿主機底層庫依賴過高,一旦安裝完成,很難進行遷移,也無法做成模版進行重複使用。 元件升級不夠靈活,往往會對有相同底層依賴的其他元件帶來影響。 採用虛機部署時,會對宿主機產生資

.Net Core2.1 秒殺專案步步實現CI/CD(Centos7.2)系列:k8s高可用叢集搭建總結以及部署API到k8s

前言:本系列部落格又更新了,是博主研究很長時間,親自動手實踐過後的心得,k8s叢集是購買了5臺阿里雲伺服器部署的,這個叢集差不多搞了一週時間,關於k8s的知識點,我也是剛入門,這方面的知識建議參考部落格園大神edisonchou的系列文章《.NET Core on K8S學習實踐系列文章索引(Draft版)》

SpringCloud學習成長之 十 Docker部署cloud項目

dom 壓縮 依賴 後臺應用 ram 復制文件 start foundry image 一、docker簡介 Docker是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VM

docker 部署elasticsearch叢集

[[email protected] ~]# docker imagesREPOSITORY                 &n

centos7下基於docker部署ceph叢集及遇到的問題

Ceph是一個統一的分散式儲存系統,提供較好的效能、可靠性和可擴充套件性。 本文使用三臺伺服器進行安裝,vm1,vm2,vm4,及每臺伺服器上所要安裝的內容 vm1 vm2 vm3 monitor monitor monitor

實戰系列Docker部署Redis

使用Docker安裝redis         1、搜尋映象 docker search redis                

02 使用Docker部署RabbitMQ叢集

用Docker部署RabbitMQ叢集 Welcome to Alibaba Cloud Elastic Compute Service ! [[email protected] ~]# docker pull rabbitmq Using defa

Docker與Kubernetes系列(): Docker的基本概念

映象 我們都知道,作業系統分為核心和使用者空間。對於 Linux 而言,核心啟動後,會掛載 root 檔案系統為其提供使用者空間支援。而 Docker 映象(Image),就相當於是一個 root 檔案系統。比如官方映象 ubuntu:14.04 就包含了完整的一套 Ubuntu 14.04 最小系統的 

使用kubeadm部署kubernetes叢集

此連結中有kubeadm v1.10.3安裝 用了flannel網路 我使用calico網路https://blog.csdn.net/nklinsirui/article/details/80602724github地址https://github.com/cookcode

Docker系列()Docker簡介及安裝

一、Docker簡介 Docker是一個開源的容器引擎,它有助於更快地交付應用。Docker可將應用程式和基礎設施隔離,並且能將基礎設施當作程式一樣進行管理。使用Docker,可更快地打包、測試以及部署應用程式,並可以縮短從編寫到部署執行程式碼的週期。 Do

部署MongoDB叢集Windows版

rem m1 start mongod.exe --config=../config/m1/s1_1 start mongod.exe --config=../config/m1/s1_2 start mongod.exe --config=../config/m1/c1_1 start mongod.exe