当前位置: 首页 > news >正文

通过 DVT 和 dbt 测试监控Airbyte数据管道

为数据复制或数据迁移构建 ELT 数据管道的一个重要部分是能够在出现错误时进行监视并获得通知。如果您不知道错误,您的数据将包含不一致之处,并且您的报告将不准确。由于使用的工具数量众多,大多数管道的复杂性使得设置监视和警报系统更具挑战性。

在本文中,我将分享为什么为 ELT 数据管道设置监视和警报系统很重要。我解释了要监视的关键指标,以及设置监视和警报系统时将遇到的常见挑战。我进一步强调了不同的监控和警报工具,并展示了如何使用Google的数据验证工具(DVT)和数据构建工具(dbt)实现典型的监视/警报系统。

为什么要监视数据管道?

好吧,问题应该是,“为什么不监视数据管道”?。这是因为让您的管道作为黑匣子运行对业务来说可能非常昂贵。让我分享一个个人故事来解释这一点。我公司用于数据复制的初始管道是使用 AWS 数据迁移服务 (DMS) 设计的,将数据从 RDS (PostgreSQL) 副本复制到 S3 存储桶。然后,我们让 Snowpipe(Snowflake 的 ELT 工具)从 S3 存储桶获取新数据,并将这些数据通过管道传输到 Snowflake(我们的数据仓库)。

这种架构有效,但它是一个完整的黑匣子,因为我们很少或根本看不到引擎盖下发生的事情。没有适当的警报或通知系统来通知我们管道故障。只有当我们在一天或更长时间后看到数据不一致或下游分析不准确时,我们才会知道管道故障。但这对业务有何影响?这对我们的影响之一是客户流失率的提高。由于我们的数据到达较晚且不一致,我们无法及时检测到客户何时遇到 KYC 验证问题。

以下是应监视管道的主要原因:

全面鸟瞰数据运行状况。

防止数据传输不一致。

获取持续的数据测试方法。

及早发现数据质量和数据完整性问题。

跟踪数据处理成本、元数据和整体系统性能。

提供反馈以优化管道性能。

应监视哪些指标?

虽然设置这些监视/警报系统以了解管道非常重要,但确定要衡量的关键指标以及要使用哪些工具并不总是一项简单的任务。这是因为要衡量的指标在很大程度上取决于数据管道的用例和其他几个因素。

例如,如果其中一个管道实时提供用于跟踪应用程序服务器停机时间的关键数据,那么您的首要任务是根据组织或团队定义的 SLA 监控数据到达的延迟。

以下是要监控的不同类别的指标,适用于您或您的组织可能拥有的任何用例:

数据质量监控

通过数据质量监控,建立一个监控系统,以持续验证管道不同阶段的数据质量。首先,在提取加载 (EL) 步骤中,在加载作业完成后,根据目标中的数据验证源中的数据质量。此处监视的关键指标包括源-目标记录计数匹配、源-目标列计数匹配、数据格式错误、数据卷错误、列名更改、引用完整性等。其次,在转换作业运行后的转换步骤中监视数据的质量。此步骤监控的关键指标包括:数据类型错误、空值等。

管道可靠性监测

在这里,监控侧重于管道的端到端可靠性。在管道的不同步骤中监视错误:

提取加载 (EL) 步骤:此步骤由 Airbyte 等 ELT 工具处理。此处会出现错误,例如身份验证问题导致的同步失败、规范化错误、同步期间加载新列 (SCD) 时出错、JSON 架构验证程序错误等。受到监控。

转换步骤:此步骤由 dbt 等转换工具处理。此处会出现转换作业运行失败、数据传输延迟(运行持续时间长于预期)、数据沿袭或数据丢失问题等错误。受到监控。

业务指标监控

这种类型的监视发生在管道的转换阶段之后。在这里,监视转换后的数据,以根据特定的业务需求识别异常。例如,货币价格贬值或升值、基于市场价值的交易损失等。当这些指标达到特定阈值时,将触发警报。

监视数据管道有哪些挑战?

ELT 数据管道是使用多种工具组合构建的,包括 dbt、Airflow、Airbyte、SQL、云服务、数据库、数据仓库和数据湖。这种工具的多样性有利于可扩展性,以及在数据堆栈的每一层使用最有效的工具。但是,这会导致管道中有许多移动部件。这可能会使监视或全面了解数据管道成为一场噩梦。

