Ubuntu16.04 使用Dcoker搭建高可用spark集群

2024-04-17 21:08

本文主要是介绍Ubuntu16.04 使用Dcoker搭建高可用spark集群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

docker 安装看这: https://blog.csdn.net/tonydz0523/article/details/80534985
docker 的 Dockerfile 看这里:http://www.cnblogs.com/jsonhc/p/7767669.html
参考:http://www.cnblogs.com/qingyunzong/p/8634335.html

准备工作

这里我们要用到,hadoop ,jdk, zookeeper,scala, spark。
先创建一个新文件夹 mkdir docker_spark_HA,然后在该文件夹中下载:

# 下载java
wget --no-check-certificate --no-cookie --header "Cookie:oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz#下载zookeeper
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz# 下载hadoop
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz# 下载scala
wget https://downloads.lightbend.com/scala/2.12.1/scala-2.12.1.tgz# 下载spark
wget https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.3.1/spark-2.3.1-bin-hadoop2.7.tgz

创建docker image

创建docker image ,因为环境变量设置的一些问题, 这里使用dockerfile进行image的创建,创建文件:
$ vim Dockerfile
输入如下内容:

# 引用镜像
FROM ubuntu:16.04
#设置维护人员
MAINTAINER ffzs# 复制文件 并解压
ADD jdk-8u181-linux-x64.tar.gz /usr/lib
ADD hadoop-2.7.7.tar.gz /usr/lib
ADD zookeeper-3.4.13.tar.gz /usr/lib
ADD scala-2.12.1.tgz /usr/lib
ADD spark-2.3.1-bin-hadoop2.7.tgz /usr/lib# 环境设置
ENV JAVA_HOME=/usr/lib/jdk1.8.0_181
ENV JRE_HOME=${JAVA_HOME}/jre
ENV CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH=${JAVA_HOME}/bin:$PATHENV ZOOKEEPER_HOME=/usr/lib/zookeeper-3.4.13
ENV PATH=$PATH:$ZOOKEEPER_HOME/binENV HADOOP_HOME=/usr/lib/hadoop-2.7.7
ENV HADOOP_CONFIG_HOME=$HADOOP_HOME/etc/hadoop
ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:ENV SPARK_HOME=/usr/lib/spark-2.3.1-bin-hadoop2.7
ENV PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATHENV SCALA_HOME=/usr/lib/scala-2.12.1
ENV PATH=$PATH:$SCALA_HOME/bin

创建根据file 创建新的 images:
$ docker build -t ubuntu:spark .
这里写图片描述
创建成功
到这里完成了软件安装,环境配置。。

## 修改配置文件

运行docker:
$ docker run -it ubuntu:spark

# 安装 vim ssh net-tools
apt update
apt install vim ssh net-tools
zookeeper配置:

此时进入了docker的bash,修改zookeeper 配置文件:

cd $ZOOKEEPER_HOME/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg

添加如下:

# 添加存储位置
dataDir=/home/hadoop/data/zkdata
# 日志位置
dataLogDir=/home/hadoop/log/zklogserver.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
server.4=hadoop4:2888:3888:observer

创建myid文件:

mkdir -p /home/hadoop/data/zkdata
echo 1 > /home/hadoop/data/zkdata/myid
hadoop配置:
cd $HADOOP_CONFIG_HOME/
vim hadoop-env.sh#修改JAVA_HOME
export JAVA_HOME=/usr/lib/jdk1.8.0_181

修改core-site.xml文件:
vim core-site.xml
添加

<configuration><!-- 指定hdfs的nameservice为myha01 --><property><name>fs.defaultFS</name><value>hdfs://myha01/</value></property><!-- 指定hadoop临时目录 --><property><name>hadoop.tmp.dir</name><value>/home/hadoop/data/hadoopdata/</value></property><!-- 指定zookeeper地址 --><property><name>ha.zookeeper.quorum</name><value>hadoop1:2181,hadoop2:2181,hadoop3:2181,hadoop4:2181</value></property><!-- hadoop链接zookeeper的超时时长设置 --><property><name>ha.zookeeper.session-timeout.ms</name><value>1000</value><description>ms</description></property>
</configuration>

修改hdfs-site.xml文件:
vim hdfs-site.xml
添加如下:

