Mac基於Docker搭建Hadoop集群


寫在前面,本博客大部分內容,參考了:https://zhuanlan.zhihu.com/p/59758201

 

一、Docker下載Ubuntu:

1.首先,需要安裝Docker,如果沒有安裝的,可以參考博客:https://www.runoob.com/docker/macos-docker-install.html

2.現在的 Docker 網絡能夠提供 DNS 解析功能,我們可以使用如下命令為接下來的 Hadoop 集群單獨構建一個虛擬的網絡:

sudo docker network create --driver=bridge hadoop

使用下面這個命令查看 Docker 中的網絡,可以看到剛剛創建的名為 hadoop 的虛擬橋接網絡:

sudo docker network ls

  3.查找 ubuntu 容器:

dhu719@dhu719:~$ sudo docker search ubuntu
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                 Ubuntu is a Debian-based Linux operating sys…   9326                [OK]                
dorowu/ubuntu-desktop-lxde-vnc                         Docker image to provide HTML5 VNC interface …   281                                     [OK]
rastasheep/ubuntu-sshd                                 Dockerized SSH service, built on top of offi…   209                                     [OK]
consol/ubuntu-xfce-vnc                                 Ubuntu container with "headless" VNC session…   161                                     [OK]
ubuntu-upstart                                         Upstart is an event-based replacement for th…   97                  [OK]                
ansible/ubuntu14.04-ansible                            Ubuntu 14.04 LTS with ansible                   96                                      [OK]
neurodebian                                            NeuroDebian provides neuroscience research s…   56                  [OK]                
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          49                                      [OK]
ubuntu-debootstrap                                     debootstrap --variant=minbase --components=m…   40                  [OK]                
nuagebec/ubuntu                                        Simple always updated Ubuntu docker images w23                                      [OK]
tutum/ubuntu                                           Simple Ubuntu docker images with SSH access     19

4.下載 ubuntu 16.04 版本的鏡像文件:

dhu719@dhu719:~$ sudo docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
34667c7e4631: Pull complete 
d18d76a881a4: Pull complete 
119c7358fbfc: Pull complete 
2aaf13f3eff0: Pull complete 
Digest: sha256:58d0da8bc2f434983c6ca4713b08be00ff5586eb5cdff47bcde4b2e88fd40f88
Status: Downloaded newer image for ubuntu:16.04
dhu719@dhu719:~$

5.查看已經下載的鏡像:

dhu719@dhu719:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              ccac37c7045c        4 days ago          1.85GB
ubuntu              16.04               9361ce633ff1        7 days ago          118MB
dhu719@dhu719:~$

6.根據鏡像啟動一個容器,可以看出 shell 已經是容器的 shell 了(第二行開頭,已經是root用戶了):

dhu719@dhu719:~$ sudo docker run -it ubuntu:16.04 /bin/bash
root@fab4da838c2f:/#

7.推出虛擬機:輸入 exit

root@fab4da838c2f:/# exit
exit
dhu719@dhu719:~$

 

二、Dokcer常見容器使用命令:

1.查看正在運行的容器: docker ps

2.查看所有容器:docker ps -a

3.啟動一個狀態為退出的容器,最后一個參數為容器 ID:  docker start fab4da838c2f

4.進入一個容器:docker exec -it fab4da838c2f /bin/bash

5.關閉一個正在運行的容器:docker stop fab4da838c2f (注:最好是結合 docker ps 使用,先查看哪些在運行,然后把容器 id復制一下,就可以使用這個命令關閉了)

 

三、初始化虛擬機

主要是安裝 JDK 1.8 的環境,因為 Spark 要 Scala,Scala 要 JDK 1.8,以及 Hadoop,以此來構建基礎鏡像。

1.進入之前的 Ubuntu 容器,修改 apt源:

cp /etc/apt/sources.list /etc/apt/sources_init.list

2.刪除舊源文件:

rm /etc/apt/sources.list

