寫在前面,本博客大部分內容,參考了: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 w… 23 [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