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

在基于亚马逊云科技的湖仓一体架构上构建数据血缘的探索和实践

1d77e80175705d85bdbd20f8da326199.gif

背景介绍

随着大数据技术的进步,企业和组织越来越依赖数据驱动的决策。数据的质量、来源及其流动性因此显得非常关键。数据血缘分析为我们提供了一种追踪数据从起点到终点的方法,有助于理解数据如何被转换和消费,同时对数据治理和合规性起到关键作用。特别是在 DSL(Data Security Law,数据安全法)和 PIPL(Personal Information Protection Law,个人信息保护法)等数据隐私法规的背景下,这种分析确保了数据的合规性,减少了法律风险。

但数据血缘在收集阶段存在诸多挑战,如数据来源的多样性、数据流的混合、数据质量等问题。尤其在数据湖与数据仓库结合的湖仓一体架构下,这些问题更为复杂。数据湖中的数据格式多样,从半结构化到非结构化,而数据仓库主要针对结构化数据。因此,跨多个系统和工具追踪数据路径、统一不同的日志和元数据,都成为了巨大的挑战。

数据血缘,简而言之,是对数据从其来源到其最终目的地的整个生命周期的追踪和可视化。在当前数据驱动的时代,数据血缘已经成为数据管理和数据治理的关键组成部分。数据血缘的意义:

  • 透明性:数据血缘为组织提供了数据流的完整视图,使得数据工程师、分析师和业务用户都能清楚地了解数据的来源和转换过程。

  • 增强信任:当组织能够清晰地追踪数据的来源和流动,它可以增强内部和外部利益相关者对数据的信任。

  • 提高效率:数据问题可以迅速定位和解决,因为数据血缘提供了数据流的详细视图,从而减少了故障排查的时间。

  • 支持创新:当数据可访问且其来源和质量都已知时,组织可以更自信地进行数据驱动的创新。

本文会为您介绍在湖仓一体架构下,如何将亚马逊云科技的数据湖 Amazon S3 在数据 ETL 处理过程中通过 Spline 捕获并产生在图数据库 ArangoDB 中的数据血缘和数据仓库 Amazon Redshift 通过 DBT 产生的数据血缘进行合并,并使用图数据库 Amazon Neptune 通过 DAG 图进行可视化展示。

架构设计

在大数据时代,湖仓一体架构逐渐成为数据管理的前沿。这种架构继承了数据湖和数据仓库的长处,为企业提供了一个集中、灵活、高效的数据存储和分析平台。这种架构使得结构化与非结构化数据能够在同一环境中无缝整合,从而消除了数据孤岛现象并提高了数据访问的一致性。同时,得益于云技术,湖仓一体具备了卓越的弹性和可扩展性,轻松应对数据的爆炸式增长。而数据湖的经济存储方式和数据仓库的高速查询性能的结合,进一步确保了企业在大数据处理上的成本效益。

在这样的背景下,使用 Amazon MWAA 基于 Amazon S3,Amazon Glue,Amazon Redshift,DBT 构建 data pipeline,并实现自动化的端到端的数据 ETL 处理,数据建模,以及数据可视化成为一种比较常见的架构实现方式。如下图所示,整个架构实现包括三个组成部分:第一部分,通过 Amazon Glue 实现数据从 data source 到 data staging 再到 data lake。第二部分,通过 DBT 基于Amazon Redshift 进行数据建模。第三部分,通过 Amazon MWAA 实现对 Amazon Glue 和 DBT 的自动化调度。

3bf534e49ebf57ae7fd5c2c46bf0188d.png

如本文开头所述,在这样的架构设计下,数据血缘的收集是非常重要的,同时也面临着比较大的挑战。为了解决这个问题,本文采取了分段搜集,再进行数据血缘合并以及可视化呈现。其中通过 Amazon Glue 运行数据 ETL 的部分,采用了 Spline 进行数据血缘的收集,使用 DBT 在 Amazon Redshift 数据建模的部分,通过 DBT 的 Document 功能获取了血缘数据,数据血缘的合并以及可视化,在图数据库 Amazon Neptune 中完成。

d75ffe4787ccec95e661da0330fa0d4f.png

什么是 Spline?

Spline 即 Spark Lineage,是一个专注 Spark 的数据血缘追踪工具,Spline 的目标是创建一种简单且高效的方法捕获 Spark 血缘,同时提供 API,方便第三方去扩展和开发。