在设置管道监视和警报系统之前,我强烈建议先简化管道中要监视的进程数。具有多个可能故障点的复杂管道将需要在这些不同层设置监视/警报系统。这将使事情变得非常难以跟踪和管理。

为了简化我上面给出的示例中公司管道的复杂性,我们首先引入了 Airbyte——一个开源数据摄取工具来处理我们的数据复制。Airbyte 帮助我们减少了管道中可能的故障点数量。我们没有首先使用数据迁移服务 (DMS) 将数据复制到 S3 存储桶,而是使用 Airbyte 将数据直接复制到我们的仓库(Snowflake)。借助此架构,我们无需在数据流的三个不同级别进行监控:RDS-DMS 级别、DMS-S3 存储桶级别和 S3-Snowpipe 级别。现在,我们只在仓库级别监控我们的管道。

简化监视进程的数量后,让我们讨论数据管道监视工具以及如何为数据管道设置典型的监视/警报系统。

监控管道中的数据质量指标

市场上有很多工具可用于监视和触发数据管道中的警报。但是,这些工具的功能不同。虽然一些工具专注于监控云基础设施、日志和应用程序安全性,但其他工具则专注于监控数据质量、数据验证和数据沿袭。此外,一些工具是专有的基于云的解决方案,而另一些则是开源的。

一些专有的基于云的解决方案包括Monte Carlo,Databand,Datadog,Datafold,Accel Data。开源替代方案包括普罗米修斯、洛基、远大期望、数据验证工具 (DVT)、dbt 测试、Datafold 的数据差异等......需要注意的重要一点是,您可能需要组合其中两个或多个工具来实现您的目标。

在下一节中,我将介绍如何使用两个开源工具设置这些监视/警报系统:数据验证工具 (DVT) 和数据构建工具 (dbt)。

使用数据验证工具 (DVT) 进行数据验证监控

数据验证是在将数据用于业务运营之前检查数据的完整性、准确性和结构的做法。

数据验证是构建数据管道的关键步骤,因为它提供了在将数据用于下游分析之前检查数据有效性的层。

数据验证工具 (DVT) 是一种开源 Python CLI 工具,可将异构数据源表与多级验证函数进行比较。在数据加载过程完成后,您可以运行 DVT 进程来验证源表和目标表是否匹配且正确。DVT 支持列、行、自定义查询、架构、列数据类型验证以及许多数据仓库和数据库的连接。

Datafold 还提供了一个开源数据差异项目,用于有效地比较数据库和数据仓库之间的表。要了解有关使用 data-diff 的更多信息,请阅读有关验证从 Postgres 到 Snowflake 的数据复制管道的教程。

将 DVT 与 BigQuery 结合使用

您可以在任何云平台中的虚拟机上设置和运行 DVT。您还可以选择在 Docker 容器中运行 DVT。按照此处的说明在本地计算机或云环境中安装和设置 DVT。本节中的代码演练是在 Google Cloud 上的云外壳会话上运行的。DVT 提供了一个命令行界面 (CLI),用于在安装后执行 dvt 命令。

若要根据目标表验证源表,请先创建源连接和目标连接。我们通过 CLI 运行以下代码来做到这一点。

# Create MYSQL connection as Source connectiondata-validation connections add--connection-nameMYSQL_CONN MySQL--hostHOST_IP--portPORT--user-nameUSER-NAME--passwordPASSWORD # Create BigQuery connection as target connectiondata-validation connections add--connection-name$BigQuery_CONNBigQuery--project-id$MY_GCP_PROJECT

上面的代码片段将创建一个 MySQL 连接作为源连接,创建一个 BigQuery 连接作为目标连接。

列验证

列验证对源和目标都运行计数 (*)。这将计算源表中的列数,并验证它是否与目标表上的计数匹配。要运行列验证,请通过 CLI 执行数据验证运行命令。以下是 MySQL 源表和 BigQuery 目标表之间的列验证的外观:

data-validation validate column\--source-conn$MYSQL_CONN--target-conn$BigQuery_CONN\--tables-list MYSQL_database.source_table=$YOUR_PROJECT_ID.dataset.target_table \--bq-result-handler$YOUR_PROJECT_ID.bigquery_dataset.validation_result

上面的代码片段将执行源表的列计数,并根据目标表的列计数进行验证。--bq-result-handler 标志将有助于将验证结果输出到中间 BigQuery 表。默认情况下,如果没有 --bq-result-handler 标志,验证结果将输出到控制台。

对于启用了表规范化的 Airbyte 同步,您需要指定要在列验证中验证的列的名称。这是为了排除 Airbyte 在同步期间添加的其他元数据列。下面的代码演示如何在验证中指定列:

data-validation validate column\--source-conn$MYSQL_CONN--target-conn$BigQuery_CONN\--tables-list MYSQL_database.source_table=$YOUR_PROJECT_ID.dataset.target_table \--count column1, column2, column3, column4, column5 \--bq-result-handler$YOUR_PROJECT_ID.bigquery_dataset.validation_result

行验证

行验证在源和目标上运行计数 (*)。这将计算源表中的行数,并验证它与目标表上的计数匹配。以下是 MySQL 源表和 BigQuery 目标表之间的行验证的外观:

data-validation validate row \--source-conn$MYSQL_CONN--target-conn$BigQuery_CONN\--tables-list MYSQL_database.source_table=$YOUR_PROJECT_ID.dataset.target_table--bq-result-handler$YOUR_PROJECT_ID.bigquery_dataset.validation_result \--hash'*'\--primary-keysid\--use-random-row --random-row-batch-size 50

--use-random-row 和 --random-row-batch-size 标志指定您只想随机验证行的子集。当您有大型表时,这会派上用场,因为行验证需要更多的内存和计算。

架构验证

架构验证将获取源表中每一列的列数据类型,并验证它是否与目标表的列数据类型匹配。源表和目标表中的类型不匹配会导致验证状态失败。

以下是 MySQL 源表和 BigQuery 目标表之间的架构验证的外观:

data-validation validate schema\--source-conn$MYSQL_CONN--target-conn$BigQuery_CONN\--tables-list MYSQL_database.source_table=$YOUR_PROJECT_ID.dataset.target_table \--bq-result-handler$YOUR_PROJECT_ID.bigquery_dataset.validation_result

行比较验证

这种类型的验证对源表和目标表中指定列的值执行逐行比较。这些值不匹配会导致验证状态失败。

以下是 MySQL 源表和 BigQuery 目标表之间的架构验证的外观:

data-validation validate row \--source-conn$MYSQL_CONN--target-conn$BigQuery_CONN\--tables-list MYSQL_database.source_table=$YOUR_PROJECT_ID.dataset.target_table--bq-result-handler$YOUR_PROJECT_ID.bigquery_dataset.validation_result \--hash'*'\--primary-keysid\--use-random-row --random-row-batch-size 50

下面是 BigQuery 表中验证结果的示例输出:

名为“difference”的列表示源表中的列/行计数与目标表中的列/行计数之间的差异。validation_status列显示验证的状态。

然后可以查询此表,并将错误通知/警报发送到电子邮件或 Slack 频道。

我将在上一节中介绍向 Slack 频道发送通知/警报

从 YAML 文件运行验证

运行验证的另一种方法是将验证配置保存到 YAML 文件。这样,您可以存储以前的验证并轻松修改验证配置。此方法还有助于自动执行验证过程,因为验证可以按计划运行。

若要生成用于验证的 YAML 配置文件,请指定 --config-file 标志。请参阅下面的代码:

data-validation validatecolumn\--source-conn $MYSQL_CONN --target-conn $BigQuery_CONN \--tables-list MYSQL_database.source_table=$YOUR_PROJECT_ID.dataset.target_table--bq-result-handler $YOUR_PROJECT_ID.bigquery_dataset.validation_result \--config-file validation_config.yaml

下面是从上述代码生成的 YAML 配置的外观。

