使用Docker搭建Spark集群(用於實現網站流量實時分析模塊)


  上一篇使用Docker搭建了Hadoop的完全分布式:使用Docker搭建Hadoop集群(偽分布式與完全分布式),本次記錄搭建spark集群,使用兩者同時來實現之前一直未完成的項目:網站日志流量分析系統(該系統目前用虛擬機實現了離線分析模塊,實時分析由於資源問題尚未完成---這次spark集群用於該項目的實時分析)

一、根據架構圖搭建基礎環境

  ①Scala版本:2.13以及JDK版本:1.8.231,scala下載地址:https://www.scala-lang.org/download/(安裝過程略)

  ②Docker版本:Docker version 19.03.5,下載地址:https://docs.docker.com/install/linux/docker-ce/centos/(安裝過程略)

  ③搭建zookeeper集群(版本:3.4.14),下載地址:http://mirror.bit.edu.cn/apache/zookeeper/

  ④搭建hadoop集群(版本:2.7.7),下載地址:https://archive.apache.org/dist/hadoop/common/

  ⑤安裝flume(版本:1.9.0),下載地址:http://flume.apache.org/download.html

  ⑥搭建Kafka集群(版本:2.4.0),下載地址:http://kafka.apache.org/downloads

  ⑦搭建HBase集群(版本:0.98.17),下載地址:https://archive.apache.org/dist/hbase/

  ⑧搭建Spark集群(版本:2.4.4),下載地址:https://www.apache.org/dyn/closer.lua/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz

 基於以上環境來搭建Spark集群,最終實現網站流量的實時分析(離線分析模塊已完成)--------網站日志流量分析系統,鄙人使用6個容器來實現以上環境的搭建,如下所示

                                                                   

二、啟動容器並固定IP

  可參考鄙人博客使用Docker搭建Hadoop集群(偽分布式與完全分布式)里面有固定ip相關說明。

1、Dockerfile構建具備ssh的centos鏡像

1.1編寫Dockerfile

FROM centos

# 鏡像的作者  
 MAINTAINER xiedong

# 安裝openssh-server和sudo軟件包,並且將sshd的UsePAM參數設置成no  
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
#安裝openssh-clients
RUN yum  install -y openssh-clients

# 添加測試用戶root,密碼root,並且將此用戶添加到sudoers里  
RUN echo "root:root" | 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
# 啟動sshd服務並且暴露22端口  
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
Dockerfile

1.2構建鏡像

docker build -t 'xd/centos-ssh' .    #注意別忘記末尾的點

2、Dockerfile構建具備JDK1.8的centos鏡像

2.1編寫Dockerfile

#基於上一個ssh鏡像構建
FROM xd/centos-ssh    
#拷貝並解壓jdk                                        
ADD jdk-8u231-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_231 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
Dockerfile

2.2構建鏡像

docker build -t 'xd/centos-jdk' .

3、查看構建鏡像

  

4、Docker容器數據卷共享文件

  建議還是針對不同容器建立不同數據卷,鄙人為了方便,但是這樣浪費空間了。

4.1 宿主機建立目錄並上傳軟件

mkdir -p /home/container-softwares

4.2宿主機界面

ps:runhosts.sh腳本用於配置hosts文件映射,后續需要ssh配置免密登錄。

#!/bin/bash
echo 192.168.2.10       hadoop0 >> /etc/hosts
echo 192.168.2.11       hadoop1 >> /etc/hosts
echo 192.168.2.12       hadoop2 >> /etc/hosts

echo 192.168.2.20       spark0 >> /etc/hosts
echo 192.168.2.21       spark1 >> /etc/hosts
echo 192.168.2.22       spark2 >> /etc/hosts
runhosts.sh

5、啟動容器並固定IP

   由於每次開機重啟Docker、重啟容器比較麻煩,所以弄一個腳本最好

 5.1容器初始化腳本(第一次執行)

#/bin/bash
#啟動Docker
sudo systemctl restart docker
echo "Docker restarts successfully!"

#啟動6個容器
#NameNode-zk-HBase-Flume
docker run --name hadoop0 --hostname hadoop0 -v /home/container-softwares:/home/container-softwares -d -P -p 50070:50070 -p 8088:8088 -p 2181:2181 xd/centos-jdk
echo "hadoop0 container start success====="
#DataNode--zk-HBase-Flume
docker run --name hadoop1 --hostname hadoop1 -v /home/container-softwares:/home/container-softwares -d -P xd/centos-jdk
echo "hadoop1 container start success====="
#DataNode-zk-HBase-Flume
docker run --name hadoop2 --hostname hadoop2 -v /home/container-softwares:/home/container-softwares -d -P  xd/centos-jdk
echo "hadoop2 container start success====="


