大数据开发中的元数据:从基础到高级应用的全面指南

在大数据开发中,元数据(Metadata)是指描述数据的数据。元数据可以提供有关数据结构、数据类型、数据约束和数据关系的重要信息。合理利用元数据可以显著提高数据建模和管理的效率。本文将详细介绍如何根据元数据建表,并提供一些代码示例来说明具体操作。
image.png

目录

    • 什么是元数据?
    • 1. 根据元数据建表的步骤
      • 1.1 收集元数据
      • 1.2 生成建表语句
      • 1.3 执行建表语句
        • 示例
    • 2. 元数据驱动的数据管理
      • 数据迁移
      • 数据同步
      • 数据校验
    • 3. 元数据驱动的数据治理
      • 数据质量管理
      • 数据安全与合规
      • 数据生命周期管理
    • 4. 元数据的自动化与工具集成
      • 元数据管理工具
        • Apache Atlas
        • Apache Hive Metastore
        • Apache Airflow
      • 集成元数据管理与数据管道
      • 示例元数据文件(metadata.json)
    • 5. 元数据的高级应用
      • 数据血缘分析
      • 影响分析
      • 数据编目
    • 总结:

什么是元数据?

元数据是关于数据的信息,描述了数据的结构、含义、属性及其相互关系。在大数据系统中,元数据可以帮助我们理解数据来源、数据类型、数据的约束条件等。常见的元数据包括:

  • 数据库名
  • 表名
  • 字段名
  • 数据类型
  • 字段长度
  • 是否为空
  • 主键和外键约束
    image.png

1. 根据元数据建表的步骤

1.1 收集元数据

首先,我们需要收集关于数据的元数据。元数据可以来自于多种来源,例如手动编写的文档、数据字典、数据治理工具等。下面是一个简单的元数据示例:
image.png

{"database": "example_db","table": "users","columns": [{"name": "id", "type": "INT", "length": 11, "nullable": false, "primary_key": true},{"name": "name", "type": "VARCHAR", "length": 255, "nullable": false},{"name": "email", "type": "VARCHAR", "length": 255, "nullable": false, "unique": true},{"name": "created_at", "type": "TIMESTAMP", "nullable": false}]
}

1.2 生成建表语句

根据收集到的元数据,我们可以生成 SQL 建表语句。下面是一个 Python 代码示例,用于根据元数据生成建表语句:
image.png

def generate_create_table_sql(metadata):table_name = metadata["table"]columns = metadata["columns"]column_definitions = []primary_keys = []for column in columns:column_def = f'{column["name"]} {column["type"]}'if "length" in column:column_def += f'({column["length"]})'if not column.get("nullable", True):column_def += " NOT NULL"if column.get("primary_key", False):primary_keys.append(column["name"])if column.get("unique", False):column_def += " UNIQUE"column_definitions.append(column_def)primary_key_def = ""if primary_keys:primary_key_def = f', PRIMARY KEY ({", ".join(primary_keys)})'create_table_sql = f'CREATE TABLE {table_name} (\n  ' + ',\n  '.join(column_definitions) + primary_key_def + '\n);'return create_table_sqlmetadata = {"database": "example_db","table": "users","columns": [{"name": "id", "type": "INT", "length": 11, "nullable": false, "primary_key": true},{"name": "name", "type": "VARCHAR", "length": 255, "nullable": false},{"name": "email", "type": "VARCHAR", "length": 255, "nullable": false, "unique": true},{"name": "created_at", "type": "TIMESTAMP", "nullable": false}]
}create_table_sql = generate_create_table_sql(metadata)
print(create_table_sql)

1.3 执行建表语句

image.png

生成建表语句后,我们需要在数据库中执行这些语句以创建相应的表。可以使用数据库连接库(例如 pymysqlpsycopg2 等)来执行 SQL 语句:

import pymysqldef execute_create_table(sql, database):connection = pymysql.connect(host='localhost',user='root',password='password',database=database)try:with connection.cursor() as cursor:cursor.execute(sql)connection.commit()finally:connection.close()execute_create_table(create_table_sql, metadata["database"])
示例