Spline 在架构上可以分为四部分:

  • Spline Server

  • Spline Agent

  • ArangoDB

  • Spline UI

Spline Server 是 Spline 的核心。它通过 producer api 接收来自 agent 的血缘数据,并将其存储在 ArangoDB 中。另一方面,它为读取和查询血缘数据提供了 Consumer API。消费者 API 由 Spline UI 使用,但也可以由第三方应用程序使用。

Spline Agent 从数据转换管道中捕获沿血缘和元数据,并通过使用 HTTP API(称为 Producer API),以标准格式将其发送到 Spline server,最终血缘数据被处理并以图的形式存储,并且可以通过另一个 REST API(称为 Consumer API)访问。

ArangoDB 是一个原生多模型数据库,兼有 key/value 键/值对、graph 图和 document 文档数据模型,提供了涵盖三种数据模型的统一的数据库查询语言,并允许在单个查询中混合使用三种模型。基于其本地集成多模型特性,您可以搭建高性能程序,并且这三种数据模型均支持水平扩展。

Spline UI 是可视化渲染数据血缘的 endpoint,可以按 application 绘制作业的表血缘,字段血缘,以及每一个 stage 的输入输出 schema。

什么是 DBT?

DBT(Data Build Tool)是一个开源软件,用于转换和加载数据仓库中的数据。它允许数据工程师和分析师编写、维护和测试 SQL 查询,从而实现数据的转换和建模。DBT 提供了一个框架,使用户能够使用版本控制、测试和文档化来管理 SQL 代码。它与现代云数据仓库如 Snowflake、EMR 和 Redshift 等紧密集成,使得数据团队可以更加高效地进行数据转换和分析。DBT 的主要目标是将数据从源系统转换为易于分析的结构,同时确保数据的质量和准确性。

什么是 Neptune?

Amazon Neptune 是亚马逊云科技发布的一款托管图数据库产品,它支持流行的图模型,如属性图和 W3C 的 RDF,以及相应的查询语言,如 Apache TinkerPop 的 Gremlin、openCypher 和 SPARQL。Neptune 旨在为高度连接的数据集构建查询,提供高性能的图模型处理。它与其他亚马逊云科技产品如 Amazon S3、Amazon EC2 和 Amazon CloudWatch 等紧密集成,确保数据安全和高效处理。

在本方案中,Spline 的血缘数据保存在 ArangoDB 的 Collection 中,DBT 的血缘数据保存在 manifest.json 中。由于 ArangoDB 是一种图数据库,并且遵循了和图数据库 Amazon Neptune 不同的协议,使用了和 Amazon Neptune 不同的数据结构,而且目前没有工具可以实现 ArangoDB 到 Amazon Neptune 的直接数据导入,因此本方案通过数据解析将 ArangoDB 的 Collection 和 DBT 的血缘数据进行转换,生成中间文件后,在 Amazon Neptune 图数据库进行了数据血缘的合并。

方案介绍

1、 Spline 搭建

1)我们采用在 EC2 上以 docker compose 的方式容器化部署 Spline,需提前安装好 Docker 和 Compose。也可以参考这篇亚马逊云科技博客中介绍的在亚马逊云上部署 Spline 的详细例子。

  • 博客链接:

    https://aws.amazon.com/cn/blogs/china/using-spline-to-collect-spark-data-kinship-practice/?nc1=h_ls

部署完成后,通过 Amazon Glue 构建一个 Job,启动 Spline UI 查看血缘数据,我们看到 Spline 分为 Execution Events,Data Sources,Execution Plans 几个部分。

8158cb23ba4c0aa30389c4656957ae69.png

2)点击一个测试生成的 Execution event,可以看到 Spline 采集的数据血缘 DAG 图。

2124f35695f24073ffd1c2e2ee305bdc.png

3)测试场景的数据最终会从 Amazon S3 的 sales_dl 目录写入 Amazon Redshift 的 sales 表,由于 Spline 和 Amazon Redshift 集成存在一些限制,生成的血缘数据无法直接看到目标表名。这里考虑到 Amazon S3 在向 Amazon Redshift 写入数据时,会先写入到一个临时目录,通过这个特点进行数据解析获取到了完整的数据血缘信息。

98f367fc01df54200da9d91064249652.png

2、 ArangoDB 数据结构以及数据解析