#spark0-kafka節點
docker run --name spark0 --hostname spark0 -v /home/container-softwares:/home/container-softwares -d -P  xd/centos-jdk
echo "spark0 container start success======="
#spark1-kafka節點
docker run --name spark1 --hostname spark1 -v /home/container-softwares:/home/container-softwares -d -P  xd/centos-jdk
echo "spark1 container start success====="
#spark2-kafka節點
docker run --name spark2 --hostname spark2 -v /home/container-softwares:/home/container-softwares -d -P  xd/centos-jdk
echo "spark2 container start success====="


#固定IP========
#pipework下載
yum install -y wget bridge-utils unzip

#wget https://github.com/jpetazzo/pipework/archive/master.zip

unzip pipework-master-old.zip 
mv pipework-master pipework
cp -rp pipework/pipework /usr/local/bin/ -f 

#創建網絡
brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0
echo "網絡創建完成正在固定IP"
pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

pipework br0 spark0 192.168.2.20/24
pipework br0 spark1 192.168.2.21/24
pipework br0 spark2 192.168.2.22/24

echo "固定IP完成,正在測試"

for i in {10,11,12,20,21,22}
do
ips=192.168.2.$i
        result=`ping -w 2 -c 3 ${ips} | grep packet | awk -F" " '{print $6}'| awk -F"%" '{print $1}'| awk -F' ' '{print $1}'`
        if [ $result -eq 0 ]; then
                echo ""${ips}" is ok !"
        else
                echo ""${ips}" is not connected ....."
        fi

done

echo "測試完成"
Init初始化容器腳本

5.2 容器啟動腳本(關機重啟后執行)

  注:該腳本用於已經初始化過的容器

#/bin/bash
#啟動Docker
sudo systemctl restart docker
echo "Docker restarts successfully!"

#啟動6個容器
docker start hadoop0 hadoop1 hadoop2 spark0 spark1 spark2

#固定IP
brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0

pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

pipework br0 spark0 192.168.2.20/24
pipework br0 spark1 192.168.2.21/24
pipework br0 spark2 192.168.2.22/24

echo "固定IP完成,正在測試"

for i in {10,11,12,20,21,22}
do
ips=192.168.2.$i
        result=`ping -w 2 -c 3 ${ips} | grep packet | awk -F" " '{print $6}'| awk -F"%" '{print $1}'| awk -F' ' '{print $1}'`
        if [ $result -eq 0 ]; then
                echo ""${ips}" is ok !"
        else
                echo ""${ips}" is not connected ....."
        fi

done

echo "測試完成"
start啟動腳本

5.3容器停止腳本

#/bin/bash
sudo docker stop hadoop0 hadoop1 hadoop2 spark0 spark1 spark2
echo "容器已停止"
systemctl stop docker 
echo "docker 服務已停"
stop停止腳本

5.4執行初始化腳本,出現以下界面說明成功

三、基礎環境搭建

1、搭建Zookeeper集群

  :根據之前的部署結構,Zookeeper搭建在hadoop0、hadoop1、hadoop2這3個容器,安裝過程可參考鄙人之前博客:zookeeper集群的搭建,其中Zookeeper的相關安裝包已經通過容器數據卷共享到容器內部路徑:/home/container-softwares(可通過初始化腳本看出),最終實現效果如下:

1.1Hadoop0容器zk角色為leader

 1.2Hadoop1容器zk角色為follower

 1.3Hadoop2容器zk角色為follower

2、搭建Hadoop集群

  :根據之前的部署結構,Hadoop集群搭建在hadoop0、hadoop1、hadoop2這3個容器,安裝過程可參考鄙人之前博客:使用Docker搭建Hadoop集群(偽分布式與完全分布式),其中Hadoop的相關安裝包已經通過容器數據卷共享到容器內部路徑:/home/container-softwares(可通過初始化腳本看出),最終實現效果如下:

2.1Hadoop0容器有以下進程

2.2Hadoop1容器有以下進程

 

2.3Hadoop2容器有以下進程

3、搭建HBase集群

 :根據之前的部署結構,HBase搭建在hadoop0、hadoop1、hadoop2這3個容器(安裝過程可參考鄙人之前博客:HBase的完全分布式搭建),此HBase集群主要服務於Spark實時分析產生的中間臨時數據架構圖中可查看,其中HBase的相關安裝包已經通過容器數據卷共享到容器內部路徑:/home/container-softwares(可通過初始化腳本看出),最終實現效果如下:

3.1Hadoop0容器有以下進程