假设我们有以下元数据描述:

{"database": "example_db","table": "orders","columns": [{"name": "order_id", "type": "INT", "length": 11, "nullable": false, "primary_key": true},{"name": "user_id", "type": "INT", "length": 11, "nullable": false},{"name": "product_id", "type": "INT", "length": 11, "nullable": false},{"name": "quantity", "type": "INT", "length": 11, "nullable": false},{"name": "order_date", "type": "TIMESTAMP", "nullable": false}]
}

通过上面的代码,我们可以生成并执行以下 SQL 语句来创建 orders 表:

CREATE TABLE orders (order_id INT(11) NOT NULL,user_id INT(11) NOT NULL,product_id INT(11) NOT NULL,quantity INT(11) NOT NULL,order_date TIMESTAMP NOT NULL,PRIMARY KEY (order_id)
);

2. 元数据驱动的数据管理

除了建表,元数据还可以用于其他数据管理任务,如数据迁移、数据同步、数据校验等。通过统一管理和使用元数据,可以显著简化这些任务的实现过程。
image.png

数据迁移

数据迁移是指将数据从一个系统或存储位置移动到另一个系统或存储位置的过程。通过元数据,我们可以自动生成迁移脚本,从而简化迁移过程。以下是一个示例:

假设我们需要将 example_db 数据库中的所有表和数据迁移到另一个数据库 new_db,可以使用以下 Python 代码生成迁移脚本:

def generate_migration_script(metadata):old_database = metadata["old_database"]new_database = metadata["new_database"]tables = metadata["tables"]script = f'-- Migration script from {old_database} to {new_database}\n'for table in tables:script += f'\n-- Migrate table {table["table"]}\n'script += f'CREATE TABLE {new_database}.{table["table"]} LIKE {old_database}.{table["table"]};\n'script += f'INSERT INTO {new_database}.{table["table"]} SELECT * FROM {old_database}.{table["table"]};\n'return scriptmigration_metadata = {"old_database": "example_db","new_database": "new_db","tables": [{"table": "users"},{"table": "orders"}]
}migration_script = generate_migration_script(migration_metadata)
print(migration_script)

输出的脚本如下:

-- Migration script from example_db to new_db-- Migrate table users
CREATE TABLE new_db.users LIKE example_db.users;
INSERT INTO new_db.users SELECT * FROM example_db.users;-- Migrate table orders
CREATE TABLE new_db.orders LIKE example_db.orders;
INSERT INTO new_db.orders SELECT * FROM example_db.orders;

数据同步

image.png

数据同步是确保不同系统或存储位置中的数据保持一致的过程。元数据可以帮助我们确定哪些表和字段需要同步,以及如何处理冲突。以下是一个简单的示例,使用元数据生成数据同步脚本:

def generate_sync_script(metadata):source_database = metadata["source_database"]target_database = metadata["target_database"]tables = metadata["tables"]script = f'-- Sync script from {source_database} to {target_database}\n'for table in tables:script += f'\n-- Sync table {table["table"]}\n'script += f'REPLACE INTO {target_database}.{table["table"]} SELECT * FROM {source_database}.{table["table"]};\n'return scriptsync_metadata = {"source_database": "example_db","target_database": "sync_db","tables": [{"table": "users"},{"table": "orders"}]
}sync_script = generate_sync_script(sync_metadata)
print(sync_script)

输出的脚本如下:

-- Sync script from example_db to sync_db-- Sync table users
REPLACE INTO sync_db.users SELECT * FROM example_db.users;-- Sync table orders
REPLACE INTO sync_db.orders SELECT * FROM example_db.orders;

数据校验

image.png

数据校验是指验证数据是否符合预期的过程。通过元数据,我们可以自动生成校验规则,并据此进行数据校验。以下是一个示例,使用元数据生成数据校验脚本:

def generate_validation_script(metadata):database = metadata["database"]table = metadata["table"]columns = metadata["columns"]script = f'-- Validation script for table {table} in database {database}\n'for column in columns:if not column.get("nullable", True):script += f'SELECT * FROM {database}.{table} WHERE {column["name"]} IS NULL;\n'if column.get("unique", False):script += f'SELECT {column["name"]}, COUNT(*) FROM {database}.{table} GROUP BY {column["name"]} HAVING COUNT(*) > 1;\n'return scriptvalidation_metadata = {"database": "example_db","table": "users","columns": [{"name": "id", "type": "INT", "length": 11, "nullable": false, "primary_key": true},{"name": "name", "type": "VARCHAR", "length": 255, "nullable": false},{"name": "email", "type": "VARCHAR", "length": 255, "nullable": false, "unique": true},{"name": "created_at", "type": "TIMESTAMP", "nullable": false}]
}validation_script = generate_validation_script(validation_metadata)
print(validation_script)

输出的脚本如下:

-- Validation script for table users in database example_dbSELECT * FROM example_db.users WHERE id IS NULL;
SELECT * FROM example_db.users WHERE name IS NULL;
SELECT * FROM example_db.users WHERE email IS NULL;
SELECT email, COUNT(*) FROM example_db.users GROUP BY email HAVING COUNT(*) > 1;
SELECT * FROM example_db.users WHERE created_at IS NULL;

3. 元数据驱动的数据治理

数据治理涉及数据的管理、控制和保护,以确保数据的质量、合规性和安全性。利用元数据可以显著提升数据治理的效果和效率。下面将介绍几种利用元数据进行数据治理的方式。

数据质量管理

数据质量管理是确保数据准确、完整、一致和及时的过程。元数据可以帮助我们定义和执行数据质量规则。例如,我们可以根据元数据自动生成数据质量检查脚本。

def generate_data_quality_checks(metadata):database = metadata["database"]table = metadata["table"]columns = metadata["columns"]checks = []for column in columns:if not column.get("nullable", True):checks.append(f'SELECT COUNT(*) FROM {database}.{table} WHERE {column["name"]} IS NULL;')if column.get("unique", False):checks.append(f'SELECT {column["name"]}, COUNT(*) FROM {database}.{table} GROUP BY {column["name"]} HAVING COUNT(*) > 1;')if column.get("type") in ["INT", "FLOAT"] and "min_value" in column:checks.append(f'SELECT COUNT(*) FROM {database}.{table} WHERE {column["name"]} < {column["min_value"]};')if column.get("type") in ["INT", "FLOAT"] and "max_value" in column:checks.append(f'SELECT COUNT(*) FROM {database}.{table} WHERE {column["name"]} > {column["max_value"]};')return checksquality_metadata = {"database": "example_db","table": "users","columns": [{"name": "id", "type": "INT", "length": 11, "nullable": false, "primary_key": true},{"name": "name", "type": "VARCHAR", "length": 255, "nullable": false},{"name": "email", "type": "VARCHAR", "length": 255, "nullable": false, "unique": true},{"name": "age", "type": "INT", "nullable": true, "min_value": 0, "max_value": 120},{"name": "created_at", "type": "TIMESTAMP", "nullable": false}]
}quality_checks = generate_data_quality_checks(quality_metadata)
for check in quality_checks:print(check)

输出的检查脚本如下:

SELECT COUNT(*) FROM example_db.users WHERE id IS NULL;
SELECT COUNT(*) FROM example_db.users WHERE name IS NULL;
SELECT COUNT(*) FROM example_db.users WHERE email IS NULL;
SELECT email, COUNT(*) FROM example_db.users GROUP BY email HAVING COUNT(*) > 1;
SELECT COUNT(*) FROM example_db.users WHERE age < 0;
SELECT COUNT(*) FROM example_db.users WHERE age > 120;
SELECT COUNT(*) FROM example_db.users WHERE created_at IS NULL;

数据安全与合规