result_handler:project_id:your-project-idtable_id:data_validation.validation_resultstype:BigQuerysource:MYSQL_CONNtarget:BigQuery_CONNvalidations:-aggregates:-field_alias:countsource_column:nulltarget_column:nulltype:countcalculated_fields:[]filter_status:nullfilters:[]format:tablelabels:[]random_row_batch_size:nullschema_name:transportation_datatable_name:citibike_stationstarget_schema_name:onesphere-analytics.master_datatarget_table_name:citibike_stationsthreshold:0.0type:Columnuse_random_rows:false

生成的 YAML 配置文件可以在执行生成验证命令的目录中找到。

现在,可以使用以下代码从 YAML 配置文件运行验证:

data-validation run-config -c validation_config.yaml

使用数据构建工具 (dbt) 进行数据质量监控

dbt 是一种数据转换工具,使数据和分析工程师能够通过简单地编写 SQL 语句来转换其仓库中的数据。DBT 处理将这些 SELECT 语句转换为仓库中的表和视图。要设置 dbt 项目,请按照此设置 dbt 项目指南进行操作。

DBT 提供了用于执行数据质量检查的测试功能,包括数据类型检查、空值检查、重复检查、参照完整性检查等。让我们看看如何使用 dbt 测试执行数据质量检查。dbt 测试定义为单一测试、SQL 文件中的一般测试或具有返回失败记录逻辑的 YAML 配置文件。

下面是使用 YAML 配置文件为源表(订单表)定义测试的示例。

version: 2source:  - name: orderscolumns:      -name: order_idtests:          - unique          - not_null      -name: statustests:          -accepted_values:values: ['placed','shipped','completed','returned']      -name: customer_idtests:          -relationships:to: ref('customers')field: id

上面示例中的测试配置首先检查orders_table order_id列中的重复值和非空值,然后在状态列中检查接受的值(“已放置”、“已发货”、“已完成”、“已退回”)。最后,它检查customer_id列中的引用完整性,以确保订单表上的每个customer_id在客户表上都有一个关联的 ID。

若要运行测试,请运行命令:dbt test --store-failures

--store-failure 标志将测试结果存储在中间表中。然后,可以查询此表以发送错误/失败通知/警报。未通过测试的记录保存在数据仓库中后缀为“dbt_test__audit”的架构中的结果表中。

需要注意的是,如上所述,使用 dbt 监控数据质量的方法也适用于业务指标监控。

使用 dbt 进行管道可靠性监控

DBT 提供用于跟踪管道错误或作业故障的监视和警报系统。通知在 dbt 云上配置,并在作业运行后立即触发。通知可以发送到电子邮件或 Slack 频道。这是这方面的指南。对于管道中的数据提取转换 (EL) 层,Airbyte 提供了一个可靠的监控和警报系统,用于端到端监控并将同步失败/成功通知发送到 Slack 通道。按照此分步指南为空字节同步设置 Slack 通知。

向 Slack 频道发送通知

要发送通知/警报以跟踪管道的问题或故障,您将构建一个简单的 Slack 机器人,该机器人可以在无服务器函数(例如 AWS Lambda 或 GCP CloudFunction)上运行。机器人是一个简单的 Python 脚本,可以计划为按时间间隔运行或基于数据加载事件运行。

机器人将从上述部分查询包含数据质量和数据验证测试结果的任何表,并根据某些定义的逻辑发送通知/警报。

下面的代码片段实现了从 Google Cloud Function 运行的通知/提醒系统,并在源表中的行/列数与上述数据验证示例中的目标表不匹配时将通知/警报推送到 Slack 渠道。以下是创建 Slack 网络钩子网址的指南。

