在使用处理自动化工具中的大数据工具时,我们可以选择使用分布式集群环境进行算法功能的计算,从而大大提升大数据量的计算效率。
集群环境的部署
SuperMap 提供的大数据工具能够支持管理分布式集群存储的空间数据,并使用分布式集群进行空间分析。分布式存储框架支持 HDFS,分布式计算框架支持 Spark,支持版本:
Apache Hadoop 3.3.2,集群部署请参考 Apache Hadoop。
Apache Spark 3.3.4,集群部署请参考 Apache Spark。
集群环境的使用
在 iServer 处理自动化服务建模页面 和 iDesktopX 处理自动化建模界面中使用大数据工具时,可以在每个工具的参数设置中找到 Spark 环境设置 选项卡,用于设置分布式集群环境参数。
SuperMap 适配了以下两种集群管理器:
- Standalone:Spark 自带的集群管理器,适合于单独运行Spark集群或与其他组件集成相对较少的情况。
- YARN:Hadoop 中的集群管理器,适合于在Hadoop生态系统中运行Spark,并与其他Hadoop组件无缝集成。多任务同时执行的场景下,推荐使用 YARN 集群并开启动态资源调度,提高资源利用率和高并发任务的执行效率。
一、Spark Standalone 集群环境部署
连接集群的相关参数有:
master:必填参数,集群 master 地址,单机使用请填写 local[K](K代表使用线程数,*代表本机核数),使用集群请填写集群 master 地址,如 spark://127.0.0.1:7077。
appName:必填参数,自定义应用程序名称,如 processing。
settings:使用集群需进行 Spark 属性参数设置,设置格式为 key1=value1, key2=value2,常用参数有:
- spark.executor.cores=4:每个 executor 分配的cpu内核数,分配的内核数越多 executor 并发能力越强,默认设置为4。
- spark.executor.memory=8g:每个 executor 使用的内存量,默认设置为8G。
- spark.driver.cores=4:指定分配给 driver 进程的内核数,需要注意的是,在Client模式下该参数无法生效。
- spark.driver.memroy=4g:driver 使用的内存量,默认设置为4G。driver端日志如果报错java.lang.OutOfMemoryError,可尝试增大该值。需要注意的是,在Client模式下该参数无法生效。
- spark.driver.port=4040:用于 driver 进程的端口,需要注意的是,在Client模式下该参数无法生效。
- spark.driver.maxResultSize=1g:所有分区序列化结果的最大值,建议设置为 0 表示无限制。
- spark.kryoserlizer.buffer.max=2000m:Kryo 序列化缓冲区的最大值,设置区间是1~2047MB。设置较大的缓冲区可以提高序列化和反序列化的性能,但也会消耗更多的内存,默认设置为2000MB。
- spark.default.parallelism=2000:用于设置默认并行度,默认设置为2000。
- spark.memory.fraction=0.6:用于执行和存储的内存占(总内存-300MB)的比例。
- spark.network.timeout=3600s:所有网络交互的默认超时时长。
- spark.local.dir=F://Temp:用于指定Spark在本地磁盘上存储临时文件的路径。默认情况下,临时文件存储在操作系统的临时文件夹中,使用该参数可以将其指定到其他目录。为确保集群正常运行,需要确保每个集群节点所在机器上都存在并可使用该指定路径(建议使用共享目录)。
更多 Spark 集群的参数设置请参考 Spark Configuration。
- 索引分区参数
对千万级空间数据进行分布式计算时,通过合理控制数据的分区数,可以提高分布式【叠加分析】的计算性能。在 Spark 中 RDD的每个分区(partition)数据都由一个 Task 处理,这意味着分区数决定了启动的 Task 任务数。分区数越多,单分区处理的数据量就越小,程序运行时集群总体消耗的内存就越小。对于空间要素 FeatureRDD、DSFFeatureRDD,推荐将每个分区(partition)内的数据记录数控制在 20000 至 50000 之间,具体可以根据实际情况进行调整。计算公式为:分区数据记录数 = 数据集总记录数 / 分区数。
控制数据分区数的方法如下:
(1)格网索引分区: 当数据分布较为均匀时,推荐使用格网索引分区方法。通过将落在相同索引内的数据进行重新分区,可以确保在空间上同一范围内的对象在同一个节点上。使用格网索引分区方式的优势是能有效处理大规模数据。
格网索引分区参数如下:
spark.bdt.1st.index = grid:指定使用的索引类型为格网索引;
spark.bdt.1st.index.grid.cols = 20:格网索引的行数。
spark.bdt.1st.index.grid.rows = 20:格网索引的列数。
格网索引的实际分区数等于行数和列数的乘积,可以根据数据集总记录数来合理设置格网索引的行数和列数。
Spark Standalone 应用程序部署模式的说明
处理自动化模块 Spark 应用程序支持四种部署模式(deployMode),可通过下拉列表选择:local(单进程)、local(多进程)、client 和 cluster。
Local模式具体分为以下两种:
local(单进程):通过单机的多个线程来模拟 Spark分布式计算,直接运行在本地便于调试模型,通常用于测试小规模数据的模型。
集群 master 地址填写 local[ * ](*代表本机核数)。
local(多进程):通过在本地机器上启动多个进程来模拟分布式环境。将数据分发到多个进程中进行计算,能更好地利用计算资源并提高计算效率。由于涉及多进程读写数据,建议使用数据库型数据源存储计算数据。
集群 master 地址默认为spark://127.0.0.1:7077,这里127.0.0.1是本机回环IP,用于指代本机。另外,也可以使用 localhost 作为IP,将默认解析到 127.0.0.1。
需要注意的是:在单机使用 local(多进程)模式进行分布式【叠加分析】时,对千万级数据,必须添加索引分区参数并合理控制数据分区数,以确保有效处理海量数据。
cluster 模式与 client 模式对比:
cluster 模式 | client 模式 |
---|---|
Driver 在集群的节点上同时运行,不占用 iServer 节点的计算资源,但无法直接访问 iServer 节点上的文件。通常使用数据库型数据源或共享目录的方式实现多节点数据的同步访问,能够最大限度的利用集群。 | Driver 运行于 iServer 所在的服务器,可以访问 iServer 服务器上的本地文件,包括 UDB、UDBX 等。由于Spark上运行的应用(Application)只有一个,因此多任务需要排队执行任务,可能存在延迟。 |
cluster 模式下的环境参数设置:
参数名称 | 参数说明 | 示例 |
---|---|---|
gp.hdfs.url | 提供一个 HDFS 目录,作为临时存放 jar 文件和模型的目录。 | gp.hdfs.url=hdfs://127.0.0.1:9000/up |
gp.appResource (必填) |
在缺乏 HDFS 环境时,填写该参数能够直接读取共享目录下的bat-*-all.jar文件,无需在启动时分发所需要的Jar文件,解决bdt-all包重复分发导致的磁盘占用过多问题。具体操作步骤如下: 1、将 iServer产品目录/support/geoprocessing/lib 下的 sps-startup-11.X.X-SNAPSHOT.jar 文件和iServer产品目录/support/iObjectsForSpark/bdt-all-runtime-11.X.X.jar 文件,放到集群每个节点的相同文件夹下(建议使用共享目录); 2、在该环境参数中填写这些文件的共享目录路径,确保文件路径以file:开头,两个文件路径以英文逗号分隔 |
file:/ssdData/share/sps-startup.jar,file:/ssdData/share/bdt-all-runtime.jar |
spark.web.ui.port | spark 的 web UI 页面的端口,默认端口为8080。 | spark.web.ui.port=8080 |
client 模式下的环境参数设置:
参数名称 | 参数说明 | 示例 |
---|---|---|
spark.driver.host | 在双网卡环境下、本机与集群 IP 不一致环境下,需设置该参数,否则可能出现找不到 driver 的问题,一般填写 iServer 所在服务器地址。 | spark.driver.host=127.0.0.1 |
gp.appResource | 填写该参数能够直接读取共享目录下的bat-*-all.jar文件,无需在启动时分发所需要的Jar文件,解决bdt-all包重复分发导致的磁盘占用过多问题。具体操作步骤如下: 1、将 iServer产品目录/support/geoprocessing/lib 下的 sps-startup-11.X.X-SNAPSHOT.jar 文件和iServer产品目录/support/iObjectsForSpark/bdt-all-runtime-11.X.X.jar 文件,放到集群每个节点的相同文件夹下(建议使用共享目录); 2、在该环境参数中填写这些文件的共享目录路径,确保文件路径以file:开头,两个文件路径以英文逗号分隔 |
file:/ssdData/share/sps-startup.jar,file:/ssdData/share/bdt-all-runtime.jar |
模型执行后修改环境参数时,需要注意:
1. Client 模式下所有参数的修改,均需重启 spark 任务才会生效。
重启步骤:
(1) 通过 Spark 的 WebUI(http://{ip}:8080)查看并关闭任务。
(2) 返回处理自动化建模页面执行模型,修改参数即可生效。
2. local 模式下所有参数的修改,均需重启 GPA服务才会生效。
重启步骤:
(1) 返回 iServer 首页进入“服务管理”页面;
(2) 勾选“处理自动化服务”,先停止再启动服务。
Spark 的配置项
- 为了实现依赖文件和日志清理,保证服务器硬盘空间,需要修改Spark目录/conf/spark-env.sh配置文件,增加以下参数:
- spark.worker.cleanup.enabled:是否开启定时清理。
- spark.worker.cleanup.interval:清理周期,每隔多长时间检查并清理一次,单位秒。
- spark.worker.cleanup.appDataTtl:保留时长,任务结束后保留多久,判断文件是否能够被删除,单位秒。
例如,希望每 60 秒检查一次 worker 目录,并删除执行完成 1 小时后的任务目录。
export SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true -Dspark.worker.cleanup.interval=60 -Dspark.worker.cleanup.appDataTtl=3600"
- 当客户端和集群的语言环境不一致时,需要修改Spark目录/conf/spark-env.sh 配置文件,增加参数设置:export LANG=zh_CN.UTF-8,将集群的语言环境和客户端保持一致。
二、Spark on YARN 集群环境部署
连接集群的相关参数有:
master:必填参数,填写为 yarn。与Spark Standalone 集群不同,YARN 集群的 master 地址不在 master 参数中设置,而在 Hadoop 配置文件中设置。
appName:必填参数,自定义应用程序名称,如 processing。
settings:使用集群需进行 Spark 属性参数设置,设置格式为 key1=value1, key2=value2,常用参数有:
- spark.driver.cores=4:指定分配给 driver 进程的内核数。
- spark.driver.memroy=4g:driver 使用的内存量,默认设置为4G。driver端日志如果报错java.lang.OutOfMemoryError,可尝试增大该值。
- spark.executor.instances=2:执行器的个数。
- spark.executor.cores=4:每个 executor 分配的cpu内核数,分配的内核数越多 executor 并发能力越强,默认设置为4。
- spark.executor.memory=8g:每个 executor 使用的内存量,默认设置为8G。
- spark.yarn.am.memory=1g:Spark Application Master 的内存大小,用于管理运行Spark应用程序所需的资源。
- yarn.nodemanager.resource.memory-mb=10g :指定了该 nodemanager 节点上 YARN 可使用的内存总量(请确保参数值大于或等于 spark.executor.memory 的值,可以避免执行器因为内存限制而终止)。
- yarn.scheduler.maximum-allocation-mb=10g :资源调度器(Scheduler)可为单个应用程序容器(container)分配的最大内存(建议和 yarn.nodemanager.resource.memory-mb 保持一致)。
安全认证相关参数:
- spark.kerberos.principal:当启用了 Kerberos 认证时,需要填写 Kerberos 主体身份(principal)用于在集群中向 Kerberos 认证中心进行认证。
- spark.kerberos.keytab:Kerberos 主体身份所对应的密钥表(keytab),包含了用于进行身份认证的密钥。
Spark on YARN 应用程序部署模式的说明
YARN 集群目前仅支持 cluster 部署模式,cluster 模式下环境参数设置如下:
参数名称 | 参数说明 | 示例 |
---|---|---|
HADOOP_CONF_DIR 或者 YARN_CONF_DIR |
hadoop 集群客户端配置文件的目录,从配置文件中读取 YARN 集群的位置等信息 | |
spark.yarn.jars | Spark 依赖的位置,如果不填写则默认使用 iServer产品目录下的spark/jars | 例如:hdfs://bigdata0:8020/user/spark/jars |
spark.executor.extraLibraryPath (必填) |
用于指定每个执行器(executor)在启动时应该包含的组件库的路径,需要将 iServer产品目录/support/objectsjava/bin文件夹放到集群每个节点的相同路径下。需要注意的是,组件区分 linux 和 windows 版本,需要在对应集群节点机器拷贝对应的组件。 | 例如:/opt/SuperMap/iobjects/trunk/Bin |
Spark 的配置项
- 当客户端和集群的语言环境不一致时,需要修改 Hadoop 目录下yarn-env.sh 配置文件,增加参数设置:export LANG=zh_CN.UTF-8,将集群的语言环境和客户端保持一致。
iServer 的配置项
为了更灵活地使用集群和 python 工具,支持修改 iServer 产品目录下\webapps\iserver\WEB-INF\iserver-geoprocessing.xml 文件中处理自动化服务的相关配置:
- clusterRPCServerIP:cluster模式下,需要设置处理自动化服务所绑定的 IP 地址,远程 spark driver 进程会与该 IP 通讯。默认绑定服务所在机器的第一个网卡的 IP,多网卡时需要绑定服务所在机器的物理IP,确保远程的 Spark driver 进程能与该 IP 互通。
- (xmx):处理自动化服务的最大可用内存,默认为物理内存的1/4。
- port:处理自动化(WebUI)启动端口,默认端口号8097。
- clusterRPCPort:处理自动化服务以 Spark Cluster Mode 集群模式运行模型时,用于与远程 spark driver 进程通讯,实时获取 spark 任务的执行状态,了解工具的执行进度。默认端口号18098。
- maxConnection:指定在 cluster 模式下使用集群的最大连接数限制,默认50。
- connectionRequestTimeout:从连接池获取连接的超时时间,默认3000毫秒。
- pythonSocketPort:处理自动化服务调用 Python 工具时,会单独给 Python 启动一个进程,该端口用于处理自动化服务进程与 Python 进程间进行通讯,默认端口号18099。