数据安全与合规确保数据在存储、处理和传输过程中受到保护,遵守相关法律法规和行业标准。元数据可以帮助我们定义数据安全策略和合规要求。

def generate_security_policy(metadata):database = metadata["database"]table = metadata["table"]columns = metadata["columns"]policy = f'-- Security policy for table {table} in database {database}\n'for column in columns:if column.get("sensitive", False):policy += f'ALTER TABLE {database}.{table} MODIFY {column["name"]} ENCRYPTED;\n'return policysecurity_metadata = {"database": "example_db","table": "users","columns": [{"name": "id", "type": "INT", "length": 11, "nullable": false, "primary_key": true},{"name": "name", "type": "VARCHAR", "length": 255, "nullable": false},{"name": "email", "type": "VARCHAR", "length": 255, "nullable": false, "unique": true, "sensitive": true},{"name": "created_at", "type": "TIMESTAMP", "nullable": false}]
}security_policy = generate_security_policy(security_metadata)
print(security_policy)

输出的安全策略如下:

-- Security policy for table users in database example_db
ALTER TABLE example_db.users MODIFY email ENCRYPTED;

数据生命周期管理

数据生命周期管理涉及数据从创建到销毁的整个过程。元数据可以帮助我们定义数据的保留策略、归档策略和销毁策略。

def generate_lifecycle_policy(metadata):database = metadata["database"]table = metadata["table"]retention_period = metadata.get("retention_period", "5 YEARS")policy = f'-- Lifecycle policy for table {table} in database {database}\n'policy += f'ALTER TABLE {database}.{table} SET RETENTION = {retention_period};\n'return policylifecycle_metadata = {"database": "example_db","table": "users","retention_period": "3 YEARS"
}lifecycle_policy = generate_lifecycle_policy(lifecycle_metadata)
print(lifecycle_policy)

输出的生命周期策略如下:

-- Lifecycle policy for table users in database example_db
ALTER TABLE example_db.users SET RETENTION = 3 YEARS;

4. 元数据的自动化与工具集成

在大数据开发中,元数据的管理和应用往往需要借助自动化工具和平台来实现。通过集成各种工具,我们可以实现元数据的自动收集、存储、更新和应用,从而大大提高工作效率。下面将介绍几种常见的元数据管理工具和它们的使用方法。

元数据管理工具

Apache Atlas

Apache Atlas 是一个流行的开源元数据管理和数据治理工具。它提供了丰富的元数据管理功能,包括数据血缘、分类、标签和搜索等。

以下是一个使用 Python 与 Apache Atlas 进行元数据管理的示例:

from apache_atlas.client.base_client import AtlasClient
from apache_atlas.model.instance import AtlasEntity# 连接到 Atlas 服务器
client = AtlasClient("http://localhost:21000", ("admin", "admin"))# 创建元数据实体
database_entity = AtlasEntity("hive_db", {"name": "example_db","qualifiedName": "example_db@cluster","clusterName": "cluster"
})# 提交实体到 Atlas
client.entity_post.create_entity(database_entity)
print("Database entity created:", database_entity.guid)
Apache Hive Metastore

Apache Hive Metastore 是一个集中管理 Hive 元数据的存储系统。它包含了数据库、表、分区、列等信息。

以下是一个使用 Python 访问 Hive Metastore 的示例:

from pyhive import hive# 连接到 Hive Metastore
conn = hive.connect(host='localhost', port=9083, username='hive')# 查询数据库信息
cursor = conn.cursor()
cursor.execute("SHOW DATABASES")
databases = cursor.fetchall()
for db in databases:print(db)
Apache Airflow

Apache Airflow 是一个开源的工作流调度器,常用于数据管道的自动化。通过集成元数据管理工具,我们可以实现元数据驱动的任务调度。

以下是一个使用 Airflow 管理数据管道的示例:

