# spring-geomesa2 **Repository Path**: gisvip/spring-geomesa2 ## Basic Information - **Project Name**: spring-geomesa2 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-07 - **Last Updated**: 2024-11-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring-GeoMesa SpringBoot + GeoMesa-HBase 实现时空轨迹分布式查询。 --- ## 使用方法 1. 将项目拷贝到本地,使用 IDEA 打开项目文件夹; 2. 完成服务器端的部署; 3. 更改 `pom.xml` 中依赖的版本,将 `MilitaryShipTraceController.java` 和 `InfraredRayController.java` 中 `hbase.zookeepers` 的 `master,slave1,slave2` 更改为自己的 `zookeeper` 的 IP 地址; 4. 等待依赖下载完成; 5. 运行程序。 ### 服务器部署版本 | 名称 | 版本 | | :----: | :----: | | Linux | Debian GNU/Linux 10 | | JDK | 1.8.0_311 | | Hadoop | hadoop-3.2.2 | | ZooKeeper | apache-zookeeper-3.7.0 | | HBase | hbase-2.4.11 | | GeoMesa | geomesa-hbase_2.11-3.2.2 | ### 本地开发环境 | 名称 | 版本 | | :----: | :----: | | Windows | 11 | | IntelliJ IDEA | 2021.3.3 | | Visual Studio Code | 1.67.1 | | Xshell | 6.0.0038 | | VMware® Workstation 16 Pro | 16.2.3 | ### 测试环境 | 名称 | 版本 | | :----: |:------:| | Postman | 9.16.0 | | JMeter | 5.4.3 | ### 重要依赖及其版本 | 名称 | 版本 | | :----: | :----: | | spring-boot | 2.6.7 | | swagger | 2.9.2 | | scala | 2.11.7 | | guava | 20.0 | | curator | 4.3.0 | > 依赖详情见 `pom.xml` --- ## 服务器端部署 由 Vmware 虚拟化得到三个 Linux 虚拟机。 ### 虚拟机配置 1. 修改各虚拟机的机器名。 ``` $ nano /etc/hostname ``` 分别修改为 `master`,`slave1`,`slave2`,重启虚拟机生效。 2. 修改三台机器的 `/etc/hosts`: ``` $ nano /etc/hosts # 添加以下内容,这里的 IP 地址为虚拟机的内网 IP。 192.168.220.21 master 192.168.220.22 slave1 192.168.220.23 slave2 ``` 3. ssh 配置 ``` # 在 master 上生成一对公钥和密钥 $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa # 将公钥拷贝到 master, slave1, slave2 上。 $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ scp ~/.ssh/id_rsa.pub root@slave1:~ $ scp ~/.ssh/id_rsa.pub root@slave2:~ # 在 slave1 机器上 $ mkdir .ssh $ cat id_rsa.pub >> .ssh/authorized_keys $ chmod 755 .ssh && chmod 600 ~/.ssh/authorized_keys # 设置权限 # 在 slave2 机器上 $ mkdir .ssh $ cat id_rsa.pub >> .ssh/authorized_keys $ chmod 755 .ssh && chmod 600 ~/.ssh/authorized_keys # 设置权限 ``` 在 `master` 机器使用 `ssh slave1` 和 `ssh slave2` 命令测试能否免密登录另外两台机器。 ### 配置 JDK 1. 在 `master` 机器上,从 [Oracle官网](https://www.oracle.com/java/technologies/downloads/) 下载对应系统的 Java8, **注意**:最新版本为 Java17,但 Java8 对 HBase 支持度最好。 2. 在 `/usr/local/` 目录下新建一个目录 `jdk`, ``` $ mkdir /usr/local/jdk $ cd /usr/local/jdk ``` 将 Java 安装包上传到 `jdk` 目录下,并解压 ``` $ tar -zxvf jdk-8u321-linux-x64.tar.gz ``` 3. 解压得到新的目录 `jdk1.8.0_321`,进入该目录,并配置环境变量, ``` $ cd jdk1.8.0_321 $ nano /etc/profile ``` 在环境变量配置文件中新增以下代码: ``` export JAVA_HOME=/usr/local/jdk/jdk1.8.0_321 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin ``` 键入 Ctrl + x 再输入 `y`,即可保存。 4. 输入命令 `source /etc/profile` 使配置的环境变量生效。 5. 输入命令 `java -version`,看到版本即安装成功。 ![Java_version.png](https://raw.githubusercontent.com/Sheldonsix/spring-geomesa/master/img/Java_version.png) 6. 在另外两台机器 `slave1`、`slave2` 上进行相同的配置。 --- ### Hadoop 分布式部署 1. 在 `master` 机器新建以下目录。 ``` $ mkdir /usr/local/hadoop $ mkdir /usr/local/hadoop/tmp $ mkdir /usr/local/hadoop/var $ mkdir /usr/local/hadoop/dfs $ mkdir /usr/local/hadoop/dfs/name $ mkdir /usr/local/hadoop/dfs/data $ cd /usr/local/hadoop ``` 2. 从 [Apache 镜像站](https://dlcdn.apache.org/hadoop/common/) 下载 Hadoop 稳定发行版,此处选择的 Hadoop 版本为最新的稳定版 `hadoop-$VERSION`,并解压。 ``` # 将 $VERSION 更换为相应版本,此处选择的版本是 hadoop-3.2.2,注意此处的链接具有时效性。 $ wget 'https://dlcdn.apache.org/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz' $ tar -zxvf hadoop-3.2.2.tar.gz $ cd hadoop-3.2.2/ ``` 3. 修改环境配置文件 `etc/hadoop/hadoop-env.sh`, ``` $ nano etc/hadoop/hadoop-env.sh ``` 添加以下内容: ``` # Java 的安装路径 export JAVA_HOME=/usr/local/jdk/jdk1.8.0_321 # 获取 root 权限操作 Hadoop export HDFS_NAMENODE_USER="root" export HDFS_DATANODE_USER="root" export HDFS_SECONDARYNAMENODE_USER="root" export YARN_RESOURCEMANAGER_USER="root" export YARN_NODEMANAGER_USER="root" ``` 配置文件修改完成后,保存退出,输入命令 `bin/hadoop`,弹出 Hadoop 的使用文档,则说明 Hadoop 环境配置完成。 4. 修改 `etc/hadoop/core-site.xml` 文件,在 `` 节点加入以下配置: ``` hadoop.tmp.dir /usr/local/hadoop/tmp Abase for other temporary directories. fs.default.name hdfs://master:9000 ``` 修改 `etc/hadoop/hdfs-site.xml` 文件,在 `` 节点加入以下配置: ``` dfs.name.dir /usr/local/hadoop/dfs/name Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently. dfs.data.dir /usr/local/hadoop/dfs/data Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks. dfs.replication 2 dfs.permissions false need not permissions ``` 5. 修改 `mapred-site.xml`,在 `` 节点内加入以下配置: ``` mapred.job.tracker master:49001 mapred.local.dir /usr/local/hadoop/var mapreduce.framework.name yarn ``` 6. 修改 `workers` 文件,加入分布式子节点的机器名: ``` slave1 slave2 ``` 7. 修改 `yarn-site.xml` 文件,在 `` 节点内加入以下配置: ``` yarn.resourcemanager.hostname master The address of the applications manager interface in the RM. yarn.resourcemanager.address ${yarn.resourcemanager.hostname}:8032 The address of the scheduler interface. yarn.resourcemanager.scheduler.address ${yarn.resourcemanager.hostname}:8030 The http address of the RM web application. yarn.resourcemanager.webapp.address ${yarn.resourcemanager.hostname}:8088 The https adddress of the RM web application. yarn.resourcemanager.webapp.https.address ${yarn.resourcemanager.hostname}:8090 yarn.resourcemanager.resource-tracker.address ${yarn.resourcemanager.hostname}:8031 The address of the RM admin interface. yarn.resourcemanager.admin.address ${yarn.resourcemanager.hostname}:8033 yarn.nodemanager.aux-services mapreduce_shuffle yarn.scheduler.maximum-allocation-mb 2048 yarn.nodemanager.vmem-pmem-ratio 2.1 yarn.nodemanager.resource.memory-mb 2048 yarn.nodemanager.vmem-check-enabled false ``` 8. 将配置文件同步到 `slave1`,`slave2` 机器中 ``` $ scp -r /usr/local/hadoop/hadoop-3.2.2 root@slave1:/usr/local/hadoop/ $ scp -r /usr/local/hadoop/hadoop-3.2.2 root@slave2:/usr/local/hadoop/ ``` 6. 启动 Hadoop: ``` # 格式化文件系统,只需要格式化一次,下次启动不需要格式化 $ ./bin/hdfs namenode -format ``` 启动 NameNode 和 DataNode 守护进程: ``` $ ./sbin/start-dfs.sh ``` 启动 Yarn: ``` $ ./sbin/start-yarn.sh ``` 日志默认保存路径为 `/usr/local/hadoop/hadoop-3.2.2/logs`。现在可以打开 NameNode 的 WebUI,默认为 `http://localhost:9870`。使用以下命令停止进程: ``` $ ./sbin/stop-all.sh ``` 7. 使用 `jps` 命令查看 Java 进程,此时在 `master` 应该有三个进程 `NameNode`、`SecondaryNameNode`、`ResourceManger`;在 `slave1`、`slave2` 应该有两个进程 `DataNode`、`NodeManager`。 --- ### ZooKeeper 部署 1. 在 `master` 机器中新建目录 `zookeeper`: ``` $ mkdir /usr/local/zookeeper $ cd /usr/local/zookeeper ``` 2. 在 [Apache 镜像站](https://zookeeper.apache.org/releases.html) 下载最新的稳定版,此处下载的 ZooKeeper 版本为 `Apache ZooKeeper 3.7.0`,**注意**,此处需要下载的是 ZooKeeper 的可执行版本(apache-zookeeper-3.7.0-bin),而并不是源码。下载完成之后解压: ``` $ wget 'https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz' $ tar -xvzf apache-zookeeper-3.7.0-bin.tar.gz $ cd apache-zookeeper-3.7.0-bin ``` 3. 创建 `conf/zoo.cfg` 配置文件,添加以下配置: ``` # tickTime:ZooKeeper 使用的基本时间单位,以毫秒为单位。 tickTime=2000 # dataDir:存储内存中数据库快照的位置,以及更新数据库的日志。 # myid 文件需要保存到该位置 dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.0-bin/data # clientPort:侦听客户端连接的端口 clientPort=2181 # server. 之后的数字为机器的编号 myid server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888 ``` 保存退出。 4. 创建 `myid` 文件,写入编号: ``` $ mkdir data $ nano data/myid # 写入 master 机器编号 1 1 ``` 5. 将配置好的 ZooKeeper 目录复制到其他两台机器上,并修改对应的 `myid`,`slave1` 对应编号 `2`,`slave2` 对应编号 `3`。 ``` $ scp -r /usr/local/zookeeper root@slave1:/usr/local/ $ scp -r /usr/local/zookeeper root@slave2:/usr/local/ ``` 6. 启动集群,以下命令三台机器都需要运行: ``` $ /usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/zkServer.sh start ``` 查看集群的状态: ``` $ /usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/zkServer.sh status ``` 集群的状态输出如下(`Mode` 会有一个 `leader`,两个 `follower`): ``` ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: follower ``` 7. 连接到 ZooKeeper 客户端: ``` $ ./bin/zkCli.sh -server 127.0.0.1:2181 ``` 输入 `quit` 退出 ZooKeeper 客户端。 --- ### HBase 部署 1. 在 `master` 机器新建以下目录: ``` $ mkdir /usr/local/hbase $ mkdir /usr/local/hbase/tmp $ cd /usr/local/hbase ``` 2. 在 [Apache 镜像站](https://dlcdn.apache.org/hbase/) 下载 HBase 镜像,此处选择的是最新的稳定版本 `hbase-2.4.11-bin`。下载完成后解压。 ``` $ wget 'https://dlcdn.apache.org/hbase/stable/hbase-2.4.11-bin.tar.gz' $ tar -zxvf hbase-2.4.11-bin.tar.gz $ cd hbase-2.4.11 ``` 3. 确保在启动 HBase 之前,已经设置了 `JAVA_HOME` 环境变量。修改 `conf/HBase-env.sh` 文件,添加以下内容: ``` # Java 的安装路径 export JAVA_HOME=/usr/local/jdk/jdk1.8.0_321 # 不使用 HBase 自带的 ZooKeeper export HBASE_MANAGES_ZK=false ``` 4. 修改 `conf/hbase-site.xml` 文件,在 `` 节点加入以下配置: ``` hbase.cluster.distributed true hbase.wal.provider filesystem hbase.rootdir hdfs://master:9000/hbase hbase.zookeeper.quorum master,slave1,slave2 hbase.zookeeper.property.dataDir /usr/local/zookeeper/apache-zookeeper-3.7.0-bin/data hbase.table.sanity.checks false ``` 5. 配置 `conf/regionservers`,添加从分布式机器的主机名: ``` slave1 slave2 ``` 6. 将 HBase 的配置文件复制到其他机器: ``` $ scp -r /usr/local/hbase root@slave1:/usr/local/ $ scp -r /usr/local/hbase root@slave2:/usr/local/ ``` 7. 启动 HBase: ``` $ ./bin/start-hbase.sh ``` 使用 `jps` 来查看,应该会有一个名叫 `HMaster` 的进程,默认的 WebUI 为 `http://master:16010`,在各个 slave 上运行 `jps` 应该会有 `HRegionServer` 进程。 8. 连接到 HBase: ``` $ ./bin/hbase shell ``` 使用 `help` 命令来查看 HBase Shell 的一些基本使用信息,使用 `quit` 命令退出 HBase Shell。 9. 使用以下命令停止所有的 HBase 守护进程: ``` $ ./bin/stop-hbase.sh ``` --- ### GeoMesa-HBase 部署 1. 在 `master` 机器中新建目录 `geomesa`: ``` $ mkdir /usr/local/geomesa $ cd /usr/local/geomesa ``` 从 [GitHub](https://github.com/locationtech/geomesa/releases/) 下载编译完成的二进制文件(bin),此处选的的是 `geomesa-hbase_2.11-3.2.2-bin.tar.gz`,**注意**:geomesa 有两个版本号,前面的 `2.11` 是它支持的 scala 的版本号,后面的才是它本身的版本号。下载完成之后进行解压: ``` $ wget 'https://github.com/locationtech/geomesa/releases/download/geomesa-3.2.2/geomesa-hbase_2.11-3.2.2-bin.tar.gz' $ tar -zxvf geomesa-hbase_2.11-3.2.2-bin.tar.gz $ cd geomesa-hbase_2.11-3.2.2 ``` 2. 修改配置信息。在路径 `conf/geomesa-env.sh` 中添加以下环境变量: ``` export HADOOP_HOME=/usr/local/hadoop/hadoop-3.2.2 export HBASE_HOME=/usr/local/hbase/hbase-2.4.11 export GEOMESA_HBASE_HOME=/usr/local/geomesa/geomesa-hbase_2.11-3.2.2 export PATH="${PATH}:${GEOMESA_HBASE_HOME}/bin" ``` **注意**:配置 GeoMesa 的环境变量是 `GEOMESA_HBASE_HOME`。 3. 手动执行以下命令,安装所需插件: ``` $ ./bin/install-shapefile-support.sh ``` 4. 部署 jar 包,需要将 GeoMesa 的 runtime jar 包拷贝到 HBase 安装目录的 `lib` 文件夹,需要将该 jar 包复制到其他分布式机器上。 ``` $ cp /usr/local/geomesa/geomesa-hbase_2.11-3.2.2/dist/hbase/geomesa-hbase-distributed-runtime-hbase2_2.11-3.2.2.jar /usr/local/hbase/hbase-2.4.11/lib/ $ scp -r /usr/local/hbase/hbase-2.4.11/lib root@slave1:/usr/local/hbase/hbase-2.4.11/ $ scp -r /usr/local/hbase/hbase-2.4.11/lib root@slave2:/usr/local/hbase/hbase-2.4.11/ ``` 5. 注册协处理器(Coprocessors)。使 HBase 在运行时能够访问到 `geomesa-hbase-distributed-runtime` 的 jar 包,需要在三台机器的 HBase 配置文件 `hbase-site.xml` 中添加以下内容: ``` hbase.coprocessor.user.region.classes org.locationtech.geomesa.hbase.server.coprocessor.GeoMesaCoprocessor ``` 6. 设置命令行工具,将 HBase 配置文件 `hbase-site.xml` 打包进 `geomesa-hbase-datastore_2.11-3.2.2.jar` 中: ``` $ zip -r /usr/local/geomesa/geomesa-hbase_2.11-3.2.2/lib/geomesa-hbase-datastore_2.11-3.2.2.jar /usr/local/hbase/hbase-2.4.11/conf/hbase-site.xml ``` 7. 重新启动 Hadoop、HBase、ZooKeeper,然后查看 geomesa-hbase 版本: ``` # 重新启动 HBase、Hadoop、ZooKeeper,注意关闭启动的顺序 $ /usr/local/hbase/hbase-2.4.9/bin/stop-hbase.sh $ /usr/local/hadoop/hadoop-3.3.1/sbin/stop-all.sh $ /usr/local/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh stop $ /usr/local/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start $ /usr/local/hadoop/hadoop-3.3.1/sbin/start-all.sh $ /usr/local/hbase/hbase-2.4.9/bin/start-hbase.sh # 查看 geomesa 版本,这个过程可能会下载几个 jar 包 $ /usr/local/geomesa/geomesa-hbase_2.11-3.2.2/bin/geomesa-hbase version # 输出以下内容,则说明部署成功 GeoMesa tools version: 3.2.2 Commit ID: 37e202eb97f64e612d0fecec75e7cdbfc280e67f Branch: 37e202eb97f64e612d0fecec75e7cdbfc280e67f Build date: 2021-12-09T14:30:52+0000 ``` 8. 注意:如果要运行官方的 [quickstart](https://github.com/geomesa/geomesa-tutorials),一定要注意 GeoMesa 和 geomesa-tutorials 版本对应。例如 GeoMesa 的版本为 `3.2.2`,那要选择 `3.2.0` 版本的 geomesa-tutorials。 ``` # 如果 geomesa 的操作卡住或无法完成,可以先关闭 HBase,再利用 zookeeper 和 Hadoop 的命令来删除 HBase 中的表 # zookeeper 删除 HBase 表 $ /usr/local/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkCli.sh $ deleteall /hbase $ quit # Hadoop 删除 HBase 表 $ /usr/local/hadoop/hadoop-3.2.2/bin/hdfs dfs -rm -r -f /hbase # 启动 HBase $ /usr/local/hbase/hbase-2.4.9/bin/start-hbase.sh ```