SuperMap iServer 提供的 Linux、Windows 以及 war 产品包均内置了 Spark 安装包,进行一些环境准备后,就可启动 Spark 分布式集群,并进一步使用 iServer 大数据分析服务。

此外,iServer 大数据分析服务支持使用其他 Spark 集群服务。您可以通过本节了解如何在其他机器上搭建 Spark 集群

使用 iServer 大数据分析服务的推荐硬件配置包括:

  • 处理器:8核
  • 内存:16 GB或以上
  • 网络适配器:1 Gb

使用 iServer 内置的 Spark 集群服务

将 SuperMap iServer 产品包拷贝至集群成员所在的机器中之后,您就可以在各平台上进行环境准备了。对于不同平台的 iServer 产品包,其配置方式也不同。如果您使用的是 Windows 平台的 iServer 产品包,只需开放端口。

开放端口

为保证分布式集群正常工作,Linux 和 Windows 系统都需要修改防火墙配置开放这些端口:

  1. iServer 默认使用的端口
  2. Spark 分布式集群系统默认使用到的端口:
  • 8080:访问 Master 节点 Web UI 的默认端口
  • 7077:启动 Master 节点的默认端口
  • 22:SSH默认通讯端口

Linux 平台产品包

为使各集群节点间能够准确识别并通信,在 Linux 平台上需要修改主机名。以三台 Ubuntu 虚拟机为例,其 IP 分别为

Master:192.168.177.136

Worker1: 192.168.177.135

Worker2:192.168.177.137

以下操作需要以 root 用户执行。通过如下命令可由普通用户切换至root用户:

sudo -i

再次输入当前用户密码即可。

修改主机名

打开 hostname 的配置文件:

vi /etc/hostname

将主机名修改为sparkmaster,Worker节点中的主机名则改为sparkworker1、sparkworker2。

保存并退出文件编辑后,通过以下命令查看本机IP地址:

ifconfig

设置主机名与IP的对应关系,打开/etc/hosts文件:

vi /etc/hosts

添加如下配置:

192.168.177.136           sparkmaster

192.168.177.135           sparkworker1

192.168.177.137           sparkworker2

三个节点的 hosts 文件配置相同。保存并退出编辑。重启虚拟机。

通过以下命令可查看当前主机名是否修改成功:

hostname

使用 ping 命令查看主机名与IP对应关系是否正确:

ping [hostname]

例如:

ping sparkmaster

war 包

请先确认war 包部署前的环境配置是否正确,war包部署成功后,您还需要在各平台上依次进行以下操作来配置大数据分析服务的环境:

解压 support _win_x64.zip或support _linux_x64.tar.gz

1. 解压对应平台的 support 压缩文件,可看到其目录下有 hadoop 和 spark 文件夹。

2. 在 iserver 文件夹(中间件部署 iserver.war 时生成的)所在目录的上一级新建 support 文件夹,将步骤1解压目录中的 hadoop 和 spark 文件夹放置其中。

设置环境变量

1. 在环境变量中添加 HADOOP_HOME,可设置为 iServer 内置的 hadoop 的目录,并将%HADOOP_HOME%\bin 加入到系统的 PATH 环境变量中。(Linux平台无需设置 hadoop 环境变量)

2. 在环境变量中添加 SPARK_HOME,可设置为 iServer 内置的 Spark 的目录,并将%SPARK_HOME%\bin 加入到系统的 PATH 环境变量中。

3. 在环境变量中添加 SPARK_SCALA_VERSION,值为 2.11.8。

搭建 Spark 分布式集群

如果您的机器资源有限,您也可以自行将 Spark 分布式集群搭建在其他机器上,Spark 的版本需要与 iServer 内置的一致,当前 iServer 内置 Spark 版本为 spark-2.1.0-bin-hadoop2.7。以下将介绍如何在 Linux 平台上搭建 Spark 分布式集群。

本例采用 VMware Workstation 11.0.0 build-2305329,并创建三台完全相同的 Ubuntu 14.04 虚拟机,其中一台作为 Spark 分布式集群的 Master 节点,其余为 Worker 节点。分别命名为 Master,Worker1,Worker2(此名称仅为虚拟机名称,不为虚拟机中系统的主机名称), IP 分别为 Master:192.168.177.136,Worker1: 192.168.177.135,Worker2:192.168.177.137。