from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime# 定义 DAG
dag = DAG('metadata_pipeline',default_args={'owner': 'airflow','start_date': datetime(2023, 1, 1),'retries': 1,},schedule_interval='@daily',
)# 定义任务
t1 = BashOperator(task_id='extract_metadata',bash_command='python extract_metadata.py',dag=dag,
)t2 = BashOperator(task_id='process_data',bash_command='python process_data.py',dag=dag,
)# 设置任务依赖
t1 >> t2

集成元数据管理与数据管道

通过将元数据管理工具与数据管道相集成,我们可以实现数据管道的自动化和智能化。例如,可以通过元数据来动态生成数据管道的任务,或根据元数据的变化来触发数据管道的运行。

以下是一个简单的示例,展示了如何通过元数据动态生成数据管道任务:

from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime
import json# 定义 DAG
dag = DAG('dynamic_pipeline',default_args={'owner': 'airflow','start_date': datetime(2023, 1, 1),'retries': 1,},schedule_interval='@daily',
)# 从元数据中读取任务配置
with open('metadata.json', 'r') as f:metadata = json.load(f)# 动态生成任务
previous_task = None
for task_metadata in metadata['tasks']:task = BashOperator(task_id=task_metadata['task_id'],bash_command=task_metadata['bash_command'],dag=dag,)if previous_task:previous_task >> taskprevious_task = task

示例元数据文件(metadata.json)

{"tasks": [{"task_id": "extract_metadata","bash_command": "python extract_metadata.py"},{"task_id": "process_data","bash_command": "python process_data.py"},{"task_id": "load_data","bash_command": "python load_data.py"}]
}

5. 元数据的高级应用

在大数据开发中,元数据不仅仅用于基础的数据管理任务,还可以支持许多高级应用,例如数据血缘分析、影响分析和数据编目等。通过对元数据的深度挖掘,我们可以获得更多的数据洞察,提高数据的可用性和可靠性。

数据血缘分析

数据血缘分析是指追踪数据从源头到目标的流动路径,了解数据在各个阶段的变换和处理过程。通过元数据,我们可以自动构建数据血缘图,帮助我们理解数据的来源和去向。

以下是一个简单的数据血缘分析示例,使用 Python 构建数据血缘图:

import networkx as nx
import matplotlib.pyplot as pltdef build_lineage(metadata):G = nx.DiGraph()for table in metadata["tables"]:G.add_node(table["name"], type="table")for column in table["columns"]:column_node = f'{table["name"]}.{column["name"]}'G.add_node(column_node, type="column")G.add_edge(table["name"], column_node)if "source_columns" in column:for source_column in column["source_columns"]:G.add_edge(source_column, column_node)return Gdef plot_lineage(G):pos = nx.spring_layout(G)labels = {node: node for node in G.nodes()}nx.draw(G, pos, labels=labels, with_labels=True, node_size=3000, node_color="lightblue", font_size=10, font_weight="bold", arrows=True)plt.show()lineage_metadata = {"tables": [{"name": "orders","columns": [{"name": "order_id", "type": "INT"},{"name": "user_id", "type": "INT"},{"name": "total_amount", "type": "FLOAT", "source_columns": ["order_items.amount"]},{"name": "created_at", "type": "TIMESTAMP"}]},{"name": "order_items","columns": [{"name": "order_id", "type": "INT"},{"name": "item_id", "type": "INT"},{"name": "amount", "type": "FLOAT"}]}]
}G = build_lineage(lineage_metadata)
plot_lineage(G)

影响分析

影响分析是指评估某个数据变更对系统其他部分的影响。通过元数据,我们可以了解数据表和字段之间的依赖关系,从而分析变更的影响范围。

以下是一个简单的影响分析示例,使用 Python 评估表和字段之间的依赖关系:

def impact_analysis(metadata, target_table):impacted_tables = set()impacted_columns = set()for table in metadata["tables"]:for column in table["columns"]:if "source_columns" in column:for source_column in column["source_columns"]:if source_column.startswith(target_table):impacted_tables.add(table["name"])impacted_columns.add(f'{table["name"]}.{column["name"]}')return impacted_tables, impacted_columnsimpact_metadata = {"tables": [{"name": "orders","columns": [{"name": "order_id", "type": "INT"},{"name": "user_id", "type": "INT"},{"name": "total_amount", "type": "FLOAT", "source_columns": ["order_items.amount"]},{"name": "created_at", "type": "TIMESTAMP"}]},{"name": "order_items","columns": [{"name": "order_id", "type": "INT"},{"name": "item_id", "type": "INT"},{"name": "amount", "type": "FLOAT"}]}]
}target_table = "order_items"
impacted_tables, impacted_columns = impact_analysis(impact_metadata, target_table)
print("Impacted tables:", impacted_tables)
print("Impacted columns:", impacted_columns)

数据编目

数据编目是指为数据资产创建详细的目录,方便用户查找和理解数据。通过元数据,我们可以自动生成数据目录,包括表结构、字段描述、数据类型等信息。

以下是一个简单的数据编目示例,使用 Python 生成数据目录:

def generate_data_catalog(metadata):catalog = {}for table in metadata["tables"]:table_catalog = {"columns": []}for column in table["columns"]:column_catalog = {"name": column["name"],"type": column["type"]}if "length" in column:column_catalog["length"] = column["length"]if "nullable" in column:column_catalog["nullable"] = column["nullable"]table_catalog["columns"].append(column_catalog)catalog[table["name"]] = table_catalogreturn catalogcatalog_metadata = {"tables": [{"name": "users","columns": [{"name": "id", "type": "INT", "length": 11, "nullable": false},{"name": "name", "type": "VARCHAR", "length": 255, "nullable": false},{"name": "email", "type": "VARCHAR", "length": 255, "nullable": false, "unique": true},{"name": "created_at", "type": "TIMESTAMP", "nullable": false}]},{"name": "orders","columns": [{"name": "order_id", "type": "INT", "length": 11, "nullable": false},{"name": "user_id", "type": "INT", "length": 11, "nullable": false},{"name": "total_amount", "type": "FLOAT", "nullable": false},{"name": "created_at", "type": "TIMESTAMP", "nullable": false}]}]
}catalog = generate_data_catalog(catalog_metadata)
print(catalog)

输出的目录如下:

{"users": {"columns": [{"name": "id", "type": "INT", "length": 11, "nullable": false},{"name": "name", "type": "VARCHAR", "length": 255, "nullable": false},{"name": "email", "type": "VARCHAR", "length": 255, "nullable": false, "unique": true},{"name": "created_at", "type": "TIMESTAMP", "nullable": false}]},"orders": {"columns": [{"name": "order_id", "type": "INT", "length": 11, "nullable": false},{"name": "user_id", "type": "INT", "length": 11, "nullable": false},{"name": "total_amount", "type": "FLOAT", "nullable": false},{"name": "created_at", "type": "TIMESTAMP", "nullable": false}]}
}

总结:

在大数据开发中,元数据扮演着至关重要的角色,从基础的数据建模到复杂的数据治理任务,元数据都能显著提高工作效率和数据质量。本文详细介绍了元数据的概念及其在数据建表、数据迁移、数据同步和数据校验中的应用。通过代码示例,展示了如何收集元数据并生成相应的SQL脚本以自动化这些任务。

此外,本文还探讨了元数据在高级应用中的潜力,包括数据血缘分析、影响分析和数据编目。通过元数据驱动的工具和平台,如Apache Atlas、Hive Metastore和Apache Airflow,我们可以实现元数据的自动管理和深度挖掘,进一步提升数据治理的效果。


希望这篇博客文章能为你在大数据开发中的元数据管理提供实用的指导和启发。如果你有任何问题或需要进一步的解释,请随时留言。期待你的反馈和讨论。

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

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

相关文章

2024年公司电脑屏幕监控软件推荐|6款好用的屏幕监控软件盘点!