3.2Hadoop1容器有以下進程

3.3Hadoop2容器有以下進程

4、搭建Kafka集群

  :根據之前的部署結構,Kafka搭建在spark0、spark1、spark2這3個容器(安裝過程可參考鄙人之前博客:Kakfa概述及安裝過程),Kafka負責接收Flume中心服務器產生的數據並對接spark用於實時分析,其中Kafka的相關安裝包已經通過容器數據卷共享到容器內部路徑:/home/container-softwares(可通過初始化腳本看出),最終實現效果如下:

4.1Spark0容器有以下進程

4.2Spark1容器有以下進程

4.3Spark2容器有以下進程

5、安裝Flume

  :根據之前的部署結構,Flume搭建在hadoop0、hadoop1、hadoop2這3個容器(安裝過程可參考鄙人之前博客:Flume學習筆記)Hadoop0的flume作為架構圖中的FlumeAgent、另外2個容器中的flume作為中心日志服務器落地HDFS以及Kafka消息隊列,其中Flume的相關安裝包已經通過容器數據卷共享到容器內部路徑:/home/container-softwares(可通過初始化腳本看出),最終實現效果如下:

5.1Hadoop0容器的FlumeAgent相關配置

#聲明Agent
a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1

#聲明source
a1.sources.r1.type = avro
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port =44444

a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = regex_extractor
a1.sources.r1.interceptors.i1.regex = ^(?:[^\\|]*\\|){14}\\d+_\\d+_(\\d+)\\|.*$
a1.sources.r1.interceptors.i1.serializers = s1
a1.sources.r1.interceptors.i1.serializers.s1.name = timestamp

#聲明sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname =hadoop1
a1.sinks.k1.port =44444

a1.sinks.k2.type = avro
a1.sinks.k2.hostname =hadoop2
a1.sinks.k2.port =44444

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = random

#聲明channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

#綁定關系
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c1
FlumeAgent

ps:負責收集應用程序產生的日志並通過負載均衡分發給2個中心日志服務器

5.2Hadoop1與Hadoop2容器的Flume中心日志服務器相關配置

#聲明Agent
a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1 c2
#聲明source
a1.sources.r1.type = avro
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 44444
#聲明sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://hadoop0:9000/logdemo/reportTime=%Y-%m-%d
a1.sinks.k1.hdfs.rollInterval = 30
a1.sinks.k1.hdfs.rollSize = 0
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.timeZone = GMT+8
a1.sinks.k2.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k2.topic = fluxtopic
a1.sinks.k2.brokerList = spark0:9092,spark1:9092,spark2:9092
#聲明channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.channels.c2.type = memory
a1.channels.c2.capacity = 1000
a1.channels.c2.transactionCapacity = 100
#綁定關系
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2
FlumeServer

ps:中心日志服務器負責接收FlumeAgent客戶端日志並落地HDFS以及分發Kafka(2個容器的配置相同

6、搭建Spark集群

  搭建好以上環境后,開始搭建Spark環境

 :根據之前的部署結構,Spark搭建在spark0、spark1、spark2這3個容器,其中Spark的相關安裝包已經通過容器數據卷共享到容器內部路徑:/home/container-softwares(可通過初始化腳本看出

6.1配置環境變量

export SCALA_HOME=/usr/local/scala/scala-2.13.1
export PATH=$PATH:$SCALA_HOME/bin
export JAVA_HOME=/usr/local/jdk1.8
export SPARK_HOME=/home/softwares/spark-2.4.4-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

6.2修改配置文件spark-env.sh(增加以下配置)

cp spark-env.sh.template spark-env.sh
vim spark-env.sh
export JAVA_HOME=/usr/local/jdk1.8
export SCALA_HOME=/usr/local/scala/scala-2.13.1
export SPARK_MASTER_IP=192.168.2.20
export SPARK_WORKER_MEMORY=512m
export HADOOP_CONF_DIR=/home/softwares/hadoop-2.7.7/etc/hadoop

6.3編輯slaves

cp slaves.template slaves
vim slaves

#增加如下配置
spark0
spark1
spark2

6.4拷貝至其他2個容器

scp -rq spark-2.4.4-bin-hadoop2.7 spark1:/home/softwares/
scp -rq spark-2.4.4-bin-hadoop2.7 spark2:/home/softwares/

6.5啟動spark集群

sbin目錄執行:./start-all.sh

6.6spark0容器有以下進程

6.7spark0容器有以下進程

6.8spark0容器有以下進程

  至此、已經完成Spark集群的搭建,下一篇編寫scala代碼實現網站流量實時分析:Scala實現網站流量實時分析


免責聲明!

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



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