使用 Docker 搭建本地 Hadoop 集羣

終於開始學習hadoop了,雖然是學校開課了纔開始跟着學校的課程學,至少也是開始了。
首先要作的就是搭建好一個hadoop的環境,須要三臺主機,配置一個master兩個slave的架構。
老師讓咱們用vbox來作,可是我的以爲虛擬機太慢了,並且還要開三個,太虧。恰好最近開始接觸docker,準備就在docker的環境下搭建hadoop環境。java

安裝docker

能夠考慮使用國內的加速鏡像 daocloud.io 註冊後能夠看到如何使用node

因爲我已經經過官網的方法安裝了,這裏就只記錄下個人操做:linux

curl -fsSL https://get.docker.com/ | sh

這個過程會很漫長,誰讓我做死去官網下呢 (-_-)
腳本執行完後就能發現docker已經安裝好了,並且還添加了一個用戶組docker,能夠把本身經常使用的用戶加入到這個組,方便使用。
可使用docker version查看一下版本git

$ docker version
Client:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   5604cbe
 Built:        Tue Apr 26 23:43:49 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   5604cbe
 Built:        Tue Apr 26 23:43:49 2016
 OS/Arch:      linux/amd64

拉取鏡像

dockergit的命令有些相像,可使用pull命令拉取遠程倉庫,不過git拉取的每每是代碼,而docker拉取的是鏡像github

daocloud拉取鏡像

docker pull daocloud.io/library/centos:centos7

daocloud.io/library/centos表示鏡像的名字
centos7表示鏡像的版本,默認是latest,表示最新版web

啓動鏡像

咱們可使用docker images命令查看本地鏡像列表,選擇啓動哪個鏡像redis

$ docker images
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/library/centos                   centos7             96eecaf1019a        6 days ago          196.7 MB
daocloud.io/library/centos                   latest              96eecaf1019a        6 days ago          196.7 MB
44mfwmrx.mirror.aliyuncs.com/library/redis   latest              ad6e7427198c        2 weeks ago         184.9 MB
daocloud.io/library/ubuntu                   latest              c5f1cf30c96b        2 weeks ago         120.8 MB
hello-world                                  latest              94df4f0ce8a4        3 weeks ago         967 B
daocloud.io/library/ubuntu                   trusty-20160424     8fa7f61732d6        4 weeks ago         188 MB
daocloud.io/daocloud/daocloud-toolset        latest              1ab33797d8a1        4 weeks ago         150.2 MB

$ docker run -h master --dns=61.139.2.69 -it daocloud.io/library/centos:centos7

這個命令啓動一個容器,參數解釋以下docker

參數名 參數值 參數含義
-h master 指定hostname
--dns 61.139.2.69 指定DNS,默認的是8.8.8.8,國內環境...
-it   以交互模式啓動

具體的含義可使用docker run --help查看,這裏就不贅述了。apache

安裝須要的軟件

安裝wget

 不少初學者,對大數據的概念都是模糊不清的,大數據是什麼,能作什麼,學的時候,該按照什麼線路去學習,學完往哪方面發展,想深刻了解,想學習的同窗歡迎加入大數據學習扣君:四一零加上三九一連起來七四四,有大量乾貨(零基礎以及進階的經典實戰)分享給你們,而且有清華大學畢業的資深大數據講師給你們免費授課
$ sudo yum install -y wget vim openssh-server openssh-clients net-tools

拉取到本地的鏡像是儘量小的,因此不少命令都沒有安裝:ubuntu

  • openssh-server : 安裝sshd服務
  • openssh-clients : 安裝ssh命令
  • net-tools : 安裝netstatifconfig等命令

可是安裝完後並不會啓動sshd服務,容器是被docker管理的,沒法使用一些系統命令,要啓動sshd須要執行以下命令

後臺啓動sshd服務,以後就可使用ssh命令登陸容器了。

由於sshhadoop必需的服務,因此咱們要在容器啓動是就開啓,因此把這條命令寫到一個腳本里

$ vim /root/run.sh
$ chmod 750 /root/run.sh
$ cat /root/run.sh
!/bin/bash
/usr/sbin/sshd -D

這裏不讓其後臺運行是爲了保證容器不退出,只要容器在後臺運行,咱們就能夠在宿主機上鍊接容器。

網絡配置

原本是要開始下載jdk的,可是發現不能上網,測試了一下發現是dns的問題。
不怕折騰的我怎麼可以忍受每啓動一個容器都要帶上--dns參數呢,必定能夠改的。
結果是折騰了半天(真的是半天啊),找到了下面的解決方案。

修改默認dns

...
DOCKER_NETWORK_OPTIONS="--dns=61.139.2.69"
...
  • 修改/lib/systemd/system/docker.service
...
[Service]
EnviornmentFile=-/etc/default/docker
ExecStart=/usr/bin/docker daemon -H fd:// $OPTIONS \
          $DOCKER_NETWORK_OPTIONS
...

這裏的設置是按照官網的說明來配置的,百度到的東西都不能使參數生效,不知道爲何

而後重啓docker

systemctl daemon-reload
systemctl restart docker.service
#使用這個命令能夠查看 docker 的啓動命令是否生效
$ ps -ef | grep docker
root     ***     1  0 5月25 ?       00:02:23 /usr/bin/docker daemon -H fd:// --dns=61.139.2.69 --registry-mirror=***

安裝JDK8

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.tar.gz
sudo mkdir /usr/java
sudo tar zxf jdk-8u91-linux-x64.tar.gz -C /usr/java
sudo echo "export JAVA_HOME=/usr/java/jdk1.8.0_91" >> /etc/bashrc
sudo "export PATH=$PATH:$JAVA_HOME/bin" >> /etc/bashrc
sudo echo "export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" >> /etc/bashrc
source /etc/bashrc