<configuration><!-- 指定副本数 --><property><name>dfs.replication</name><value>2</value></property><!-- 配置namenode和datanode的工作目录-数据存储目录 --><property><name>dfs.namenode.name.dir</name><value>/home/hadoop/data/hadoopdata/dfs/name</value></property><property><name>dfs.datanode.data.dir</name><value>/home/hadoop/data/hadoopdata/dfs/data</value></property><!-- 启用webhdfs --><property><name>dfs.webhdfs.enabled</name><value>true</value></property><!--指定hdfs的nameservice为myha01,需要和core-site.xml中的保持一致 dfs.ha.namenodes.[nameservice id]为在nameservice中的每一个NameNode设置唯一标示符。 配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。 例如,如果使用"myha01"作为nameservice ID,并且使用"nn1""nn2"作为NameNodes标示符 --><property><name>dfs.nameservices</name><value>myha01</value></property><!-- myha01下面有两个NameNode,分别是nn1,nn2 --><property><name>dfs.ha.namenodes.myha01</name><value>nn1,nn2</value></property><!-- nn1的RPC通信地址 --><property><name>dfs.namenode.rpc-address.myha01.nn1</name><value>hadoop1:9000</value></property><!-- nn1的http通信地址 --><property><name>dfs.namenode.http-address.myha01.nn1</name><value>hadoop1:50070</value></property><!-- nn2的RPC通信地址 --><property><name>dfs.namenode.rpc-address.myha01.nn2</name><value>hadoop2:9000</value></property><!-- nn2的http通信地址 --><property><name>dfs.namenode.http-address.myha01.nn2</name><value>hadoop2:50070</value></property><!-- 指定NameNode的edits元数据的共享存储位置。也就是JournalNode列表 该url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId journalId推荐使用nameservice,默认端口号是:8485 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/myha01</value></property><!-- 指定JournalNode在本地磁盘存放数据的位置 --><property><name>dfs.journalnode.edits.dir</name><value>/home/hadoop/data/journaldata</value></property><!-- 开启NameNode失败自动切换 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><!-- 配置失败自动切换实现方式 --><property><name>dfs.client.failover.proxy.provider.myha01</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 --><property><name>dfs.ha.fencing.methods</name><value>sshfenceshell(/bin/true)</value></property><!-- 使用sshfence隔离机制时需要ssh免登陆 --><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_rsa</value></property><!-- 配置sshfence隔离机制超时时间 --><property><name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value></property><property><name>ha.failover-controller.cli-check.rpc-timeout.ms</name><value>60000</value></property>
</configuration>

修改mapred-site.xml 文件:
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
添加如下:

<configuration><!-- 指定mr框架为yarn方式 --><property><name>mapreduce.framework.name</name><value>yarn</value></property><!-- 指定mapreduce jobhistory地址 --><property><name>mapreduce.jobhistory.address</name><value>hadoop1:10020</value></property><!-- 任务历史服务器的web地址 --><property><name>mapreduce.jobhistory.webapp.address</name><value>hadoop1:19888</value></property>
</configuration>

修改yarn配置:
vim yarn-site.xml
添加:

<configuration><!-- 开启RM高可用 --><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!-- 指定RM的cluster id --><property><name>yarn.resourcemanager.cluster-id</name><value>yrc</value></property><!-- 指定RM的名字 --><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><!-- 分别指定RM的地址 --><property><name>yarn.resourcemanager.hostname.rm1</name><value>hadoop3</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>hadoop4</value></property><!-- 指定zk集群地址 --><property><name>yarn.resourcemanager.zk-address</name><value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value></property><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.log-aggregation-enable</name><value>true</value></property><property><name>yarn.log-aggregation.retain-seconds</name><value>86400</value></property><!-- 启用自动恢复 --><property><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><!-- 制定resourcemanager的状态信息存储在zookeeper集群上 --><property><name>yarn.resourcemanager.store.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property><property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value><description>Whether virtual memory limits will be enforced for containers</description></property><property><name>yarn.nodemanager.vmem-pmem-ratio</name><value>4</value><description>Ratio between virtual memory to physical memory when setting memory limits for containers</description></property>
</configuration>

更改slaves:
vim slaves
清空后添加如下:

hadoop1
hadoop2
hadoop3
hadoop4
spark配置
cd $SPARK_HOME/conf/
cp spark-env.sh.template spark-env.sh
vim spark-env.sh

添加:

export JAVA_HOME=/usr/lib/jdk1.8.0_181
export SCALA_HOME=/usr/lib/scala-2.12.1
export HADOOP_HOME=/usr/lib/hadoop-2.7.7
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_WORKER_MEMORY=500m
export SPARK_WORKER_CORES=1
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop1:2181,hadoop2:2181,hadoop3:2181,hadoop4:2181 -Dspark.deploy.zookeeper.dir=/spark"

更改slaves:

cp slaves.template slaves
vim slaves

更改如下:

hadoop1
hadoop2
hadoop3
hadoop4
配置ssh

创建公匙:

vim ~/.bashrc
#添加
/usr/sbin/sshd
mkdir /var/run/sshd
source ~/.bashrc
cd ~
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cd .ssh
cat id_rsa.pub >> authorized_keys

免密登录问题 改动的文件为ssh_config(该文件位于/etc/ssh目录下):
vim /etc/ssh/ssh_config

StrictHostKeyChecking no
UserKnownHostsFile /dev/null

此时docker算是配置完成了 ,我们将其保存:
查看container
docker ps -a
这里写图片描述
保存到本地
docker commit b37acc15d6f5 spark:v1
关闭删除所有container:

docker stop `docker ps -aq`
docker rm `docker ps -aq`

编写启动docker及spark的shell

这里创建一个新叫hadoop的bridge连接:
docker network create hadoop

run-docker.sh

#!/bin/bash# node number is 4N=${1:-5}#
i=1
while [ $i -lt $N ]
dodocker rm -f hadoop$i >/dev/null 2>&1echo "start hadoop$i container..."docker run -itd \--network hadoop \--name hadoop$i \--ip 172.19.0.$(( $i + 1 )) \--hostname hadoop$i \spark:v1 >/dev/null 2>&1docker exec hadoop$i bash -c "echo $i > /home/hadoop/data/zkdata/myid"i=$(( $i + 1 ))
done

zk-start.sh

#! /bin/bashN=${1:-5}i=1
while [ $i -lt $N ]
doecho "==============================hadoop$i==================================="docker exec hadoop$i zkServer.sh startdocker exec hadoop$i zkServer.sh statusi=$(( $i + 1 ))
done

jnn-start.sh

#! /bin/bashN=${1:-4}i=1
while [ $i -lt $N ]
doecho "================================hadoop$i=========================================="docker exec hadoop$i hadoop-daemon.sh start journalnodei=$(( $i + 1 ))
done

hadoop-start.sh

#! /bin/bashdocker exec hadoop1 bash -c "hadoop namenode -format"
docker exec hadoop1 bash -c "scp -r /home/hadoop/data/hadoopdata/ hadoop2:/home/hadoop/data/hadoopdata/"
docker exec hadoop1 bash -c "hdfs zkfc -formatZK"
docker exec hadoop1 bash -c "start-dfs.sh"

spark-start.sh

#! /bin/bashdocker exec hadoop1 bash -c "start-all.sh"
docker exec hadoop2 bash -c "start-master.sh "
docker exec hadoop3 bash -c "start-master.sh "
docker exec hadoop4 bash -c "start-master.sh "

all-start.sh

#! /bin/bashsh run-docker.sh
sh zk-start.sh
sh jnn-start.sh
sh hadoop-start.sh
sh spark-start.sh

stop-docker.sh

#!/bin/bashdocker stop $(docker ps -q) >/dev/null 2>&1
docker rm $(docker ps -aq) >/dev/null 2>&1

运行all-start.sh,开启spark集群:
sh all-start.sh

验证

这时hadoop1为ALIVE 其他为STANDBY
hadoop1:
这里写图片描述

hadoop4
这里写图片描述

验证高可用性,我们这是kill hadoop1上的master:
这里写图片描述

这是,hadoop1,无法访问:
这里写图片描述

hadoop2上的master顶替上:
这里写图片描述

完成。。。。

这篇关于Ubuntu16.04 使用Dcoker搭建高可用spark集群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912849

相关文章

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.