在当今的商业环境中&#xff0c;确保员工的工作效率和数据安全是每个企业管理者的重要任务。屏幕监控软件通过实时监控和记录员工的电脑活动&#xff0c;帮助企业有效地管理和优化工作流程。 1.固信软件 固信软件https://www.gooxion.com/ 主要特点&#xff1a; 实时屏幕监控…

ConditionalOnSingleCandidate注解使用介绍、应用场景以及示例代码

概述 ConditionalOnSingleCandidate 是Spring Framework中的一个条件注解&#xff0c;它用于根据特定类型的 bean 是否有且仅有一个候选者来决定是否创建一个 bean 或者配置一个类。 应用场景 依赖特定类型的唯一bean: 当需要依赖一个特定类型的 bean&#xff0c;并且这种类型…

养殖业饲料加工新选择,粉碎机械提升效率

在当今畜牧业快速发展的时代&#xff0c;饲料加工设备成为提升养殖效益的重要一环。其中&#xff0c;饲料加工粉碎机凭借其G效、便捷的特点&#xff0c;成为了养殖场的得力助手。 饲料加工粉碎机作为养殖业的重要设备之一&#xff0c;其主要功能是将各种原料如玉米、豆粕、麦…

简单的网页压力测试

要进行简单的网页压力测试&#xff0c;可以使用Python的requests库来发起请求&#xff0c;并结合time模块来控制请求频率。以下是一个基本的实现&#xff0c;它会每分钟发送指定次数的请求到目标网址。 import requests import time# 目标网址 url ***# 每分钟请求的次数 req…

【GameFramework扩展应用】6-3、GameFramework框架增加日志保存功能

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q764424567/article/details/1…

Sentinel限流算法:滑动时间窗算法、漏桶算法、令牌桶算法。拦截器定义资源实现原理

文章目录 滑动时间窗算法基本知识源码算法分析 漏桶算法令牌桶算法拦截器处理web请求 滑动时间窗算法 基本知识 限流算法最简单的实现就是使用一个计数器法。比如对于A接口来说&#xff0c;我要求一分钟之内访问量不能超过100&#xff0c;那么我们就可以这样来实现&#xff1…

(一)高并发压力测试调优篇——MYSQL数据库的调优

前言 在实际项目开发中&#xff0c;很多业务场景下都需要考虑接口的性能要求&#xff0c;追求高并发、高吞吐量。那么对于此类问题如何入手呢&#xff1f;关注作者&#xff0c;不迷路。本节内容主要介绍在数据库db方面的优化&#xff0c;以mysql数据库为例。 关于db的优化&am…

7、matlab实现SGM/BM/SAD立体匹配算法计算视差图

1、matlab实现SGM/BM/SAD立体匹配算法计算视差图简介 SGM&#xff08;Semi-Global Matching&#xff09;、BM&#xff08;Block Matching&#xff09;和SAD&#xff08;Sum of Absolute Differences&#xff09;都是用于计算立体匹配&#xff08;Stereo Matching&#xff09;的…

远程帮客户解决“应用程序无法正常启动0xc000007b,请单击确定关闭应用程序”的问题

今天收到反馈&#xff0c;SmartPipe软件&#xff0c;在客户机器上报错&#xff0c;无法正常运行&#xff0c;采用远程控制软件进入客户电脑&#xff0c;发现电脑报错如下&#xff1a; 因为客户的电脑是win7&#xff0c;而之前发生过win7电脑上无法运行OCC编写的软件的情况&…

termux 安装 rockylinux

centos已经被“招安”了&#xff0c;取而代之的是rockylinux&#xff0c;本文记录我自己的配置&#xff0c;主要需求是使用termux安装rockylinux文件系统&#xff0c;并使用supervisor自启动code-server 安装termux 从https://github.com/termux/termux-app/releases/获取最新…

常用视觉分类、目标检测模型性能测试

说明 测试常用CV模型在单张图像上的识别速度&#xff0c;不包含图像读取时间&#xff0c;但包含图像预处理。可以在以后的应用中根据硬件配置选取合适的模型&#xff0c;达到最佳效果。其中推理速度为正常推理的速度&#xff0c;加速CPU使用openvino加速&#xff0c;GPU使用te…

