Spark Standalone基于ZooKeeper的HA

适用于生产环境

  Spark Standalone使用多个Master节点,通过ZooKeeper推举一个为Active(激活)状态,其它的均为Standby(备用)状态。

  当Active Master节点挂掉后,ZooKeeper会从所有的Standby Mater中推举会一个新的Activer Master。新的Active Master恢复到旧有的Active Master的状态,然后恢复调度。从Activer Master失去作用,到新Active Master恢复调度可能需要1-2分钟。

  故障恢复期间,只影响新应用程序的调用,已经运行的应用程序不会受到影响。

主机规划

  • HDP125、HDP126作为Master节点
  • HDP245、HDP246、HDP247作为ZooKeepr节点
  • HDP127、HDP128作为Worker节点

  注:Mater、ZooKeeper建议各自独占一台服务器,Worker节点可以动态添加。如果集群机器不多,也可以让Mater和ZooKeeper、Worker共用一个节点,但要配置好相关资源,如内存、CPU、网络。

关闭iptables

  关闭正在运行的iptbables防火墙:

service iptables stop

  关闭开机自动启动iptables:

chkconfig iptables off

关闭SElinux

  关闭自在运行的SElinux:

setenforce 0

  修改配置文件,关闭开机自己启动SElinux:

vi /etc/selinux/config

  内容

SELINUX=disabled

配置主机名和映射:

  注意:主机名只能用英文字母、数字、“-”。不能使用下划线“_”,会出现问题。

映射

  Spark通过主机名来进行互相访问,通过修改/etc/hosts文件可配置本地主机名映射关系,在hosts文件中添加计算机的名称和IP的对应关系,如在本机中添加master的主机(假设IP为172.16.219.125),在末尾添加内容为: 172.16.219.125 HDP125

  所有主机都在/etc/hosts添加:

172.16.219.125  HDP125
172.16.219.126  HDP126
172.16.219.127  HDP127
172.16.219.128  HDP128
172.16.219.245  HDP245
172.16.219.246  HDP246
172.16.219.247  HDP247

修改主机名

  修改/etc/sysconfig/network文件,将主机名改为master。

HOSTNAME=master

  操作系统启动的时候,会读取该文件并设置主机名。因此,修改后不会立即生效。只有当系统重启后,主机名便会生效。

  也需要运行如下命令设置主机名,无须重启:

hostname master

  在所有主机上执行上面两步,并把master替换成相应主机名。

用户:

  在所有主机上添加用户:

groupadd spark
useradd spark -g spark

groupadd hadoop
useradd zookeeper -g zookeeper

SSH无密码登录

  Master到Worker节点需要配置SSH无密码登录。

  在Master生成公私钥对:

su spark
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

  在其它主机上创建~/.ssh文件夹:

su spark
mkdir ~/.ssh
chmod 700 ~/.ssh

  把公钥~/.ssh/dsa.pub发送到其它主机:

scp ~/.ssh/dsa.pub spark@HDPXXX:~/.ssh/id_dsa.pub

  测试是否成功:

ssh HDPxxx

安装Java的JDK

  解压:

tar -zxvf jdk-7u51-linux-x64.tar.gz -C /opt
ln -s /opt/jdk1.7.0_51 /opt/jdk

  配置环境变量:

#JDK setting
export JAVA_HOME=/opt/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

安装配置ZooKeeper

  参考3.1.1安装配置ZooKeeper

安装配置Spark

解压与权限

tar -zxvf spark-1.1.0-bin-2.4.0.2.1.4.0-632.tgz -C /opt
ln -s /opt/spark-1.1.0-bin-2.4.0.2.1.4.0-632 /opt/spark
chown -R spark:spark /opt/spark*

配置worker

  vi conf/slaves

HDP126
HDP127

  注:每行一个Worker

配置spark-env.sh

cp conf/spark-env.sh.template conf/spark-env.sh

  vi conf/spark-env.sh

export JAVA_HOME=/opt/jdk
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=HDP245:2181,HDP246:2181,HDP247:2181 -Dspark.deploy.zookeeper.dir=/spark"

  可以为Master和Worker的CPU核心和内存大小进行定制。

  • SPARK_MASTER_IP:设置Master的IP
  • SPARK_DAEMON_MEMORY:设置Master和Worker守护进程内存大小
  • SPARK_WORKER_CORES:设置Spark应用在Worker中可以使用的CPU核数
  • SPARK_WORKER_MEMORY:设置Spark应用在Worker中可以使用的内存总量
  • SPARK_MASTER_WEBUI_PORT:设置Master的Web UI端口
  • SPARK_WORKER_WEBUI_PORT:设置Worker的Web UI端口

  更多配置参考:配置属性

  SPARK_DAEMON_JAVA_OPTS配置项:

System property Meaning
spark.deploy.recoveryMode 设置成ZOOKEEPER,缺省值为 NONE
spark.deploy.zookeeper.url ZooKeeper URL(如zk1:2181,zk2:2181...)
spark.deploy.zookeeper.dir ZooKeeper存储恢复状态的目录,(默认为:/spark)

配置SPARK_HOME环境变量

  vi /etc/profile

#spark
export SPARK_HOME=/opt/spark
export PATH=$SPARK_HOME/bin:$PATH
source /etc/profile

启动

启动集群

  启动ZooKeeper:

  参考3.1.1安装配置ZooKeeper

  在一个master上启动:

su spark
cd /opt/spark
sbin/start-all.sh
在另一个master上启动:
su spark
cd /opt/spark
sbin/start-master.sh

不用sbin脚本的方式

  启动Worker

./bin/spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORT

测试

提交Application:

bin/spark-submit --class org.hansight.spark.examples.SogouQTotal --master spark://HDP125:7077,HDP126:7077 /opt/examples-0.0.1-SNAPSHOT.jar