基于H3Core分区的司机轨迹实时存储-技术方案

news2024/11/25 18:42:15

1、背景

        由数据分析师提出的需求,需要分析每10s各个区域(颗粒度到H3Code 8级 面积约0.7平方公里)的司机分布情况,实现准实时的区域司机分布。

H3Code的概念可以参考以下博客:

Uber H3简单介绍_Scc_hy的博客-CSDN博客一、什么是H3?将地球空间划分成可是识别的单元。将经纬度H3编码成六边形的网格索引。二、为什么用H3?2.1 GEOHASH存在一些不足不同精度下网格的形状不一且精度的变化幅度时小时大在不同维度的地区会出现地理单元单位面积差异较大的情况存在8邻域到中心网格的距离不相等问题2.2 H3的映射原理简述基于正多边形内角和公式( \theta=(x-2)*180 ), 和顶点和为360计算出,360/ y = (x-2)*180/x 所有y(正多边形个数), x的组合六边形因为边数最多,最接近https://blog.csdn.net/Scc_hy/article/details/120898390uber h3 地理编码_坦桑尼亚奥杜威峡谷能人的博客-CSDN博客python 包:from h3 import h3def geth3(lon, lat, levelnum): h3_address = h3.geo_to_h3(lat, lon, levelnum) # 纬度,经度,地块级别 hex_center_coordinates = h3.h3_to_geo(h3_address) hex_boundary = h3.h3_to_geo_boundary(h3_address) return h3_addresslohttps://blog.csdn.net/l1159015838/article/details/115796715?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165072203416780271554412%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165072203416780271554412&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-29-115796715.142%5Ev9%5Econtrol,157%5Ev4%5Econtrol&utm_term=H3code+%E7%BA%A7%E5%88%AB&spm=1018.2226.3001.4187

2、技术架构

数据来源:Kafka

处理端:Springboot + 线程池

数据缓存:RedisCluster

定时调度: SpringScheduer + Redis分布式锁 

数据写入:Hbase

架构图如下:

3 数据处理流程

3.1 流程说明

流程说明”

  1. 消费kafka的司机轨迹数据
  2. 计算轨迹的H3Core,按照设计的一级缓存和二级缓存,采用pipeline写入Redis;
  3. 定时调度每分钟执行一次,采用Redis分布式锁保证调度的幂等,先获取二级索引,从而获取一级索引;
  4. 查询出值之后,写入Hbase环境,配置200条flush一次;

流程图如下:

待补充

3.2 Key的设计

3.1 Redis

一级索引设计:

key设计:{特定业务前缀:时间}:H3Core反转

{driver:202104271530}:3426776776

{order:202104271530}:4356557677

{ext:202104271530}:7686654564

value设计:(hash 格式)

key:司机id

value:kafka每条轨迹的详细信息

二级索引设计:

key设计: {特定业务前缀:时间yyyymmddhhMMss}:分片id

例:

{driver:202104271530}:1
{driver:202104271530}:2

.....................................

{driver:202104271530}:10

value: 一级索引的key

例:

3.2 Hbase

Rowkey设计

H3Core反转+日期yyyymmddhhMMss

列族设计(时间精确到每10s)分成三个 分别是 driver order ext

列分别是 列族:时间

例如:

司机:时间订单:时间其他附加信息:时间
driver:20220601123000order:20220601123000ext:20220601123000

4 考虑的一些细节

4.1 考虑RedisCluster、Hbase的数据倾斜

H3Core进行反转

4.2 考虑司机轨迹消息迟到太久的补偿

做了一个类似Flink水印的设计,超过定时调度的时间就直接push到kafka的补偿队列,补偿队列1小时处理一次;

4.3 考虑Redis性能,包括二级索引的是否分片、司机轨迹是否去重、采用pipeline的方式写入数据

1、二级索引分片:考虑到后期开城的数量越来越多、H3Core越来越多会导致Key越来越多,如果一个key里面存太多key