产品经理-一份标准需求文档的8个模块(14)

一份标准优秀的产品需求文档包括&#xff1a; ❑ 封面&#xff1b; ❑ 文档修订记录表&#xff1b; ❑ 目录&#xff1b; ❑ 引言&#xff1b; ❑ 产品概述&#xff1a;产品结构图 ❑ 详细需求说明&#xff1a;产品逻辑图、功能与特性简述列表、交互/视觉设计、需求详细描述&am…

docker运行nginx挂载前端html页面步骤

1.常用docker命令 1.docker ps -a 查看所有容器 2.docker ps查看存活的容器 3.docker rm 删除容器 4.docker stop 停止容器运行 5.docker logs 容器id 查看容器日志 6.docker images 查看镜像 7.docker rmi 删除镜像 8.docker exec nginx nginx -s reload 重新加载conf文件…

H3C MSR2600路由器IPv6地址显示TENTATIVE的故障

有一MSR2600路由器&#xff0c;系统软件版本为5.2 R2516P28&#xff0c;使用电信PON PPPoE拨号上网。 在全局启用IPv6&#xff0c;并在Dialer接口上配置了如下IPv6命令&#xff1a; ipv6 address auto ipv6 address auto link-local 使用display ipv6 interface brief命令查看…

Java中的volatile关键字有什么作用?

Java中的volatile关键字是一种轻量级的同步机制&#xff0c;它主要有两个作用&#xff1a; 保证可见性&#xff08;Visibility&#xff09;&#xff1a; 当多个线程访问某个类的共享变量时&#xff0c;如果没有适当的同步机制&#xff0c;一个线程对变量的修改可能对其他线程不…

闲来无事,论茴香豆的茴有几种写法

一、引言 以下是几行浅薄而简洁的代码&#xff0c;聊聊add函数有哪几种写法。抛砖引玉&#xff0c;也许在你实际的项目中会带来些许的收益。 二、知识点 知识点比较简单&#xff1a; 左值和右值引用&#xff0c;std::move 的移动语义&#xff0c;模版等 三、代码&#xff0…

Java实现数据结构——双链表

目录 一、前言 二、实现 2.1 类的创建 三、对链表操作实现 3.1 打印链表 3.2 插入数据 3.2.1 申请新节点 3.2.2 头插 ​编辑 3.2.3 尾插 3.2.4 链表长度 3.2.5 任意位置插入 3.3 删除数据 3.3.1 头删 3.3.2 尾删 3.3.3 删除指定位置数据 3.3.4 删除指定数据 3…

C++ PImpl模式、指向实现的指针、PImpl Idiom、隐藏实现细节

C PImpl模式、指向实现的指针、PImpl Idiom、隐藏实现细节 flyfish PImpl 全称是 “Pointer to Implementation”&#xff0c;在中文中通常翻译为“指向实现的指针”或者“指向实现”。PImpl 是一种编程技巧&#xff0c;通常用于 C 中&#xff0c;通过这种技术&#xff0c;可…

涉案财物管理系统|八大模块可视化展示

涉案财物管理系统DW-S405系统基于物联网技术规范涉案财物管理流程&#xff0c;确保涉案财物的安全性、完整性和合法性&#xff1b;可以提高办案效率&#xff0c;减少办案成本&#xff0c;实现资源共享。 涉案财物管理系统DW-S405主要分为 8 大模块数据展示。 1、案件信息&…

Linux C | 管道open打开方式

Linux C | 管道open打开方式 1.参考 1. 管道 2.现象 是的&#xff0c;这段代码在调用 open(AUDIOIN_FIFO, O_RDONLY) 时可能会被阻塞。原因是 FIFO&#xff08;命名管道&#xff09;在以只读模式打开时&#xff0c;如果没有其他进程以写模式打开该 FIFO&#xff0c;open 调用将…