Spline 每次生成数据血缘时,会向 ArangoDB 写入一条 Log 信息,并保存在 22 个 collection 中,如下图所示:

442aef48113078e577640df7b7adfb9f.png

通过数据解析 ArangoDB 的 collection 之间的数据关系,得到在 Spline 中看到的数据血缘信息。在本示例中,根据业务场景的需要,使用了其中的 operation 和 executionPlan 两个 collection 。本方案不着重介绍如何读取 ArangoDB,为方便演示,暂时直接把 json 数据保存成文件后进行解析,具体请参考文件 operation.json 和 executionPlan.json。

  •  operation.json

    https://github.com/Honeyfish20/data-lineage-demo/blob/main/arangodb/operation.json

  • executionPlan.json

    https://github.com/Honeyfish20/data-lineage-demo/blob/main/arangodb/executionPlan.json

通过数据解析在 ArangoDB 的 executionPlan 文件中获取与 Glue Job 对应的唯一的 appName,该 appName 会根据业务场景的不同,对应到 Spline 的一条或者多条 Execution event。找到相互关联的 Execution event,并通过数据解析在 ArangoDB 的 operation 文件中获取数据的上下游关系。最后,通过 Amazon S3 的文件存储路径,判断 Amazon S3 写往 Amazon Redshift 的数据血缘,生成中间文件 spline_lineage_map.json,供 Amazon Neptune 进行数据血缘合并。本示例中的中间文件 spline_lineage_map.json 参考。

  •  spline_lineage_map.json 参考:

    https://github.com/Honeyfish20/data-lineage-demo/blob/main/spline/spline_lineage_map.json.json

import json
import osdef fetch_target_ids(execution_plan_path, target_name):target_ids = []with open(execution_plan_path, 'r') as f:execution_plans = json.load(f)for plan in execution_plans:if plan.get('name') == target_name:target_ids.append(plan['_id'])print(f"Found target ID: {plan['_id']}")return target_idsdef filter_operations(operation_path, target_ids):filtered_operations = []with open(operation_path, 'r') as f:operations = json.load(f)for operation in operations:if operation.get('_belongsTo') in target_ids and operation.get('type') in ['Read', 'Write']:filtered_operations.append(operation)print(f"Filtered operation: {operation}")return filtered_operationsdef generate_and_transform_result_dict(filtered_operations):new_data = {'lineage_map': {}}read_file_name, write_file_name = None, None  read_belongs_to, write_belongs_to = None, None  for operation in filtered_operations:belongs_to = operation.get('_belongsTo')operation_type = operation.get('type')if operation_type == 'Read':input_source = operation.get('inputSources', [])[0] if operation.get('inputSources') else Noneread_file_name = os.path.basename(input_source) if input_source else Noneread_belongs_to = belongs_to  elif operation_type == 'Write':output_source = operation.get('outputSource')write_file_name = os.path.basename(output_source) if output_source else Nonewrite_belongs_to = belongs_to  if read_file_name and write_file_name and read_belongs_to == write_belongs_to:if read_file_name not in new_data['lineage_map']:new_data['lineage_map'][read_file_name] = []new_data['lineage_map'][read_file_name].append(write_file_name)return new_datadef fetch_redshift_table(filtered_operations, new_data):redshift_table = Nonefor operation in filtered_operations:output_source = operation.get('outputSource', '')if 'redshift' in output_source:redshift_table = output_source.split('/')[-2]  print(f"Redshift table extracted from outputSource: {redshift_table}")if redshift_table:last_data_flow_file = Nonefor key in reversed(list(new_data['lineage_map'].keys())):if new_data['lineage_map'][key]:last_data_flow_file = new_data['lineage_map'][key][-1]breakif last_data_flow_file:new_key = f"{last_data_flow_file}" new_data['lineage_map'][new_key] = [redshift_table]          if __name__ == "__main__":execution_plan_path = "/path/to/executionPlan.json"operation_path = "/path/to/operation.json"target_name = 'Your appName in executionPlan.json'target_ids = fetch_target_ids(execution_plan_path, target_name)filtered_operations = filter_operations(operation_path, target_ids)new_data = generate_and_transform_result_dict(filtered_operations)fetch_redshift_table(filtered_operations, new_data)  with open("/path/to/spline_lineage_map.json", 'w') as f:json.dump(new_data, f, indent=4)print(f"New JSON data has been written to /path/to/spline_lineage_map.json")

左滑查看更多