2、司机轨迹去重: 考虑到10s内司机的轨迹不会太大变化,去重可以提升计算速度和优化Hbase的存储空间,降到1/10(如果实在没办法再考虑,下策);

3、采用pipeline的方式写入数据:由于Kafka批量消费,所以里面会有不同司机的不同轨迹,所以会产生多个H3Core,因此会产生多个Key,这时采用pipeline管道写入,可以提升Redis的写入效率;

4.4 考虑kafka是否为了提高性能,是否允许极少部分数据丢失

允许自动offset,设置批量消费,kafka的配置

5 遇到的问题以及处理

5.1 RedisCluster的CPU和内存占用过高

分析原因:scan指令

解决方法:Redis的key的二级索引

5.2 处理端处理速度过慢,每分钟司机轨迹的处理速度需要30s,有安全隐患

分析原因:scan Redis集群上的key速度过慢,司机轨迹去重处理导致处理时间过长;

解决方法:采用二级索引存放Redis的key,Redis的数据格式,由原来的list改成hash,减少处理时间;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python学习 】Python的模块或py文件导入

目录 一、前言 二、python项目中导入模块(py文件)的几种方式 1、直接将py文件放到默认的库位置(特点:高效) 2、将文件放到创建的库位置(特点:方便管理) 3、将模块(模…

OpenAI私有自然语言处理模型、ChatGPT官方模型、百度智能云UNIT模型定制三者的使用方式、应用场景及区别

目录 前言 1、ChatGPT私有自然语言模型数据响应 1.1、私有模型列表 1.2、搭建属于自己的 WEB AI 应用 1.3、模型介绍及使用场景 1.3.1、text-embedding-ada-002模型 1.3.2、davinci模型 2、ChatGPT官方模型 2.1、OpenAI GPT-4介绍 2.2、能力 2.3、优势 2.4、官方模…

MySQL和Redis如何保证数据一致性?

前言 由于缓存的高并发和高性能已经在各种项目中被广泛使用,在读取缓存这方面基本都是一致的,大概都是按照下图的流程进行操作: 但是在更新缓存方面,是更新完数据库再更新缓存还是直接删除缓存呢?又或者是先删除缓存再…

日撸 Java 三百行day40

文章目录 day40 小结1.回顾2.​​面向对象思想3.收获4.联系与区别5.不足 day40 小结 1.回顾 这10天主要从图的存储结构和图的应用方面进行了学习,在实现不同的存储结构都借助了矩阵来实现。首先,再回过去看这些代码,平时自己也写过许多业务…

R语言的贝叶斯时空数据模型实践技术应用

时间-空间数据(以下简称“时空数据”)是最重要的观测数据形式之一,很多科学研究的数据都以时空数据的形式得以呈现,而科学研究目的可以归结为挖掘时空数据中的规律。另一方面,贝叶斯统计学作为与传统统计学…

SystemView的使用教程(基于FreeRTOS的配置)

目录 1.添加文件 2.配置修改 3.连接运行 4.常见问题 SystemView 是一个可以在线调试嵌入式系统的工具,它可以分析有哪些中断、任务执行了,以及这些中断、任务执行的先后关系。还可以查看一些内核对象持有和释放的时间点,比如信号量、互斥…

10款比较好用的网页设计工具

网页设计软件的轻量化和在线协作已成为当前网页制作软件的发展趋势。网页设计并不容易,易于使用的网页UI设计软件更难找到。随着网络的快速发展,网站迅速崛起,网页设计也很受欢迎。网页设计软件即时设计是一种在线协作设计工具,深…

Github为开发者打造的AI代码编写建议插件

仓库: GitHub - github/copilot.vim: Neovim plugin for GitHub Copilot 特性: GitHub Copilot Your AI pair programmer GitHub 目录 代码建议 付费使用 专注于解决问题 支持常用IDE ​在不熟悉的领域自信地编写代码 GitHub Copilot使用Open…

python smtplib.SMTP_SS发邮件提示550, b‘The “From“ header is missing or invalid

发现网站不能注册新用户,报错提示:(550, b’The “From” header is missing or invalid. Please follow RFC5322, RFC2047, RFC822 standard protocol. https://service.mail.qq.com/detail/124/995.) 定位是注册时不能发邮件验证导致。QQ邮箱的From格式…

使用 Luckysheet 可实现 Web 的 Excel

一、写在前面 工作中会遇到excel的导入和导出,换个角度看,假如有个 web 版本的excel ,且能上传现有的,修改编辑后再下载也是个不错的方案。 Luckysheet 是实现 web版Excel的一个优秀的框架。 Luckysheet ,一款纯前端类…

使用nvm在Windows上管理Node版本

1.卸载Windows上安装的Node.js 首先需要卸载我们现在安装的Node.js,控制面板->卸载程序->卸载Node.js 2.下载安装配置nvm 1.下载 GitHub下载链接:https://github.com/coreybutler/nvm-windows/releases 需要下载黄色方框圈中的nvm-setup.exe或者nvm-setup.zip…

数据结构学习分享之复杂度讲解

数据结构第一课 1. 前言2. 数据结构前言2.1 什么是数据结构和算法?2.2 数据结构和算法的重要性2.3 如何学好数据结构和算法?2.4 一些文章和书籍 3. 算法效率3.1 算法的复杂度3.2 复杂度在面试中的考察 4. 时间复杂度4.1 时间复杂度概念4.2 大O的渐近表示法4.3 判断时间复杂度…

从大厂到创业公司,管理上需要怎样转变?

你好,我是舒超。 我职业生涯过去十年的上半段在腾讯负责微博微群、消息流广告、视频评论等社交型的业务系统,下半段在美团基础架构负责云原生基础设施的演进工作,现在星汉未来担任CTO,负责公司产研推进工作。加入星汉未来的时间点…

策略模式——时势造英雄

● 策略模式介绍 在软件开发中常常遇到这样的情况:实现某一个功能可以有多种算法或者策略,我们根据实际情况选择不同的算法或者策略来完成该功能。例如,排序算法,可以使用插入排序、归并排序、冒泡排序。 针对这种情况&#xff0c…

AppWeb 身份验证绕过漏洞 (CVE-2018-8715)

当前漏洞环境部署在vulhub,当前验证环境为vulhub靶场(所有实验均为虚拟环境) 实验环境:攻击机----kali 靶机:centos7 1、进入靶场,启动环境 2、访问AppWeb控制台:http://your-ip:8080 使用用户名、密码adm…

全景丨0基础学习VR全景制作,平台篇第14章:热点功能-漫游

大家好,欢迎观看蛙色VR官方——后台使用系列课程! 后台功能位置示意 热点,指在全景作品中添加各种类型图标的按钮,引导用户通过按钮产生更多的交互,增加用户的多元化体验。 漫游热点,即场景切换热点&#…

Jetpack Navigation 源码(一)

当然要先看官网文档:https://developer.android.google.cn/guide/navigation/navigation-getting-started?hlzh-cn 先从FragmentContainerView 开始 首页它是一个View image.png 注意它的name属性 image.png name属性的fragment 是怎么添加到这个View的(当然fragme…

关于Maven,你真的了解它吗?

编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 Maven版本:apache-maven-3.6.3 目录 一. Maven有哪些核心概念?1.1 Maven中的POM1.2 Maven约定的目录结构1.3 Maven生命周期1.4 Maven的插件和目标1.5 Maven中的…

【面试】MySQL事务的12连问

文章目录 前言1. 什么是数据库事务?2. 事务的四大特性3. 事务的隔离级别有哪些?MySQL的默认隔离级别是什么?4. Mysql为什么选择RR作为默认隔离级别?5. 很多大厂为什么选择RC数据库隔离级别?6. 并发场景,数据…

经典回归算法

回归的概念 回归方程: 写成矩阵: 核心问题,构建预测函数z来映射特征矩阵x和标签y的线性关系 预测的目标值,有连续值也有离散值 连续值,就直接预测输出就行离散值,需要在输出端加一个变换函数例如。Si…