importpandasaspdimportrequestsfromgoogle.oauth2importservice_account# Credentials from GCP service account saved in a json file.credentials = service_account.Credential.from_service_account_file('./google_credentials.json')defslack_notification_bot(credentials, slack_webhook_url):    query ='''select  *

            from validation_result_table

            where validation_status = 'fail';'''validation_data = pd.read_gbq(query, project_id='gcp_project_id', credentials= credentials)    message ='''Validation Report:\n

    Error! Incomplete rows of data loaded'''iflen(validation_data) >0:        requests.post(slack_webhook_url, json={'text': message})else:return'done'defmain():# Run the slack notification botslack_notification_bot(credentials, slack_webhook_url)

结论

在本文中,你看到了为 ELT 数据管道设置监视/警报系统的必要性。

数据质量、管道可靠性和业务指标监视是要监视管道的关键指标。管道复杂性是数据团队在计划为 ELT 管道设置监视/警报系统时将面临的主要挑战之一。我建议使用像Airbyte这样的数据复制工具来降低这种复杂性。然后,我查看了不同的专有数据管道监视/警报工具及其开源替代方案。我进一步深入研究了如何使用数据验证工具 (DVT) 和数据构建工具 (dbt) 设置典型的监控/警报系统。最后,我们了解了如何构建一个机器人来触发管道的通知/警报。



作者:AirbyteCN
链接:https://www.jianshu.com/p/b70c1c672e02
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

通过 DVT 和 dbt 测试监控Airbyte数据管道

为数据复制或数据迁移构建 ELT 数据管道的一个重要部分是能够在出现错误时进行监视并获得通知。如果您不知道错误,您的数据将包含不一致之处,并且您的报告将不准确。由于使用的工具数量众多,大多数管道的复杂性使得设置监视和警报系统更具挑战…...

BootStrap4:组件

一、按钮 1.1、普通按钮 Bootstrap包括多个预定义的按钮样式&#xff0c;每个样式都有自己的语义目的&#xff0c;另外还有一些额外的功能可以用于更多的控制。 样式效果&#xff1a; 源代码&#xff1a; <body class"container"><button type"bu…...

菜鸟也能在10分钟内开发出3D数字化城市,这份干货教程请收好!

朋友被老板要求在2周内负责一个监控用的的3D全景地图项目&#xff0c;他每天能盯着程序员加班加点的干&#xff0c;可按照进度仍然赶不上ddl。我听了他的诉求&#xff0c;联想到之前参加过的一个宣讲会里提到的新软件&#xff0c;把东西推荐给他后&#xff0c;他让同事跑了一下…...

【区块链技术开发】十个比较流行的以太坊智能合约开发框架

专栏:【区块链技术开发】 前期文章: 【区块链技术开发】剖析区块链Ganache模拟器工具及其智能合约部署区块链的查询方式 【区块链技术开发】基于Web3.js以太坊网络上的智能合约的交互及其应用 【区块链技术开发】OpenZeppelin智能合约库:提高智能合约的安全性和可靠性,加速…...

Linux三剑客之grep命令详解

1、概述 Linux三剑客&#xff1a;grep、sed、awk。grep主打查找功能&#xff0c;sed主要是编辑行&#xff0c;awk主要是分割列处理。本篇文章我们详细介绍grep命令。 grep &#xff08;global search regular expression(RE) and print out the line&#xff0c;全面搜索正则…...

【Python】【进阶篇】二、Python爬虫的User-Agent用户代理

目录二、Python爬虫的User-Agent用户代理2.1 常见的 User-Agent 请求头2.2 爬虫程序UA信息2.3 重构爬虫UA信息二、Python爬虫的User-Agent用户代理 User-Agent 即用户代理&#xff0c;简称“UA”&#xff0c;它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用…...

ORBSLAM3 --- 双目惯导执行ORBSLAM3(一):Stereo_intertail_euroc.cc文件解析

1.执行双目例程的参数 在Clion中&#xff0c;我们输入以下参数&#xff1a; /home/liuhongwei/Desktop/slam/ORB_SLAM3_detailed_comments-master/Vocabulary/ORBvoc.txt /home/liuhongwei/Desktop/slam/ORB_SLAM3_detailed_comments-master/Examples_old/Stereo-Inertial/EuRo…...

五 MySQL 存储过程

五、企业级开发技术 5.1 存储过程 关于存储过程我只能说请看下图&#xff0c;这是阿里巴巴发布的《阿里巴巴Java开发手册&#xff08;终极版&#xff09;v1.3版本》在 MySQL 第七条中强制指出禁止使用存储过程 所以对于存储过程不必深究&#xff0c;做到会写能看懂即可 [外链…...

【指针函数和函数指针】

指针函数和函数指针1. 概述2. 案例分析指针函数函数指针1. 概述 函数指针和指针函数是两个不同的概念。 函数指针是指一个指针变量&#xff0c;该指针变量存储了一个函数的地址。通过函数指针可以实现动态调用函数&#xff0c;根据需要在程序运行时指定要调用的函数。函数指针的…...

实现卡片高度增加时的缓动动画效果

在开发中&#xff0c;我们可能会遇到需要让卡片高度由内容撑起&#xff08;即不能手动设置height&#xff09;&#xff0c;并且在高度增加时增加缓动动画的需求。本文将介绍几种实现方式。 文章目录方法1&#xff1a;使用CSS的max-height属性和:hover伪类特定例子&#xff1a;鼠…...

什么是HRMS?哪些工作需要使用HRMS?

当今企业的发展离不开技术支持&#xff0c;同样&#xff0c;在管理方面也需要与时俱进&#xff0c;进行数字化转型。人力资源技术的运用是企业管理数字化转型的重要表现之一。在企业选择一款HR软件之前&#xff0c;应该先认识到&#xff0c;什么是人力资源管理软件——即HRMS。…...

【C语言蓝桥杯每日一题】—— 饮料换购

【C语言蓝桥杯每日一题】—— 饮料换购&#x1f60e;前言&#x1f64c;饮料换购&#x1f64c;喝汽水问题&#x1f64c;饮料换购解题源码分享 &#x1f60a;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的…...

PMP适合哪些人考?

其实很多小白在最开始了解PMP考试的时候都会有同一个问题&#xff0c;那就是&#xff1a; “我适不适合考PMP&#xff1f;” 如果想做管理&#xff0c;那么一定要考PMP证书。PMP证书是国际认证&#xff0c;在国内的认可度也很高&#xff0c;可以说是管理岗位的入门认证。注意…...

中华好诗词大学季第二季(二)

第四期 1,宋代林升的《题临安邸》是一首著名的墙头诗&#xff0c;请问这里的”邸“指的是什么&#xff1f;旅店 2,宋代林升的《题临安邸》的“临安”是指那个城市&#xff1f;杭州 3,“申黜褒女进&#xff0c;班去赵姬升”具体写到了历史上那四个女人 申皇后&#xff0c;褒…...

【Linux】时间日期指令、查找指令、压缩和解压指令

目录1 时间日期类1.1 date指令-显示当前日期1.2 date指令-设置日期1.3 cal指令2 搜索查找类2.1 find指令2.2 locate指令2.3 grep指令和管道符号 |3 压缩和解压类3.1 gzip/gunzip 指令3.2 zip/unzip 指令1 时间日期类 1.1 date指令-显示当前日期 基本语法 date (功能描述:显示…...

python社区志愿者服务管理系统-vue

本系统主要实现一个基于web的校园志愿者活动系统。此网站是为了给予在校生通过网上报名来参加志愿者活动&#xff0c;省去了各种班群申报的中间环节。利用数据库和python进行web开发。 能实现的基本功能如下&#xff1a; (1)登陆、注册的功能&#xff1a;用户填写用户名和密码进…...

计算机网络 常见网卡信息

文章目录1. PCI 网卡2. PCI Express 网卡3. USB网卡4. 无线网卡万兆网卡光纤网卡1. PCI 网卡 接口类型&#xff1a;PCI 传输速率&#xff1a;10/100Mbps或1000Mbps 支持协议&#xff1a;TCP/IP、UDP、IPX/SPX等 缓存大小&#xff1a;通常为64KB或128KB 2. PCI Express 网卡 …...

Python 自动化指南(繁琐工作自动化)第二版:附录 B:运行程序

原文&#xff1a;https://automateboringuff.com/2e/appendixb/ 如果您在 Mu 中打开了一个程序&#xff0c;运行它只需按 F5 或单击窗口顶部的运行按钮。这是一种在编写程序的同时运行程序的简单方法&#xff0c;但是打开 Mu 来运行你完成的程序可能是一种负担。根据您使用的操…...

自然语言处理实战项目2-文本关键词抽取和关键词分值评估

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来自然语言处理实战项目2-文本关键词抽取和关键词分值评估。关键词抽取是自然语言处理中的重要任务&#xff0c;也是基础任务。 一、关键词抽取传统方法 1.基于统计的方法&#xff1a; 基于统计的方法是通过对一组文本…...

软件测试面试,项目经验板块如何答?初中高级测试工程师都问什么?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 项目经验相关的问题…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...