3、DBT 数据血缘解析

上述 Amazon Glue 作业执行后会将处理好的数据写入到 Amazon Redshift 的 public.sales 表,DBT 项目采用 sales 表和 event 表作为数据源进行后续的建模,最终生成 top_events_by_sales 表,DBT 原生的数据血缘参考如下:

fb560528ac9fc548850b13ac4db75d34.png

运行以下命令可为 DBT 项目生成文档,DBT 项目下的 target 目录中的 manifest.json 文件存储了数据血缘相关信息,本示例中 manifest.json 参考。

dbt docs generate

可以通过解析 manifiest.json 文件中的 parent_map 或者 child_map 还原 DBT 的数据血缘,下面的代码示例解析 child_map 并生成中间文件 dbt_lineage_map.json 文件来描述 DBT 数据血缘。

  • manifest.json 参考:

    https://github.com/Honeyfish20/data-lineage-demo/blob/main/dbt/manifest.json

  • dbt_lineage_map.json:

    https://github.com/Honeyfish20/data-lineage-demo/blob/main/dbt/dbt_lineage_map.json

import jsondbt_sources = {}
dbt_models = {}
child_map = {}
lineage_map = {}def get_node_name(node_name):if node_name.startswith("source"):return dbt_sources[node_name]["name"]  if node_name.startswith("model"):return dbt_models[node_name]["name"]with open("manifest.json") as f:data = json.load(f)dbt_sources = data["sources"]
dbt_models = data["nodes"]
child_map = data["child_map"]for item in child_map:parent_name = get_node_name(item)child_list = []for i in range(len(child_map[item])):child_name = get_node_name(child_map[item][i])child_list.append(child_name)if len(child_list) > 0:lineage_map[parent_name] = child_listdbt_lineage_map["lineage_map"] = lineage_mapwith open('dbt_lineage_map.json', 'w') as f:content = json.dumps(dbt_lineage_map)f.write(content)

左滑查看更多

4、 将 Spline 和 DBT 的数据血缘

合并到 Amazon Neptune


解析本方案中前面步骤生成的中间文件,即 Spline 和 DBT 的数据血缘文件 spline_lineage_map.json 和 dbt_lineage_map.json,将两端的数据血缘插入 Amazon Neptune 进行拼接。代码示例参考如下:

from gremlin_python.process.anonymous_traversal import traversal
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
from gremlin_python.process.traversal import Tdef build_data_lineage(data_lineage_map):for node in data_lineage_map:if not g.V().hasLabel('lineage_node').has('node_name',node).hasNext():g.addV('lineage_node').property('node_name', node).next()for i in range(len(data_lineage_map[node])):child_node = data_lineage_map[node][i]if not g.V().hasLabel('lineage_node').has('node_name',child_node).hasNext():g.addV('lineage_node').property('node_name', child_node).next()g.V().has('node_name', node).addE('lineage_edge').property('edge_name',' ').to(__.V().has('node_name',child_node)).next()connection = DriverRemoteConnection('wss://{neptune cluster endpoint}:8182/gremlin', 'g')
g = traversal().withRemote(connection)with open("spline_lineage_map.json") as f:spline_lineage_map = json.load(f)with open("dbt_lineage_map.json") as f:dbt_linage_map = json.load(f)build_data_lineage(spline_lineage_map["lineage_map"])
build_data_lineage(dbt_lineage_map["lineage_map"])remoteConn.close()

左滑查看更多

最后启动 Amazon Neptune Notebook,可视化查询最终合并好的完整的数据血缘图:

%%gremlin -d node_name -de edge_name
g.V().outE().inV().path().by(elementMap())

左滑查看更多

查询效果如下:

caf97b58070b2d689143de4e1ff4be62.png

后期展望