软件要求

搭建 Spark 分布式集群环境需要配置 Java 环境(JDK 下载地址http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html#javasejdk,建议使用 JDK 8及以上版本)、配置SSH以及 Spark(下载地址:http://spark.apache.org/downloads.html)。

本例使用的软件为:

  • jdk-8u111-linux-x64.tar.gz
  • spark-1.6.1-bin-hadoop2.6.tgz
  • openssh-server

搭建流程

下面以 Master 节点为例,介绍 Spark 集群搭建流程,Worker 节点与此相同。

所有操作需要以 root 用户执行。通过如下命令可由普通用户切换至root用户:

sudo -i

再次输入当前用户密码即可。

开放端口

Spark 分布式集群系统默认使用到以下端口,因此需要修改防火墙配置开放这些端口:

  • 8080:访问 Master 节点 Web UI 的默认端口
  • 7077:启动 Master 节点的默认端口
  • 22:SSH默认通讯端口

检查端口开放状态:

ufw status

开放端口命令如下:

ufw allow [port]

[port]为将开放的端口号。例如:

ufw allow 8080

配置 Java 环境

本例将已下载的 JDK 包存放在/home/supermap/中

解压 JDK 包

tar -xvf  jdk-8u111-linux-x64.tar.gz

在/usr/lib/目录下新建java文件夹:

mkdir /usr/lib/java

将已解压的 JDK 文件夹复制或移至“/usr/lib/java”中,如:

cp -r /home/supermap/jdk-8u111-linux-x64/ /usr/lib/java

配置 Java 环境变量,输入如下命令打开环境变量配置文件:

vi ~/.bashrc

按下“i”开始编辑。在配置文件末尾写入如下配置:

export JAVA_HOME=/usr/lib/java/jdk1.8.0_111

export CLASSPATH=.:${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib

export PATH=${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin:$PATH

按下“esc”退出编辑模式,再输入“:wq”保存并退出文件编辑。

输入如下命令使环境变量配置生效:

source ~/.bashrc

检验Java是否安装成功:

java -version

正确显示已安装的 Java 版本信息时,表示安装成功。

配置 SSH

Spark 采用 SSH 进行通信,外网环境下可直接输入如下命令为当前系统安装 SSH。

apt-get install open-ssh

内网环境需使用文件传输工具,如 XManager,将已下载的 .deb 包传至虚拟机进行安装,安装命令如:

dpkg -i /home/supermap/openssh-server_6.6p1-2ubuntu1_amd64.deb

查看ssh是否安装成功:

ps -e|grep ssh

显示如下信息表示SSH安装成功

为方便操作,通过配置 SSH 无密码验证,实现各节点间的无密码通信。

生成密钥,其中,'' 表示两个单引号:

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

此时,在 /root/.ssh 中生成了两个密钥文件:id_dsa和id_dsa.pub,其中id_dsa为私钥,id_dsa.pub 为公钥。

需要将 id_dsa.pub 追加到 authorized_keys 中,authorized_keys 用于保存所有允许以当前用户身份登录到 ssh 客户端用户的公钥内容:

cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

查看现在能否免密码登录 SSH:

ssh localhost

输入“yes”继续登录。完成后,输入 “exit”退出 localhost。再次登录使就不需要密码了。

以同样的步骤在 Worker 节点中配置。

要实现各节点间免密码通信,需要将 Worker 中生成的公钥拷贝到 Master 中,Master 再将该公钥追加到 authorized_keys。

在 Worker1 中,将公钥拷贝到 Master :

scp  id_dsa.pub root@192.168.177.136:/root/.ssh/id_dsa.pub.Worker1

在 Worker2 中,将公钥拷贝到 Master :

scp  id_dsa.pub root@192.168.177.136:/root/.ssh/id_dsa.pub.Worker2

Master 中将公钥追加到 authorized_keys:

cat ~/.ssh/id_dsa.pub.Worker1 >> ~/.ssh/authorized_keys

cat ~/.ssh/id_dsa.pub.Worker2 >> ~/.ssh/authorized_keys

Master 将 authorized_keys 拷贝到两个 Worker 节点中:

scp ~/.ssh/authorized_keys root@192.168.177.135:/root/.ssh/authorized_keys

scp ~/.ssh/authorized_keys root@192.168.177.136:/root/.ssh/authorized_keys

此时,Master 与两台 Worker 通信时就不需要密码了。

安装 Spark

下载 Spark 安装包,存放在/home/supermap/中

解压已下载的 Spark 包:

tar -xvf spark-1.6.1-bin-hadoop2.6.tgz

在/usr/local/目录下新建spark文件夹:

mkdir /usr/local/spark

把解压后的"spark-1.6.1-bin-hadoop2.6"复制到“/usr/local/spark”中:

cp -r /home/supermap/spark-spark-1.6.1-bin-hadoop2.6/ /usr/local/spark

配置 Spark 环境变量

输入如下命令打开环境变量配置文件:

vi ~/.bashrc

按下“i”开始编辑。在配置文件末尾添加如下配置:

export SPARK_HOME=/usr/local/spark/spark-1.6.1-bin-hadoop2.6

同时将bin目录加入PATH中,写入后结果如下:

export PATH=${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin:${SPARK_HOME}/bin:$PATH

按下“esc”退出编辑模式,再输入“:wq”保存并退出文件编辑。

输入如下命令使环境变量配置生效:

source ~/.bashrc

Spark 集群Master节点配置

进入 Spark 配置文件目录:

cd /usr/local/spark/spark-spark-1.6.1-bin-hadoop2.6/conf

当前目录下没有 spark-env.sh文件,需要将 spark-env.sh.template 修改为spark-env.sh。使用如下命令,spark-env.sh.template 复制到spark-env.sh:

cp spark-env.sh.template spark-env.sh

打开 spark-env.sh 文件

vi spark-env.sh

按下“i”进入编辑模式,在文件末尾添加如下配置

export JAVA_HOME=/usr/lib/java/jdk1.8.0_111

export SPARK_MASTER_IP=192.168.177.136

export SPARK_WORKER_MEMORY=2g

其中:

  • JAVA_HOME为Java安装目录;
  • SPARK_MASTER_IP为Spark集群中Master节点的IP;
  • SPARK_WORKER_MEMORY为WORKER节点能够最大分配给Executors的内存大小。为充分利用内存资源,可设置为机器的内存大小。

此外,您还可以指定Master节点、Worker节点使用的端口、访问Master Web UI的端口等。

如果您需要自定义端口,请检查防火墙是否已开放此端口

按下“esc”退出编辑模式,再输入“:wq”保存并退出文件编辑。

修改主机名

此步骤可参考修改主机名

Spark 集群Worker节点配置

Spark 集群各Worker节点需要在 slaves 文件进行配置,Spark 安装包中不直接提供 slaves 文件,而是在配置文件目录中提供了slaves.template,因此生成 slaves 文件的方式与 spark-env.sh 相同:

cp slaves.template slaves

打开 slaves 文件

vi slaves

将默认的节点“localhost”删除,输入 Spark 集群各节点的主机名称:

sparkmaster

sparkworker1

sparkworker2

三个节点的配置内容相同。保存并退出编辑。

启动 Spark 集群

启动 Master 节点

在 Master 节点所在机器依次执行以下命令:

cd /usr/local/spark/spark-1.6.1-bin-hadoop2.6/sbin

./start-master.sh

启动 Worker 节点

在 Worker 节点所在机器依次执行以下命令:

cd /usr/local/spark/spark-1.6.1-bin-hadoop2.6/sbin

./start-slave.sh --webui-port 8081 spark://sparkmaster:7077

其中,

  • --webui-port 指定了访问当前 Worker 节点的Web UI 的端口,如不指定,将采用随机端口。
  • spark://sparkmaster:7077 表示指定需要连接的集群的 Master 节点地址。

启动后,在浏览器中输入http://sparkmaster:8080 即可查看集群情况。

 

优化配置

Spark 运行时,将启动 executor 执行任务,您可以依据您的机器实际情况,在 Spark 配置文件中调整分配给 executor 的内存(默认为1G),从而优化数据处理效率。具体方法为:

  1. 进入 iServer 内置的 Spark 安装包的 conf 目录,例如【iServer 安装目录】support\spark\conf
  2. 将 spark-defaults.conf.template 文件重命名为 spark-defaults.conf
  3. 用文档编辑器打开 spark-defaults.conf,添加:spark.executor.memory           3g