安裝Hadoop

下載與環境變量

wget http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz
sudo mkdir /usr/local/hadoop
sudo tar zxf hadoop-2.7.2.tar.gz -C /usr/local/hadoop
sudo echo "export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.2" >> /etc/bashrc
sudo echo "export HADOOP_CONFIG_HOME=$HADOOP_HOME/etc/hadoop" >> /etc/bashrc
sudo echo "export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin" >> /etc/bashrc
source /etc/bashrc

配置

對於hadoop,我仍是個初學者,下面的配置是在網上借鑑的別人的文章

  • 首先在HADOOP_HOME目錄下建立以下目錄

    • tmp:臨時目錄
    • namenode:NameNode 存放目錄
    • datanode:DataNode 存放目錄
  • 切換到HADOOP_CONFIG_HOME目錄

cp mapred-site.xml.template mapred-site.xml
hadoop.tmp.dir
    /usr/local/hadoop/hadoop-2.7.2/tmp
    A base for other temporary dirctories.
  

  
    fs.default.name
    hdfs://master:9000
    true
    The name of the default file system.
    A URI whose scheme and authority determine the FileSystem implemntation.
    The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implemnetation class.
    The uri's authority is used to determine the host, port, etc. for a filesystem.

這裏指定了緩存目錄$HADOOP_HOME/tmp和默認文件系統

dfs.replication
    2
    true
    Default block replication.
    The actual number of replications can be specified when the file is created.
    The default is used if replication is not specified in create time.
    
  

  
    dfs.namenode.name.dir
    /usr/local/hadoop/hadoop-2.7.2/namenode
    true
  

  
    dfs.datenode.data.dir
    /usr/local/hadoop/hadoop-2.7.2/datanode
    true

這裏指定了備份的數目、namenodedatanode的目錄

maperd.job.tracker
    master:9001
    The host and port that the MapReduce job tracker runs at.
    IF "local", then jobs are run in-process as a single map and reduce task

這裏指定了MapReduce做業調度程序的工做主機和端口。

配置免密碼登陸

ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
cd ~/.ssh
#獲取宿主機的公鑰,方便宿主機登陸
scp melo@172.17.0.1:~/.ssh/id_rsa.pub authorized_keys
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys

還有一個細節,由於後面運行時,若是每次都從鏡像啓動,那都是全新的環境,使用ssh登陸時是須要確認的。
爲了不沒必要要的麻煩,特地查了資料,找到解決辦法。
想要達到鏈接新主機時不用確認的效果,就須要修改客戶端的ssh配置的StrictHostKeyChecking。該參數默認爲ask,修改成no

Host *
  StrictHostKeyChecking no

Docker配置

保存Container

docker commit -m "hadoop installed"  centos:hadoop

#啓動 Hadoop

一開始沒有理清hadoop的網絡模型,覺得須要每一個節點都須要知道其餘全部節點的地址,一直在配置固定IP
但認真想一下,hadoop並無這樣的需求,它只須要master知道其餘節點在哪裏就好了,slave之間根本不須要通訊。

 

事實證實上面這段理解是錯誤的,slave須要知道master在哪裏,才能向master發送心跳和數據塊,不然master上的namenode將找不到datanode

由於對docker的網絡配置不熟悉,因此我採用了一個簡單的辦法,修改/root/run.sh

#!/bin/bash
echo "172.17.0.4    master" >> /etc/network
/usr/sbin/sshd -D

由於節點只有3個,我也只開這三個容器,master又是最後啓動的,全部master的地址就是172.17.0.4

struct

因此上面建立的鏡像已經可使用了。

啓動容器

$ docker run -d --name slave1 centos:hadoop /root/run.sh
$ docker run -d --name slave2 centos:hadoop /root/run.sh
$ docker run -d --name master -h master -P --link slave1:slave1 --link slave2:slave2 centos:hadoop /root/run.sh

我將以上三個命令寫到了一個啓動腳本里,直接就能夠啓動了,而後在用ssh登陸到master上啓動hadoop
由於使用的是docker的默認網絡,全部能夠算出masterIP地址,固然,也能夠經過docker netword inspect bridge命令去獲取

啓動 Hadoop

切換到$HADOOP_HOME目錄,首先格式化namenode:

./bin/hadoop namenode -format

看到以下信息,說明格式化成功了。
format
而後就能夠啓動Hadoop

$ ./sbin/start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [master]
master: Warning: Permanently added 'master,172.17.0.4' (RSA) to the list of known hosts.
master: starting namenode, logging to /usr/local/hadoop/hadoop-2.7.2/logs/hadoop-root-namenode-master.out
localhost: starting datanode, logging to /usr/local/hadoop/hadoop-2.7.2/logs/hadoop-root-datanode-master.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: Warning: Permanently added '0.0.0.0' (RSA) to the list of known hosts.
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/hadoop-2.7.2/logs/hadoop-root-secondarynamenode-master.out
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/hadoop-2.7.2/logs/yarn-root-resourcemanager-master.out
localhost: starting nodemanager, logging to /usr/local/hadoop/hadoop-2.7.2/logs/yarn-root-nodemanager-master.out
#使用 jps 查看進程
$ jps
480 SecondaryNameNode
640 ResourceManager
737 NodeManager
290 DataNode
195 NameNode
1192 Jps

個人配置到這裏就完成了,若是有錯誤,歡迎指正😄

相關文章
相關標籤/搜索