本方案从技术角度提供了集成 Spline 和 DBT 数据血缘的解决方案以及原型验证,在实际环境中应用此方案需要在此基础上引入工程化的能力:

  • 1、Spline 的数据血缘存储在 ArangoDB 中,DBT 数据血缘文件存储在项目路径的 target 目录中,即上面提到的 manifest.json 文件,通常会通过 DataOps 发布到 Amazon S3 上。Amazon MWAA 作为此方案的顶层调度框架,Amazone Glue 和 DBT 作业执行完成后,可以实现额外的任务读取 ArangoDB 和 S3 文件,结合本方案中的示例代码,实现两端数据血缘的自动化集成。

  • 2、在实际场景中,可能存在多个环境,如开发、测试、生产等,此时可以为不同环境创建单独的 Amazon Neptune 实例进行环境隔离。同时在同一个环境中,如果有多个 Amazon MWAA 调度作业,在一些极端的情况下,这些作业中可能存在部分相同的上下游结点。此时在同一个环境中写入数据血缘时,可考虑根据 Spline 在 ArangoDB 生成的 appName 和最新的时间查询出当前 DAG 执行后的血缘数据,当和 DBT 进行数据血缘合并时,利用全局标识比如 Amazon MWAA 的 DAG 名称等信息作为图数据库的结点属性,使得后续能够灵活的查询出符合业务实际情况的数据血缘关系图。

  • 3、Spline 和 DBT 原生的数据血缘信息中,都包含数据血缘结点的类型,如文件、Table、View 等。在代码解析过程中,也可以将结点类型提取到临时的中间 Json 文件中,将结点类型作为 Label 写入到 Amazon Neptune 中,从而实现更加灵活的查询,以及更好的可视化效果,如一些主流的可视化查询工具,会根据结点 Label 显示为不同的颜色加以区分。

  • 4、在复杂的业务场景下,Amazon Glue job 会在 Spline 会生成更多的 execution plan,并且每一个 execution plan 的数据关系 ,也会更加复杂,会产生更多的分支,呈现出更为复杂的树形结构,这种情况下,则需要考虑使用更多 ArangoDB 的 collation 文件,进行数据解析,包括使用 collection 文件 follows,去更加精准的判断每一个 execution plan 中的 operation 不同的 action 之间的执行先后次序,以及使用 collection 文件 attribute,通过不同的 execution Plan 的数据上下游之间的字段关系,解析出数据血缘。

  • 5、Amazon S3 向 Amazon Redshift 的数据写入有多种方式,可以基于 Dynamic Frame 的方式,也可以使用 Spark Redshift connector,Spline 是 Spark 的一个组件,使用 Spark Redshift connector 或许可以提供更好的兼容性,在真实的场景中,Amazon Glue 从 Amazon S3 向 Amazon Redshift 中写入数据的场景也会更为复杂,未来可以尝试基于 Amazon Glue 4.0 使用 Spark Redshift connector 实现 Amazon S3 向 Amazon Redshift 的数据写入,收集更为丰富的数据血缘信息。

本篇作者

22729348389de35f07258a2aa35321b8.jpeg

吴楠

亚马逊云科技解决方案架构师,负责面向跨国企业客户的云计算方案架构咨询和设计,客户覆盖医疗,零售等行业。

70a3bf908ecf3078b4aa89c707be3107.jpeg

孙大木

亚马逊云科技资深解决方案架构师,负责基于亚马逊云科技云计算方案架构的咨询和设计,在国内推广亚马逊云科技云平台技术和各种解决方案。

fe6f20e60f98c0ec4284a550ffdc2a6e.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

11fd75ee5c9387bfc70d1f839f8a77bb.gif

听说,点完下面4个按钮

就不会碰到bug了!

cba7e9f6145cbbb2f879844c638386f8.gif

相关文章:

在基于亚马逊云科技的湖仓一体架构上构建数据血缘的探索和实践

背景介绍 随着大数据技术的进步,企业和组织越来越依赖数据驱动的决策。数据的质量、来源及其流动性因此显得非常关键。数据血缘分析为我们提供了一种追踪数据从起点到终点的方法,有助于理解数据如何被转换和消费,同时对数据治理和合规性起到关…...

VScode clangd 插件浏览 linux 源码

文章目录 VScode clangd 插件浏览 linux 源码clangd 安装与配置VScode 插件安装clangd 安装方法一方法二 clangd 配置 cmake 生成bear 生成 compile_commands.json触发 clangd linux 内核脚本生成 compile_commands.json 文件三种方式对比 VScode clangd 插件浏览 linux 源码 …...

GZ035 5G组网与运维赛题第8套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项(高职组) 赛题第8套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通(35分) 子任务1:5G公共网络部署与调试(15分) 子…...

《golang设计模式》第三部分·行为型模式-02-命令模式(Command)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 命令模式(Command)将类的业务行为以对象的方式封装,以便实现行为的参数化、撤销或重做等需求。 非命令模式的困惑: 类的行为在运行时是以实例方法…...