3.使用 echo 命令將源寫入新文件(將如下數據源,寫到 /etc/apt/sources.list, 如果提示 : vim : command not found,參考:https://www.cnblogs.com/luo-c/p/15976329.html

deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main

deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe

  然后使用 : apt update 更新數據源:            

4.安裝Java,可以使用如下命令自動,也可以自己手動安裝,手動安裝需要先下載到本機,然后將jdk文件傳入容器中

apt install openjdk-8-jdk

安裝完成之后,使用:java -version 來查看是否安裝成功,顯示 java版本號就是成功了。

5.安裝Scala(原文中Scala是為了安裝Spark安裝的,此處也可以一並安裝了)

apt install scala

安裝完成后,輸入:scala,測試是否成功

 要是 Ctrl + D不行的話,也可以試試 Ctrl + C 退出。

6.安裝 Vim工具

apt install vim

7.安裝 net-tools工具

apt install net-tools

8.配置免密登陸:

  • 安裝 SSH: 
root@fab4da838c2f:/# apt-get install openssh-server
  • 安裝 SSH 的客戶端:
root@fab4da838c2f:/# apt-get install openssh-client
  • 進入當前用戶的用戶根目錄
root@fab4da838c2f:/# cd ~
root@fab4da838c2f:~#
  • 生成密鑰,不用輸入,一直回車就行,生成的密鑰在當前用戶根目錄下的 .ssh 文件夾中
root@fab4da838c2f:~# ssh-keygen -t rsa -P ""
  • 將公鑰追加到 authorized_keys 文件中
root@fab4da838c2f:~# cat .ssh/id_rsa.pub >> .ssh/authorized_keys
root@fab4da838c2f:~#
  • 啟動 SSH 服務
root@fab4da838c2f:~# service ssh start
 * Starting OpenBSD Secure Shell server sshd                                                                                                                                 [ OK ] 
root@fab4da838c2f:~#
  • 免密登錄自己
root@fab4da838c2f:~# ssh 127.0.0.1
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-45-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Tue Mar 19 07:46:14 2019 from 127.0.0.1
root@fab4da838c2f:~#
  • 修改 .bashrc 文件,啟動 shell 的時候,自動啟動 SSH 服務,用 vim 打開 .bashrc 文件
root@fab4da838c2f:~# vim ~/.bashrc

  將光標移動到最后面,添加一行:

service ssh start

  添加完的結果為,只顯示最后幾行

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
#    . /etc/bash_completion
#fi
service ssh start

  退出編輯,保存修改。此時,SSH 免密登錄已經完全配置好。

 

四、安裝Hadoop集群

1.下載Hadoop的安裝文件(由於參考的博客中鏈接已經失效,可以使用清華的鏡像鏈接):

wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz

2.解壓到 /usr/local 目錄下面並重命名文件夾

root@fab4da838c2f:~# tar -zxvf hadoop-3.2.2.tar.gz -C /usr/local/
root@fab4da838c2f:~# cd /usr/local/
root@fab4da838c2f:/usr/local# mv hadoop-3.2.2 hadoop       
root@fab4da838c2f:/usr/local#

3.修改 /etc/profile 文件,添加一下環境變量到文件中,使用: vim /etc/profile 打開文本編輯器,在尾部增加如下:

注:JAVA_HOME 為 JDK 安裝路徑,使用 apt 安裝就是這個,用 update-alternatives --config java 可查看(我這里是自己手動安裝的 java環境)

#java
export JAVA_HOME=/java/jdk1.8.0_191/
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
#hadoop
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
export HDFS_DATANODE_USER=root
export HDFS_DATANODE_SECURE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_NAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

4.使環境變量生效

root@fab4da838c2f:/usr/local# source /etc/profile
root@fab4da838c2f:/usr/local#

 

五、配置Hadoop環境(重點來了)

Hadoop配置中,有5個文件是重點配置的,分別是:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、workers,下面就一個個開始配置:

進入Hadoop安裝路徑(我這里是根目錄下面的 /usr/local/hadoop),進入 ./etc/hadoop/,可以看到都是一些配置文件,如下圖所示:

1.修改 hadoop-env.sh 文件,在文件末尾添加以下信息(JAVA_HOME根據自己的修改):

export JAVA_HOME=/java/jdk1.8.0_191
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

2.修改 core-site.xml,修改為:

<configuration>
  <!--指定nameNode的地址--> <property> <name>fs.defaultFS</name> <value>hdfs://h01:8020</value> </property>   <!--指定Hadoop數據的存儲目錄--> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/data</value> </property>   <!--配置HDFS網頁登陸使用的靜態用戶,配置這個之后才有權限可以在網頁端刪除文件、文件夾--> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property> </configuration>

 

3.修改hdfs-site.xml,修改為:

<configuration>
  <!--文件的存儲個數--> <property> <name>dfs.replication</name> <value>3</value> </property>
  <!--nn web端訪問地址,使用網頁訪問HDFS文件系統就是這個端口--> <property> <name>dfs.namenode.http-address</name> <value>h01:9870</value> </property>
  <!--2nn web端訪問地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>h01:9868</value> </property>
  <!--網頁查看HDFS文件內容,出現Couldn‘t preview the file報錯,需要配置的參數--> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>

4.修改mapred-site.xml,修改為:

<configuration>
  <!--指定MapReduce程序運行在Yarn上--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>

5.修改yarn-site.xml,修改為:

<configuration>
  <!--指定MR走 shuffle-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
  <!--指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>h01</value>
    </property>
  <!--環境變量的繼承-->
    <property>
        <name>yarn.nodemanager.env-whitelist</name>         
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
</configuration>

 

6.修改workers,修改為:

h01
h02
h03

注意:h01這些后面不要有空格!h03后面,不要有空的行!自己准備起多少集群,就在這里寫幾個,要是准備起5個集群,就寫到h05。

 

六、在Docker中啟動集群

1.先將當前容器導出為鏡像(使用自己的ubuntu容器id),並查看當前鏡像

dhu719@dhu719:~$ sudo docker commit -m "hadoop" -a "hadoop" fab4da838c2f newuhadoop
sha256:648d8e082a231919faeaa14e09f5ce369b20879544576c03ef94074daf978823
dhu719@dhu719:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
newuhadoop          latest              648d8e082a23        7 seconds ago       1.82GB
<none>              <none>              ccac37c7045c        4 days ago          1.85GB
ubuntu              16.04               9361ce633ff1        7 days ago          118MB
dhu719@dhu719:~$

2.啟動3個終端(注意,是要開3個終端!!!)

  • 第一條命令啟動的是 h01 是做 master 節點的,所以暴露了端口,以供訪問 web 頁面
sudo docker run -it --network hadoop -h h01 --name "h01" -p 9870:9870 -p 8088:8088 newuhadoop /bin/bash
  • 后面幾條命令就基本類似,第二條命令
sudo docker run -it --network hadoop -h h02 --name "h02" newuhadoop /bin/bash
  • 第三條命令
sudo docker run -it --network hadoop -h h03 --name "h03" newuhadoop /bin/bash

3.接下來,在 h01 主機中,啟動 Haddop 集群

先進行格式化操作,不格式化操作,hdfs起不來(只有第一次啟動的時候需要初始化,以后啟動就不需要了,先刪除所有機器的 data和logs目錄,然后再進行格式化):

root@h01:/usr/local/hadoop# ./bin/hdfs namenode -format

然后啟動HDFS集群:

root@h01:/usr/local/hadoop# ./sbin/start-dfs.sh

最后,啟動yarn集群管理節點:

root@h01:/usr/local/hadoop# ./sbin/start-yarn.sh

都啟動完成后,使用 jps 命令查看:

root@h01:/usr/local/hadoop# jps
36435 Jps
36087 NodeManager
35959 ResourceManager
35306 SecondaryNameNode
34970 NameNode
35100 DataNode
root@h01:/usr/local/hadoop#

可以看到,除了Jps,一共有5個進程,因為這里沒有將 nameNode、ResourceManager、SecondaryNameNode分開部署,所以都在 h01這一台機器上,實際生產中,應該是需要分開部署的。

至此,Hadoop 集群已經構建好了。

 

七、網頁訪問、Hadoop命令

1.瀏覽器訪問本機的9870端口,可以看到Hadoop的文件管理系統:

 2.瀏覽器訪問本機的8088端口,可以看到Hadoop中 Yarn的資源調度系統:

 3.在 HDFS 中創建 input 文件夾:

root@h01:/usr/local/hadoop# ./bin/hadoop fs -mkdir /input

要是不想每次都輸 ./bin,也可以 cd 進入到 bin目錄中:

root@h01:/usr/local/hadoop/bin# ./hadoop fs -mkdir /input

在剛剛打開的網頁上,點擊進入文件管理系統:

 可以看到剛剛創建的文件夾:

 4.上傳文件

root@h01:/usr/local/hadoop# ls
LICENSE.txt  NOTICE.txt  README.txt  bin  data  etc  include  lib  libexec  logs  sbin  share  text.txt
root@h01:/usr/local/hadoop# ./bin/hadoop fs -put ./text.txt /input
root@h01:/usr/local/hadoop#

在網頁從點擊 input文件夾可以看到:

點擊文件 text.txt,點擊Tail the file 可以看到文件中最后32k的內容,或者也可以點擊 Download下載文件

注:如果點擊 Tail the file查看不了文件的內容,不要慌,配置下面的 “八、踩坑以及一些日常使用” - 第3、第4小節中的內容即可。

 

八、踩坑以及一些日常使用

1.單獨啟動/停止一台機器的HDFS組件: nameNode/ DataNode/ SecondaryNameNode

root@h01:/usr/local/hadoop# ./bin/hdfs --daemon start/stop namenode/datanode/secondarynamenode

2.單獨啟動/停止一台機器的Yarn組件:ResourceManager/ NodeManager

root@h01:/usr/local/hadoop# ./bin/yarn --daemon start/stop resourcemanager/ nodemanager

 3.對於HDFS網頁,查看文件的內容時,顯示:Couldn‘t preview the file

修改瀏覽器所在系統的 hosts 文件(這里要用管理員權限 sudo)

 sudo vim /etc/hosts

增加內容(Hadoop集群中各節點及主機名的映射):

172.18.0.2      h01
172.18.0.3      h02
172.18.0.4      h03

4.在Mac主機ping不通Docker容器中集群節點的地址:

解決辦法,見:https://www.cnblogs.com/luo-c/p/15830769.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM