安裝 Docker
# 安裝 yum-utils
[[email protected] ~]# yum install -y yum-utils
# 添加Docker CE的yum源
[[email protected] ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[[email protected] ~]# yum makecache fast
# 看一下倉庫裡的最新版本
[[email protected] ~]# yum list docker-ce
[[email protected] ~]# yum -y install docker-ce
[[email protected] ~]# systemctl start docker
[[email protected] ~]# systemctl enable docker
建立 hadoop 容器
hadoop 及其元件,放在 docker 中運作,是以先要建立一個基于 centos 鏡像的 hadoop 容器。
這個hadoop 容器,最後會生成鏡像,最終成為所有 hadoop 節點的模闆。
# 搜尋鏡像
[[email protected] ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 6300 [OK]
## 在搜尋結果清單中OFFICIAL列中有[OK]的表示是官方的鏡像。我們看到第一個就是官方的。
# 拉取
[[email protected] ~]# docker pull centos
# 檢視鏡像
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 3 months ago 215MB
docker network create --driver bridge --subnet 192.168.1.0/16 --gateway 192.168.1.0 mynet
解析:
--driver bridge 表示使用橋接模式
--subnet 192.168.1.0/16 表示子網ip 可以配置設定 192.168.1.2 到 192.168.255.255
--gateway 192.168.1.0 表示網關
mynet 表示網絡名
# 建立 docker 網絡
[[email protected] ~]# docker network create --driver bridge --subnet=172.18.0.0/16 --gateway 172.18.0.1 hadoop_nw
# --driver bridge 表示使用橋接模式
# --subnet 172.18.0.0/16 表示子網ip 可以配置設定 172.18.0.2 到 172.18.255.255
# --gateway 172.18.0.1 表示網關
[[email protected] ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a30056cd8ca2 bridge bridge local
c77cddcd1cd9 hadoop_nw bridge local
32aadb56edcd host host local
72550a0f5547 none null local
[[email protected] ~]# docker network inspect hadoop_nw
...
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
...
## 記住上面的網絡掩碼,本例是 172.18.0.0/16, 這表明了網絡的ip 位址範圍
# 建立并運作容器
[[email protected] ~]# docker run -it -h hadoop --name hadoop centos
## 說明:
## run 表示建立一個容器并運作。
## -it 表示容器運作後直接進入容器内部的指令行。此時就可以像操作虛拟機一樣操作這個容器了。
## -h 表示容器的主機名hostname,和虛拟機的hostname一樣。如果不指定,Docker 會用 CONTAINER ID 來作為 hostname。
## --name 表示容器的名稱。這個前面已經提到了,如果自己不指定,Docker 會自動配置設定一個名稱。不過還是自己指定的更有意義。
## 其中主機名和容器名一不一樣都行,我這裡是給了一樣的,都是 hadoop。
## 最後一個參數centos是鏡像名稱,表示該容器用哪個鏡像建立。
## 這個過程類似于用ISO檔案裝系統。
# 退出并停止目前容器運作
[[email protected] ~]# exit
運作容器
# 檢視本機的所有容器(正在進行或停止運作)
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e1930be0f53 centos "/bin/bash" 5 minutes ago Exited (0) 3 seconds ago hadoop
# 啟動并進入剛才建立的容器
[[email protected] ~]# docker start -i hadoop
注意,以下内容在 hadoop 容器内執行
# 修改時區
[[email protected] /]# rm -f /etc/localtime
[[email protected] /]# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[[email protected] /]# echo Asia/Shanghai > /etc/timezone
# 安裝語言包
[[email protected] /]# yum -y install glibc-langpack-en
[[email protected] /]# echo "export LC_ALL=en_US.UTF-8" >> /etc/profile
[[email protected] /]# echo "export LC_CTYPE=en_US.UTF-8" >> /etc/profile
[[email protected] /]# source /etc/profile
## 這個操作完,可能要退出 hadoop 視窗,再進入才生效
# 安裝 SSH
[[email protected] /]# yum -y install openssh-server.x86_64 openssh-clients.x86_64
# 生成三個主機的 key 檔案
## 均不需做鍵盤輸入内容,一路回車即可
[[email protected] /]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
[[email protected] /]# ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
[[email protected] /]# ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
# 運作 SSH
[[email protected] /]# /usr/sbin/sshd
# 設定 root 密碼
[[email protected] /]# yum -y install passwd cracklib-dicts
[[email protected] /]# passwd
Changing password for user root.
New password: 1qt5!QT%
# 生成使用者的 key 檔案
[[email protected] /]# ssh-keygen
# 設定ssh免密登入到本機
[[email protected] /]# vi /etc/pam.d/sshd
## 注釋下一行
#account required pam_nologin.so
[[email protected] /]# ssh-copy-id localhost
[[email protected] /]# ssh localhost
[[email protected] /]# exit
# 運作hadoop需要which指令,同樣容器沒有自帶,需要我們安裝。
[[email protected] /]# yum -y install which
# 退出目前容器并保持其繼續運作
# 快捷鍵 Ctrl+p+q
複制檔案
注意,以下内容在主控端執行
[[email protected] ~]# docker cp /root/jdk-8u251-linux-x64.tar.gz hadoop:/root/
[[email protected] ~]# docker cp /root/apache-hive-2.3.7-bin.tar.gz hadoop:/root/
[[email protected] ~]# docker cp /root/hadoop-2.9.2.tar.gz hadoop:/root/
[[email protected] ~]# docker cp /root/scala-2.11.8.tgz hadoop:/root/
[[email protected] ~]# docker cp /root/spark-2.2.0-bin-hadoop2.7.tgz hadoop:/root/
[[email protected] ~]# docker cp /root/mysql-connector-java-5.1.49.tar.gz hadoop:/root/
# 進入容器
[[email protected] ~]# docker attach hadoop
注意,以下内容在 hadoop 容器内執行
[[email protected] /]# cd /root
[[email protected] ~]# tar xzf jdk-8u251-linux-x64.tar.gz
[[email protected] ~]# tar xzf hadoop-2.9.2.tar.gz
[[email protected] ~]# tar xzf apache-hive-2.3.7-bin.tar.gz
[[email protected] ~]# tar xzf scala-2.11.8.tgz
[[email protected] ~]# tar xzf spark-2.2.0-bin-hadoop2.7.tgz
[[email protected] ~]# tar xzf mysql-connector-java-5.1.49.tar.gz
[[email protected] ~]# mkdir /root/hadoop-2.9.2/data
[[email protected] ~]# mv apache-hive-2.3.7-bin hive-2.3.7
[[email protected] ~]# cp mysql-connector-java-5.1.49/mysql-connector-java-5.1.49.jar ./hive-2.3.7/lib/
[[email protected] ~]# mv spark-2.2.0-bin-hadoop2.7 spark-2.2.0
[[email protected] ~]# vi /etc/profile.d/run.sh
export JAVA_HOME=/root/jdk1.8.0_251
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/root/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HIVE_HOME=/root/hive-2.3.7
export PATH=$PATH:$HIVE_HOME/bin
/usr/sbin/sshd
[[email protected] ~]# source /etc/profile
hadoop-2.9.2
apache-hive-2.3.7-bin
scala-2.11.8
spark-2.2.0-bin-hadoop2.7
mysql-connector-java-5.1.49
配置 hadoop
注意,以下内容在 hadoop 容器内執行
[[email protected] ~]# cd /root/hadoop-2.9.2/etc/hadoop
[[email protected] hadoop]# vi hadoop-env.sh
## 修改如下鍵值
export JAVA_HOME=/root/jdk1.8.0_251
[[email protected] hadoop]# vi core-site.xml
# 增加如下内容
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop11:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop-2.9.2/data</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
[[email protected] hadoop]# vi hdfs-site.xml
# 增加如下内容
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop11:50090</value>
</property>
[[email protected] hadoop]# vi mapred-site.xml
# 增加如下内容
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop11:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop11:19888</value>
</property>
</configuration>
[[email protected] hadoop]# vi yarn-site.xml
# 增加如下内容
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop11</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1536</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
[[email protected] hadoop]# vi slaves
hadoop11
hadoop12
hadoop13
配置 hive
注意,以下内容在 hadoop 容器内執行
[[email protected] hadoop]# cd /root/hive-2.3.7/conf/
[[email protected] hadoop]# cp hive-default.xml.template hive-site.xml
[[email protected] hadoop]# vi hive-site.xml
# 最前面添加
<property>
<name>system:java.io.tmpdir</name>
<value>/tmp/hive/java</value>
</property>
<property>
<name>system:user.name</name>
<value>${user.name}</value>
</property>
# 逐項修改如下鍵值
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>1qt5!QT%</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>mysql
<value>jdbc:mysql://172.18.0.1:3306/hive?useSSL=false&allowPublicKeyRetrieval=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
[[email protected] conf]# cp hive-env.sh.template hive-env.sh
[[email protected] conf]# vi hive-env.sh
export HADOOP_HOME=/root/hadoop-2.9.2
export HIVE_CONF_DIR=/root/hive-2.3.7/conf
export HIVE_AUX_JARS_PATH=/root/hive-2.3.7/lib
配置 spark
注意,以下内容在 hadoop 容器内執行
[[email protected] ~]# cd /root/spark-2.2.0/conf
[[email protected] ~]# cp spark-env.sh.template spark-env.sh
[[email protected] ~]# vi spark-env.sh
# 添加如下内容
# 配置各種軟體的HOME,一般來說不配置也可以,但是可能會出現問題,還是配上
export JAVA_HOME=/root/jdk1.8.0_251
export HADOOP_HOME=/root/hadoop-2.9.2
export HADOOP_CONF_DIR=/root/hadoop-2.9.2/etc/hadoop
export SCALA_HOME=/root/scala-2.11.8
export SPARK_HOME=/root/spark-2.2.0
# 設定Master的IP
export SPARK_MASTER_IP=172.18.0.11
# 設定Master的主機名
export SPARK_MASTER_HOST=hadoop11
# 設定本節點的IP
export SPARK_LOCAL_IP=172.18.0.11
# 每一個Worker最多可以使用的記憶體
export SPARK_WORKER_MEMORY=1g
# 每一個Worker最多可以使用的cpu core的個數
export SPARK_WORKER_CORES=1
# 送出Application的端口,預設就是這個,萬一要改呢,改這裡
export SPARK_MASTER_WEBUI_PORT=8080
export SPARK_DIST_CLASSPATH=$(/root/hadoop-2.9.2/bin/hadoop classpath)
## 注意,上面 SPARK_LOCAL_IP 這個配置項的值,等會生成各節點容器後要改成各自節點的ip位址
[[email protected] ~]# cp slaves.template slaves
[[email protected] ~]# vi slaves
hadoop11
hadoop12
hadoop13
生成模闆鏡像
注意,以下内容在主控端執行
将上面的 hadoop 容器打包成鏡像
[[email protected] ~]# docker commit -a "luchunyu" -m "Hadoop在centos上搭建的分布模式" hadoop hadoop-centos:v1
sha256:8e9f85b18c9392ec4e2561b72e0ba225f5a91ab9a8d0cb2b45278e6ec258536d
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hadoop-centos v1 8e9f85b18c93 53 seconds ago 3.11GB
centos latest 0d120b6ccaa8 3 months ago 215MB
-a 表示作者。
-m 表示對該鏡像的說明。
pseudo-distributed 被打包容器的名稱
hadoop-centos:v1 生成鏡像的名稱及版本
需要知道的是,因為這個被打包的容器是通過centos鏡像建立的,是以由該容器打包成的新鏡像也包含了centos鏡像。
用新生成的鏡像建立 4 個容器
[[email protected] ~]# docker run -itd -h hadoop11 --name hadoop11 --network=hadoop_nw --ip 172.18.0.11 -p 50070:50070 -p 8088:8088 -p 19888:19888 -p 10000:10000 hadoop-centos:v1
[[email protected] ~]# docker run -itd -h hadoop12 --name hadoop12 --network=hadoop_nw --ip 172.18.0.12 hadoop-centos:v1
[[email protected] ~]# docker run -itd -h hadoop13 --name hadoop13 --network=hadoop_nw --ip 172.18.0.13 hadoop-centos:v1
[[email protected] ~]# docker run -itd -h client --name client --network=hadoop_nw --ip 172.18.0.10 hadoop-centos:v1
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3a4357b7b4a hadoop-centos:v1 "/bin/bash" 4 seconds ago Up 3 seconds client
8bea9c87b37d hadoop-centos:v1 "/bin/bash" 17 seconds ago Up 16 seconds hadoop13
e0b2121b5ccc hadoop-centos:v1 "/bin/bash" 22 seconds ago Up 21 seconds hadoop12
5f5ffa81a6fd hadoop-centos:v1 "/bin/bash" 32 seconds ago Up 30 seconds 0.0.0.0:8088->8088/tcp, 0.0.0.0:10000->10000/tcp, 0.0.0.0:19888->19888/tcp, 0.0.0.0:50070->50070/tcp hadoop11
5e1930be0f53 centos "/bin/bash" 5 days ago Exited (130) 2 days ago hadoop
[[email protected] ~]#
啟動 hadoop
在 client 節點執行
配置節點間SSH免密登入
[[email protected] ~]# docker attach client
# 這一步貌似可以不執行,因為在制作 hadoop 容器時,已經生成了 key 檔案,并實作了免密登入,
# 是以現在複制的三台,key都是一樣的,就可以自動登入了。
[[email protected] /]# ssh-copy-id hadoop11
[[email protected] /]# ssh-copy-id hadoop12
[[email protected] /]# ssh-copy-id hadoop13
# 從 client ssh 登入到 hadoop11,然後再分别執行一下到 hadoop11,hadoop12,hadoop13伺服器的 ssh 登入指令
# 以便在 hadoop11 上生成 known_hosts 清單
啟動
[[email protected] /]# ssh hadoop11 "hdfs namenode -format"
[[email protected] /]# ssh hadoop11 "start-dfs.sh"
[[email protected] /]# ssh hadoop11 "start-yarn.sh"
[[email protected] /]# ssh hadoop11 "mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver"
在浏覽器中檢視叢集資訊
HDFS http://192.168.109.128:50070/
YARN http://192.168.109.128:8088/
jobhistory http://192.168.109.128:19888/
運作wordcount示例程式
# 準備資料
[[email protected] /]# mkdir /root/input
[[email protected] /]# ls --help > /root/input/ls.txt
[[email protected] /]# df --help > /root/input/df.txt
[[email protected] /]# fdisk --help > /root/input/fdisk.txt
[[email protected] /]# hadoop fs -put /root/input /
# 運作
[[email protected] /]# hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /input /output
[[email protected] /]# hadoop fs -cat /output/*
啟動 hive
在 client 節點執行
[[email protected] /]# rm -f /root/hive-2.3.7/conf/hive-site.xml
[[email protected] /]# vi /root/hive-2.3.7/conf/hive-site.xml
# 添加如下内容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop11:9083</value>
</property>
</configuration>
# 初始化
[[email protected] /]# ssh hadoop11 "schematool -dbType mysql -initSchema --verbose"
# 啟動 hive server 端
[[email protected] /]# ssh hadoop11 "nohup hive --service metastore 1>/dev/null 2>&1 &"
# 啟動 hiveserver2
[[email protected] /]# ssh hadoop11 "nohup hiveserver2 1>/dev/null 2>&1 &"
# 測試一下
[[email protected] /]# beeline -u 'jdbc:hive2://hadoop11:10000' -n root
啟動 spark
在 client 節點執行
# 修改所有節點 spark-env.sh 中的 SPARK_LOCAL_IP 為對應的 IP
[[email protected] /]# vi /root/spark-2.2.0/conf/spark-env.sh
[[email protected] /]# ssh hadoop11
[[email protected] /]# ssh hadoop12
[[email protected] /]# ssh hadoop13
[[email protected] /]# ssh client
# 啟動 spark 叢集
[[email protected] /]# ssh hadoop11 "/root/spark-2.2.0/sbin/start-all.sh"
# 停止 spark 叢集
[[email protected] /]# ssh hadoop11 "/root/spark-2.2.0/sbin/stop-all.sh"
# 測試一下
[[email protected] /]# /root/spark-2.2.0/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client --driver-memory 1G --executor-memory 1G --executor-cores 1 /root/spark-2.2.0/examples/jars/spark-examples_2.11-2.2.0.jar 40