【linux进程控制(一)】进程终止--如何干掉一个进程?

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 进程终止 1. 前言2. 文章整体…...

言情小说怎么推广?如何推广网络小说?

网络小说是一种文学形式,它的受众群体相当广泛,其实也面临着很强的竞争,因此,网络推广是小说宣传的一项重要工作,这里小马识途营销顾问就分享一下小说推广的渠道和方法。 1、软文推广 在推广小说的过程中,…...

TensorFlow 的应用场景有哪些

TensorFlow是一个开源的人工智能框架,由Google公司开发。它是一个强大的工具,可以用于数值计算、机器学习和深度学习等领域,具有灵活性、可扩展性、可移植性等特点。 TensorFlow的基本概念包括: Tensor:Tensor是Tens…...

JAVA提取嵌套夹带文件之Apache Tika

目录结构 前言tika简介Tika支持的文件格式MAVEN依赖JAVA程序JAVA测试程序测试文件测试结果部分文件提取失败参考连接 前言 Apache Tika提取文件整理如下,如有特定的文件需要提取可以先参照【部分文件提取失败】章节对照,以免浪费您的宝贵时间&#xff0c…...

SSL数字证书服务

SSL/TLS 证书允许Web浏览器使用安全套接字层/传输层安全 (SSL/TLS) 协议识别并建立与网站的加密网络连接。 SSL数字证书主要功能 SSL证书在浏览器或用户计算机与服务器或网站之间建立加密连接。这种连接可以保护传输中的敏感数据免遭非授权方的拦截,从而使在线交易…...

浅谈安科瑞直流电表在荷兰光伏充电桩系统中的应用

摘要:本文介绍了安科瑞直流电表在荷兰光伏充电桩系统中的应用。主要用于充电桩的电流电压电能的计量。 Abstract: This article introduces the application of Acrel DC meters in PV charging pile system in Netherlands.The device is measuring current,volt…...

淘宝详情API接口怎么实现大数据分析和商品价格监控

一、引言 随着互联网的快速发展,大数据分析和价格监控成为了电商行业的关键环节。淘宝作为中国最大的电商平台之一,其详情API接口提供了丰富的商品信息,为大数据分析和价格监控提供了便利。本文将探讨如何使用淘宝详情API接口实现大数据分析…...

智能政务,办事更轻松!拓世法宝AI智慧政务数字人一体机,重新定义你的政务办理体验!

在构建现代化的政务服务体系中,高效、便捷是最重要的衡量标准。随着信息化技术的发展,很多政务服务已经实现了重要的线上办理,减轻了公民和企业的办事负担,同时也提升了政府部门的服务效率。可是,一些场景下的办事流程…...

WebBits库如何使用

WebBits 是一个用于构建 Web 应用程序的 Python 库。以下是使用 WebBits 库的一般步骤: 安装 WebBits:在终端或命令提示符中运行以下命令来安装 WebBits 库: pip install webbits 导入 WebBits 库:在 Python 脚本中导入 WebBits…...

通过netstat命令查看Linux的端口占用

一、netstat 完整写作network statistics,简写为netstat ,常用的几个参数为l、n、t、u、p。 -l : 仅展示监听状态下的程序(state 为LISTEN)。 -n :会使用ip端口的方式,来进行地址的描述。不使用-n就会变成服务器的名称…...

不用动脑小白也能制作出精美的电子杂志

随着互联网技术的发展和微信的普及程度,电子杂志制作已经受到越来越多人的关注,毕竟电子杂志的阅读便利性是纸质杂志无法比拟的。那如何制作一本精美的电子杂志呢? 这其实很easy,可以使用在线电子杂志制作平台FLBOOK &#xff0c…...

【计算系统】5分钟了解超算,高性能计算,并行计算,分布式计算,网格计算,集群计算以及云计算的区别

