SuperMap WebGPA外部大数据集群部署实践
本文主要以三台机器为例,提供Linux环境下基于Hadoop+Spark部署超图分布式集群示例,您可以参考以下操作说明,搭建一个完整可用的超图分布式环境。
特别说明:
1、本文测试机器是单网卡,如果环境是双网卡,在配置过程中需要注意的地方有说明。
2、本文不包含zookeeper的安装部署,如需使用hdfs,部署zookeeper,在core-site添加如下配置即可
<property>
<name>ha.zookeeper.quorum</name>
<value>m1:2181,m2:2181,m3:2181</value>
</property>
3、本文hadoop和spark安装在同一个用户下,如需安装到不同的用户,需保证spark用户有hadoop目录的读写权限。
部署前准备:
1.安装包说明
安装包
版本
描述
scala-2.12.15.tgz
2.12.15
scala运行环境
jdk-8u144-linux-x64.tar.gz
1.8
java运行环境
spark-3.3.0-bin-hadoop3.tgz
3.3.4
大规模数据处理
hadoop-3.3.2.tar.gz
3.3.6
分布式文件系统,告诉运算和存储
jemalloc-compiled.tar
5.3.0
linux优化内存使用
2. 许可配置
SuperMap进行大规模数据分析时,需要每台参与运算的节点配置SuperMap许可。
配置方式:如果您拿到的是许可文件,许可文件拷贝到**/opt/SuperMap/License/**目录。
3. 机器情况
机器
ip地址
机器名
系统
节点
a
172.16.12.90
test-machine1
centos7
master
b
172.16.14.65
test-machine2
centos7
slave1
c
172.16.13.88
test-machine4
centos7
slave2
本文所测试机器是单网卡,如果环境是双网卡,在配置过程中需要注意的地方有说明
部署过程说明:
1.设置ip主机名映射(主机ip需要固定ip)
在root用户下修改,主机ip需要固定ip。
vim /etc/hosts
#添加如下
172.16.12.90 test-machine1
172.16.13.88 test-machine4
172.16.14.65 test-machine2
如果是双网卡,配置ip和主机名映射需要注意本机和其他机器采用内外网地址配合的方式,否则可能会出现无法访问,比如:
网卡一ip 机器名
其他网卡二ip 机器名
其他网卡二ip 机器名
2. 查看防火强状态,关闭防火墙
#查看状态
systemctl status firewalld.service
#关闭防火墙
systemctl stop firewalld.service
防火墙一般在项目应用不会关闭,可以正式项目上线前设置防火墙放行规则,需要罗列用到的端口,将这些端口放行。
3. 新建用户,设置免密登录
3.1 新建用户supermap,切换到supermap
#新建用户,三台机器
useradd supermap
#设置密码,三台机器
passwd supermap
#切换到supermap用户
su supermap
3.2 supermap用户设置最大进程数
ulimited -a 查看最大进程数,三台机器
若比较小,需要修改,修改方法如下:
3.3 设置免密登录,如果已经是免密登录,可忽略。
#切换用户
su supermap
#三台机器一路enter生成密钥文件
ssh-keygen -t rsa
#三台机器,切换到~/.ssh
cd ~/.ssh
#三台机器,写入公钥
cat id_rsa.pub >> authorized_keys
#赋权
cd ../
chmod 700 .ssh
chmod 644 .ssh/authorized_keys
#test-machine1 交换公钥
ssh-copy-id supermap@test-machine2
ssh-copy-id supermap@test-machine4
#test-machine2 交换公钥
ssh-copy-id supermap@test-machine1
ssh-copy-id supermap@test-machine4
#test-machine4 交换公钥
ssh-copy-id supermap@test-machine1
ssh-copy-id supermap@test-machine2
#三台机器将hosts信息写入known_hosts
ssh test-machine1
exit
ssh test-machine2
exit
ssh test-machine4
exit
#测试 test-macine1机器,没有密码可以登录
ssh test-machine2
exit
ssh test-machine4
exit
#测试 test-macine2机器,没有密码可以登录
ssh test-machine1
exit
ssh test-machine4
exit
#测试 test-macine4机器,没有密码可以登录
ssh test-machine1
exit
ssh test-machine2
exit
4. 安装java、scala、hadoop、spark包
hadoop、spark的参数配置只需要在test-machine1解压,配置完了之后往其他两台分发即可。
4.1 三台机器上传文件并解压包。上传包到目录/data/bigdata,确保文件路径有supermap用户权限。
#切换用户
su supermap
#解压hadoop包,test-machine1机器
tar -xvzf hadoop-3.3.2.tar.gz
#解压spark包,test-machine1机器
tar -xvzf spark-3.3.0-bin-hadoop3.tgz
#解压java包
tar -xvzf jdk-8u144-linux-x64.tar.gz
#解压scala包
tar -xvzf scala-2.12.15.tgz
#上传包libjemalloc解压并且有supermap权限
4.2 三台机器添加环境变量。
#切换root用户
su root
#创建环境变量sh文件
touch /etc/profile.d/supermap.sh
vim supermap.sh
#scala和java路径
export JAVA_HOME=/data/bigdata/jdk1.8.0_144
export SCALA_HOME=/data/bigdata/scala-2.12.15
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$SCALA_HOME/bin
#hadoop环境变量
export HADOOP_HOME=/data/bigdata/hadoop-3.3.2
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HDFS_DATANODE_USER=supermap
#下面这条启动datanode可能会失败,查看日志发现是JSVC_HOME导致的问题,需要去掉
#export HDFS_DATANODE_SECURE_USER=supermap
export HDFS_NAMENODE_USER=supermap
export HDFS_SECONDARYNAMENODE_USER=supermap
export YARN_NODEMANAGER_USER=supermap
export YARN_RESOURCEMANAGER_USER=supermap
#spark环境变量
export SPARK_HOME=/data/bigdata/spark-3.3.0-bin-hadoop3
#$SPARK_HOME/sbin和HADOOP_HOME/sbin有相同文件,如部署在一个用户,这个路径就不加到环境变量了,后面执行启动加上路径信息部署在不同用户下可以添加
export PATH=$PATH:$SPARK_HOME/bin
#source使之生效
source /etc/profile.d/supermap.sh
5.设置hadoop配置文件
以下操作均supermap用户下test-machine1机器上操作,远程拷贝分发到test-machine2和test-machine4,如果机器路径不一致,需要注意路径的设置。
5.1 设置hadoop-env.sh,添加JAVA_HOME。JAVA_HOME是hadoop运行需要的环境变量。
#切换到supermap用户
su supermap
cd /data/bigdata/hadoop-3.3.2/etc/hadoop
vim hadoop-env.sh
#添加如下
export JAVA_HOME=/data/bigdata/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
5.2 设置core-site.xml。core-site.xml是hadoop的核心配置文件,主要配置集群全局参数,用于定义系统级别的参数,如HDFS URL、Hadoop的临时目录等。
/data/bigdata/hadoop-3.3.2/etc/hadoop/core-site.xml
<configuration>
<!-- 设置Hadoop的文件系统,由URL指定 -->
<property>
<name>fs.default.name</name>
<value>hdfs://test-machine1:9000/</value>
</property>
<!--配置hadoop存储数据目录,路径要足够大,默认/tmp/hadoop-${user.name}-->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/bigdata/hadoop-3.3.2/tempData</value>
</property>
</configuration>
5.3 设置hdfs-site.xml。hdfs-site.xml是HDFS的核心配置文件,主要配置HDFS相关参数,如名称节点和数据节点的存放位置、文件副本的个数、文件读取权限等。
/data/bigdata/hadoop-3.3.2/etc/hadoop/hdfs-site.xml
<configuration> <!--指定namenode的页面访问地址和端口-->
<property>
<name>dfs.namenode.http-address</name>
<value>test-machine1:9870</value>
</property>
<!--指定datanode数节点位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/bigdata/hadoop-3.3.2/dfsData/datanode</value>
<final>true</final>
</property>
<!--指定namenode元数据存放位置-->
<property>
<name>dfs.namenode.dir</name>
<value>/data/bigdata/hadoop-3.3.2/dfsData/namenode</value>
<final>ture</final>
</property>
<!--指定SecondaryNameNode的主机和端口-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>test-machine2:9868</value>
</property>
<!--指定namenode的edits文件的存放位置-->
<property>
<name>dfs.namenode.edits.dir</name>
<value>/data/bigdata/hadoop-3.3.2/dfsData/namenode_edits</value>
</property>
<!--配置检查点目录-->
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>/data/bigdata/hadoop-3.3.2/dfsData/namenode_checkpoint</value>
</property>
<property>
<name>dfs.namenode.checkpoint.edits.dir</name>
<value>/data/bigdata/hadoop-3.3.2/dfsData/namenode_checkpoint_edits</value>
</property>
<!--文件切片的副本个数-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--设置hdfs的文件权限-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<!--设置DataNode的节点文件配置,3.0版本之前workers为slaves文件-->
<property>
<name>dfs.hosts</name>
<value>/data/bigdata/hadoop-3.3.2/etc/hadoop/workers</value>
</property>
<!--datanode使用hostname进行通讯,必须有-->
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
<description>Whether clients should use datanode hostnames when
connecting to datanodes.</description>
</property>
</configuration>
5.4 设置mapred-site.xml。mapred-site.xml是MapReduce的核心配置文件,包括JobHistory Server和应用程序参数两部分,如reduce任务的默认个数、任务所能够使用内存的默认上下限等。
/data/bigdata/hadoop-3.3.2/etc/hadoop/mapred-site.xml
<configuration> <!--指定分布式使用的框架是yarn-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--开启MapReduce小任务模式-->
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<!--设置历史任务的主机和端口-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>test-machine1:10020</value>
</property>
<!--设置网页访问历史任务的主机和端口-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>test-machine1:19888</value>
</property>
<!--以下HADOOP_MAPRED_HOME必须要有-->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/data/bigdata/hadoop-3.3.2</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/data/bigdata/hadoop-3.3.2</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/data/bigdata/hadoop-3.3.2</value>
</property>
</configuration>
5.5 配置mapred-env.sh。在该文件中指定JAVA_HOME。
/data/bigdata/hadoop-3.3.2/etc/hadoop/mapred-env.sh
export JAVA_HOME=/data/bigdata/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
5.6 配置yarn-site.xml。用于配置集群资源管理系统参数,配置 ResourceManager,NodeManager 的通信端口,web监控端口等。
<configuration>
<!-- Site specific YARN configuration properties -->
<!--设置yarn的主节点位置-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>test-machine1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!--该配置项用于提示ResourceManager暴露给Client的地址。Client可以利用这个地址向ResourceManager提交应用程序,也可以用来杀死某个应用程序等。其默认端口是8032,而 URL 是 ResourceManager 的 hostname ,这里是master-->
<property>
<name>yarn.resourcemanager.address</name>
<value>test-machine1:8032</value>
</property>
<!--该配置项用于提示 ResourceManager暴露给ApplicationMaster 的访问地址。后者可以通过该地址从ResourceManager处申请和释放资源,默认端口是 8030-->
<property>
<name>yarn.resoucemanager.scheduler.address</name>
<value>test-machine1:8030</value>
</property>
<!--该配置项用于提示 ResourceManager 暴露给 NodeManager 的地址。后者可以通过该地址向 ResourceManager 发送心跳,也可以拉取到待执行的任务,默认端口是8031-->
<property>
<name>yarm.resourcemanager.resource-tracker.address</name>
<value>test-machine1:8031</value>
</property>
<!--ResourceManager 暴露给管理员的访问地址,后者可以通过该地址向 ResourceManager 发送用于管理目的的各项命令,其默认端口是 8033 -->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>test-machine1:8033</value>
</property>
<!--ResourceManager 对外暴露的 WebUI 地址,我们稍后就会在浏览器中通过访问该地址来查看集群的各类信息,其默认端口是 8088-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>test-machine1:8088</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
</configuration>
5.7 配置workers。文件里面记录的是集群主机名 dfs.hosts。
/data/bigdata/hadoop-3.3.2/etc/hadoop/workers
test-machine1
test-machine2
test-machine4
5.8 分发hadoop配置文件到test-machine2和test-machine3。
scp $HADOOP_HOME/etc/hadoop/* supermap@test-machine2:$HADOOP_HOME/etc/hadoop
scp $HADOOP_HOME/etc/hadoop/* supermap@test-machine4:$HADOOP_HOME/etc/hadoop
6.三台机器创建Hadoop所需的数据目录
以上设置的目录结构如下:
#根据实际配置路径创建
mkdir -p $HADOOP_HOME/tempData
mkdir -p $HADOOP_HOME/dfsData
mkdir -p $HADOOP_HOME/dfsData/datanode
mkdir -p $HADOOP_HOME/dfsData/namenode
mkdir -p $HADOOP_HOME/dfsData/namenode_edits
mkdir -p $HADOOP_HOME/dfsData/namenode_checkpoint
mkdir -p $HADOOP_HOME/dfsData/namenode_checkpoint_edits
7. 启动hadoop
#初始化hadoop,格式化namenode ,只进行一次,下次启动直接执行start-all.sh即可
hadoop namenode -format
#启动hadoop
start-all.sh
jps检查test-machine1
test-machine2
test-machine4
http://172.16.12.90:8088/cluster
8. 配置spark参数
8.1 test-machine1配置spark-env.sh
cd /data/bigdata/spark-3.3.0-bin-hadoop3/conf
cp spark-env.sh.template spark-env.sh
vim spark-env.sh 添加如下
export SPARK_LOCAL_IP=test-machine1
export SPARK_MASTER_HOST=test-machine1
export SPARK_MASTER_PORT=7077
#如果机器只给集群用,推荐设置机器核数的70%,否则根据应用情况进行动态调整,可以设置一半
export SPARK_WORKER_CORES=4
#如果机器只给集群用,推荐设置机器内存的70%,否则根据剩余内存进行动态调整,可以设置50%
export SPARK_WORKER_MEMORY=4g
#在集群执行过程中会产生比较大的临时文件,以下两个目录要设置比较大的路径,不在$SPARK_HOME也可以,但是要注意文件夹不要被删除了
export SPARK_LOCAL_DIRS=/data/bigdata/spark-3.3.0-bin-hadoop3/tmpData
export SPARK_WORKER_DIR=/data/bigdata/spark-3.3.0-bin-hadoop3/worker
export JAVA_HOME=/data/bigdata/jdk1.8.0_144
#scala
export SCALA_HOME=/data/bigdata/scala-2.12.15
#hadoop config folder Hadoop配置文件路径
export HAD00P_HOME=/data/bigdata/hadoop-3.3.2
export HADOOP_CONF_DIR=$HAD00P_HOME/etc/hadoop
#超图组件产品
export SUPERMAP_OBJ=/home/supermap/iobjects/1111/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SUPERMAP_OBJ
#用于调优的参数,优化linux内存效率,库需要supermap权限,根据实际路径进行设置
export LD_PRELOAD=/opt/libs/jemalloc/lib/libjemalloc.so.2
8.2 配置worker节点。
cp workers.template workers
vim workers 添加如下:
test-machine1
test-machine2
test-machine4
8.3 分发spark配置文件slave节点test-machine2和test-machine3。
scp spark-env.sh supermap@test-machine2:/data/bigdata/spark-3.3.0-bin-hadoop3/conf/
scp spark-env.sh supermap@test-machine4:/data/bigdata/spark-3.3.0-bin-hadoop3/conf/
scp workers supermap@test-machine2:/data/bigdata/spark-3.3.0-bin-hadoop3/conf/
scp workers supermap@test-machine4:/data/bigdata/spark-3.3.0-bin-hadoop3/conf/
8.4 修改test-machine2和test-machine3的SPARK_LOCAL_IP。
vim spark-env.sh
修改
export SPARK_LOCAL_IP= 为当前ip
9. 三台机器创建spark所需路径
这一步可以省略,这里进行说明是为了验证路径在supermap用户下是否可以访问,如果supermap用户无访问目录的权限,启动时会报如下路径错误:
以上设置的路径如下
#根据实际配置路径创建
mkdir -p $SPARK_HOME/tmpData
mkdir -p $SPARK_HOME/worker
10. 启动spark集群
由于hadoop/sbin下也有start-all.sh,为了避免冲突,环境变量里加了hadoop的sbin,没有添加spark的sbin,启动spark需要到对应目录下,如果spark和hadoop不是一个用户创建的,并且环境变量是分开的,可以直接执行start-all.sh。
#推荐这种方式
cd /data/bigdata/spark-3.3.0-bin-hadoop3/sbin
./start-all.sh
检查启动状态,test-machine1 jps发现多了两个进程。
test-machine2、test-machine4
http://172.16.12.90:8080/cluster/nodes
11. iserver-GPA使用spark集群
以下操作认为您已有可供使用的iserver服务。
11.1 iserver-gpa大数据使用方式。
(1)iserver主页面,点击处理自动化。
(2)根据需要选择您需要的算子。
(3)如下图是读写矢量数据的模型,spark环境根据实际情况进行设置,参数说明见11.2节。
11.2 参数说明和执行模式的区别
(1)集群相关参数说明。
- 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。在写出数据到本地时,如果数据量过大,报错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 集群的参数设置请参考 Spark Configuration。
(2)不同运行模式的参数区别
--local****模式:程序运行在本机
--client****模式:Driver 运行于 iServer 所在的服务器,可以访问 iServer 服务器上的本地文件,包括 UDB、UDBX 等。由于Spark上运行的应用(Application)只有一个,因此多任务需要排队执行任务,可能存在延迟。
**注意:Client 模式下所有参数的修改,均需重启 spark 任务才会生效。
重启步骤: 1. 通过 Spark 的 WebUI(http://{ip}:8080)查看并关闭任务。 2. 返回处理自动化建模页面执行模型,修改参数即可生效。
- spark.driver.host 在双网卡环境下、本机与集群 IP 不一致环境下,需设置该参数,否则可能出现找不到 driver 的问题,一般填写 iServer 所在服务器地址。示例:127.0.0.1
--cluster****模式:Driver 在集群的节点上同时运行,不占用 iServer 节点的计算资源,但无法直接访问 iServer 节点上的文件。通常使用数据库型数据源或共享目录的方式实现多节点数据的同步访问,能够最大限度的利用集群。
- gp.hdfs.url(必填)提供一个 hdfs 目录,作为临时存放 jar 文件和模型的目录。示例:hdfs://127.0.0.1:9000/up
- gp.appResource 对于没有 hdfs 环境的情况是(必填),支持读取集群本地文件。需要将 iServer产品目录/support/geoprocessing/lib 下的 sps-startup-11.X.X-SNAPSHOT.jar 文件放到集群每个节点的相同文件夹下(建议使用共享目录)。填写该文件的位置,文件路径以file:开头。示例:file:/ssdData/share/sps-startup.jar|
- spark.jars 对于没有 hdfs 环境的情况是(必填),支持读取集群本地文件。需要将 iServer产品目录/support/iObjectsForSpark/bdt-all-runtime-11.X.X.jar 文件放到集群每个节点的相同文件夹下。填写该文件的位置,文件路径以file:开头。示例:file:/ssdData/share/bdt-all-runtime.jar|
- spark.web.ui.port spark 的 web UI 页面的端口,默认端口为8080。示例:8080
11.3 常见问题-处理bdt分发磁盘占用问题
为了实现依赖文件和日志清理,保证服务器硬盘空间,需要修改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"
12. 其他启动常见问题
12.1 hadoop****报错java.io.IOException: Incompatible clusterIDs in /usr/local/hadoop/tmp/dfs/data: namenode clu
解决方案1,hadoop所有路径清理,重新format
解决方案2
问题原因
1.namenode格式化次数过多,导致子节点datanode和namenode的CID不一致了
解决方案
1.cat切入hdfs.site.xml查看配置文件的datanode存放在哪个路径
2.切到对应路径hadoop/tmp/dfs/data/current,使用cat进入VERSION文件
3.将日志中的namenode的CID覆盖clusterID
参考文章:hadoop报错java.io.IOException: Incompatible clusterIDs in /usr/local/hadoop/tmp/dfs/data: namenode clu_hadoop java.io.ioexception: incompatible clusterid-CSDN博客
版权归原作者 supermapsupport 所有, 如有侵权,请联系我们删除。