5分钟了解超算,高性能计算,并行计算,分布式计算,网格计算,集群计算以及云计算的区别 1. 超算2. 高性能计算3. 并行计算4. 分布式计算5. 网格计算6. 集群计算7. 云计算小结相关资料 1. 超算 超级计算机(Sup…...

6大场景,玩转ChatGPT!

文章目录 一、故事叙述提问举例 二、产品描述提问举例 三、报告撰写提问举例 四、邮件和信件撰写提问举例 五、新间稿和公告撰写提问举例 六、学术论文和专业文章撰写提问举例 本文是在GPT3.5版本下演示的 我们知道AI技术不仅能够自动生成文章和内容,还可以根据我们…...

工业废水再利用在哪些地方

工业废水再利用主要应用于以下几个方面: 工业生产:回收废水中含有的各种有价值的资源,如水、盐、油、悬浮物等,用于生产过程。预处理和深度处理:为满足工业生产过程对水质的要求,对废水进行预处理和深度处…...

Spring Cloud的ElasticSearch的进阶学习

目录 数据聚合 Bucket示例 Metric示例 RestAPI实现聚合 自动补全 使用拼音分词 自定义分词器 实现自动补全 RestAPI实现自动补全功能 数据同步 同步调用 异步通知 监听binlog 数据聚合 聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类: …...

WordPress恢复时候遇到的几个问题

1,一键安装 LAMP 最好是选择 CentOS 这种成熟的系统,最开始用 Alibaba Linux 报了好几个错,懒得折腾,最后重置镜像了。 https://lnmp.org/ wget https://soft.lnmp.com/lnmp/lnmp2.0.tar.gz -O lnmp2.0.tar.gz && tar z…...

设备码解释

一、名词解释 Device ID:设备ID。 IMEI:(International Mobile Equipment Identity)国际移动设备标识的缩写。是由15位数字组成的“电子串号”,它与每台手机一一对应,每个IMEI在世界上都是唯一的。 MEID…...

基于Docker-consul容器服务更新与发现

目录 一、什么是服务注册与发现: 二、Docker-consul介绍: 三、consul的关键特性: 四、consul部署: 1.部署规划: 2.consul服务器部署: 2.1 建立consul服务: 启动consul后默认会监听5个端口&a…...

firefox浏览器添加自定义搜索引擎方法

firefox浏览器添加自定义搜索引擎方法 1.在地址栏添加搜索引擎2.Mycroft Project 搜索引擎附加组件3.通过扩展插件添加自定义搜索引擎 Firefox这货居然不支持直接网址%s的搜索引擎定义方式,以下是添加方法。 firefox国际版119.0 1.在地址栏添加搜索引擎 &#xff…...

redis rdb aof

appendonly yes # appendfsync always appendfsync everysec # appendfsync no E:\Document_Redis_Windows\redis-2.4.5-win32-win64\64bit appendonly.aof...

浮动模块布局

基本思路 若宽度和浏览器一样宽,则不需要设置width 一般父盒子使用标准流,然后标准流内使用浮动 一般父盒子需要居中显示,使用 margin: 0 auto; 注意浮动盒子之间的margin值 与 父盒子width、height值之间的相等关系,一定要计算…...

信号、进程、线程、I/O介绍

文章目录 信号进程进程通信线程可/不可重入函数线程同步互斥锁条件变量自旋锁读写锁 I/O操作阻塞/非阻塞I/OI/O多路复用存储映射I/O 信号 信号是事件发生时对进程的通知机制,可以看做软件中断。信号与硬件中断的相似之处在于其能够打断程序当前执行的正常流程。大多…...

【css3】涟漪动画

效果展示 dom代码 <div class"mapSelfTitle66"><div></div> </div> 样式代码 .mapSelfTitle66{width:120px;height:60px;position: relative;&>div{width:100%;height:100%;background: url("~/assets/images/video_show/err…...

基础课17——智能客服系统

客户服务是一种以客户为中心的服务模式&#xff0c;旨在提高客户满意度和忠诚度&#xff0c;促进企业业务增长和可持续发展。在客户服务中&#xff0c;企业需要了解客户需求&#xff0c;提供优质、高效、个性化的服务&#xff0c;解决客户问题&#xff0c;满足客户需求&#xf…...

vue3 ts 导出PDF jsPDF

jsPDF 是一个基于 HTML5 的客户端解决方案&#xff0c;用于生成各种用途的 PDF 文档。 1、安装&#xff1a;npm install jspdf npm install --save html2canvas 2、引入&#xff1a;import jsPDF from "jspdf" import html2canvas from html2canvas 3、使用 <…...

Agent 应用于提示工程

如果Agent模仿了人类在现实世界中的操作方式&#xff0c;那么&#xff0c;能否应用于提示工程即Prompt Engingeering 呢&#xff1f; 从LLM到Prompt Engineering 大型语言模型(LLM)是一种基于Transformer的模型&#xff0c;已经在一个巨大的语料库或文本数据集上进行了训练&…...