数据血缘 Data Lineage 基础概念

数据血缘 (Data Lineage) ,又称数据血统、数据起源、数据谱系,是指数据的全生命周期中,数据从产生、处理、加工、融合、流转到最终消亡,数据之间自然形成一种关系。其记录了数据产生的链路关系,这些关系与人类的血缘关系比较相似,所以被成为数据血缘关系。它是数据治理的重要组成部分。

数据血缘 (Data Lineage) ,又称数据血统、数据起源、数据谱系,是指数据的全生命周期中,数据从产生、处理、加工、融合、流转到最终消亡,数据之间自然形成一种关系。其记录了数据产生的链路关系,这些关系与人类的血缘关系比较相似,所以被成为数据血缘关系。它是数据治理的重要组成部分。

  1. 血缘系统评价标准是什么?
  2. 如何构建数据血缘系统?
  3. 数据血缘落地有哪些方式?

一、数据血缘是什么

数据血缘是在数据的加工、流转过程产生的数据与数据之间的关系。

提供一种探查数据关系的手段,用于跟踪数据流经路径。

二、数据血缘的组成

1、数据节点

数据血缘中的节点,可以理解为数据流转中的一个个实体,用于承载数据功能业务。例如数据库、数据表、数据字段都是数据节点;从广义上来说,与数据业务相关的实体都可以作为节点纳入血缘图中,例如指标、报表、业务系统等。

按照血缘关系划分节点,主要有以下三类:流出节点->中间节点->流入节点

  • 流出节点: 数据提供方,血缘关系的源端节点。
  • 中间节点: 血缘关系中类型最多的节点,既承接流入数据,又对外流出数据。
  • 流入节点: 血缘关系的终端节点,一般为应用层,例如可视化报表、仪表板或业务系统。

2、节点属性

当前节点的属性信息,例如表名,字段名,注释,说明等。

3、流转路径

数据流转路径通过表现数据流动方向、数据更新量级、数据更新频率三个维度的信息,标明了数据的流入流出信息:

  • 数据流动方向: 通过箭头的方式表明数据流动方向
  • 数据更新量级: 数据更新的量级越大,血缘线条越粗,说明数据的重要性越高。
  • 数据更新频率: 数据更新的频率越高,血缘线条越短,变化越频繁,重要性越高。

4、流转规则-属性

流转规则体现了数据流转过程中发生的变化,属性则记录了当前路径对数据的操作内容,用户可通过流转路径查看该路径规则与属性,规则可以是直接映射关系,也可以是复杂的规则,例如:

  • 数据映射: 不对数据做任何变动,直接抽取。
  • 数据清洗: 表现数据流转过程中的筛选标准。例如要求数据不能为空值、符合特定格式等。
  • 数据转换: 数据流转过程中,流出实体的数据需要进行特殊处理才能接入到数据需求方。
  • 数据调度: 体现当前数据的调度依赖关系。
  • 数据应用: 为报表与应用提供数据。

三、我们为什么需要数据血缘

1、日益庞大的数据开发导致表间关系混乱,管理成本与使用成本激增

数据血缘产生最本质的需求。大数据开发作为数据汇集与数据服务提供方,庞大的数据与混乱的数据依赖导致管理成本与使用成本飙升。

2、数据价值评估,数据质量难以推进

表的优先级划分,计算资源的倾斜,表级数据质量监控,如何制定一个明确且科学的标准。

3、什么表该删,什么表不能删,下架无依据

业务库,数仓库,中间库,开发库,测试库等众多库表,是否存在数据冗余(一定存在)。以及存储资源如何释放?

4、动了一张表,错了一堆表

你改了一张表的字段,第二天醒来发现邮件里一堆任务异常告警。

5、ETL任务异常时的归因分析、影响分析、恢复

承接上个问题,如果存在任务异常或者ETL故障,我们如何定位异常原因,并且进行影响分析,以及下游受影响节点的快速恢复。

6、调度依赖混乱

数据依赖混乱必然会带来调度任务的依赖混乱,如何构建一个健壮的调度依赖。

7、数据安全审计难以开展

针对银行、保险、政府等对安全关注度较高的行业,数据安全-数据泄露-数据合规性需要重点关注。
由于数据存在ETL链路操作,下游表的数据来源于上游表,所以需要基于数据全链路来进行安全审计,否则可能会出现下游数据安全等级较低,导致上游部分核心数据泄露。

四、数据血缘可以做什么

1、流程定位,追踪溯源

通过可视化方式,将目标表的上下游依赖进行展示,一目了然。

2、确定影响范围

通过当前节点的下游节点数量以及类型可以确定其影响范围,可避免出现上游表的修改导致下游表的报错。

3、评估数据价值、推动数据质量

通过对所有表节点的下游节点进行汇总,排序,作为数据评估依据,可重点关注输出数量较多的数据节点,并添加数据质量监控。

4、提供数据下架依据

例如以下数据节点,无任何下游输出节点,且并无任何存档需求,则可以考虑将其下架删除。

5、归因分析,快速恢复

当某个任务出现问题时,通过查看血缘上游的节点,排查出造成问题的根因是什么。同时根据当前任务节点的下游节点进行任务的快速恢复。

6、梳理调度依赖

可以将血缘节点与调度节点绑定,通过血缘依赖进行ETL调度。

7、数据安全审计

数据本身具有权限与安全等级,下游数据的安全等级不应该低于上游的安全等级,否则会有权限泄露风险。

可以基于血缘,通过扫描高安全等级节点的下游,查看下游节点是否与上游节点权限保持一致,来排除权限泄露、数据泄露等安全合规风险。

五、数据血缘落地方案

目前业内常见的落地数据血缘系统以及应用,主要有以下三种方式:

1、采用开源系统:

Atlas、Metacat、Datahub等

采用开源系统最大的优点是投入成本较低,但是缺点主要包括

    1、适配性较差,开源方案无法完全匹配公司现有痛点。

    2、二开成本高,需要根据开源版本进行定制化开发。

2、厂商收费平台:

亿信华辰,网易数帆等

此类数据平台中会内置数据血缘管理系统,功能较为全面,使用方便。但是同样也有以下缺点:

    1、贵

    2、需要ALL IN平台,为保障数据血缘的使用,数据业务需要全部迁移到厂商平台中。

3、自建

通过图数据库、后端、前端自建数据血缘管理系统,此方案开发投入较大,但是有以下优点

    1、因地制宜,可根据核心痛点定制化开发元数据及数据血缘系统。

    2、技术积累,对于开发人员来说,从0-1开发数据血缘系统,可以更深刻的理解数据业务。

    3、平台解耦,独立于数据平台之外,数据血缘的开发不会对正常业务造成影响。

六、如何构建数据血缘系统

1、明确需求,确定边界

在进行血缘系统构建之前,需要进行需求调研,明确血缘系统的主要功能,从而确定血缘系统的最细节点粒度,实体边界范围。

例如节点粒度是否需要精确到字段级,或是表级。一般来说,表级粒度血缘可以解决75%左右的痛点需求, 字段级血缘复杂度较表级血缘高出许多,如果部门人数较少,可以考虑只精确到表级粒度血缘。

常见的实体节点包括:任务节点、库节点、表节点、字段节点、指标节点、报表节点、部门节点等。血缘系统可以扩展数据相关的实体节点,可以从不同的场景查看数据走向,例如表与指标,指标与报表的血缘关系。但是实体节点的范围需要明确,不可无限制的扩展下去。

明确需求,确定节点粒度与范围之后,才可根据痛点问题给出准确的解决方案,不至于血缘系统越建越臃肿,提高ROI(投入产出比)。

2、构建元数据管理系统

目前市面上所有的血缘系统都需要依赖于元数据管理系统而存在。

元数据作为血缘的基础,
    一是用于构建节点间的关联关系,
    二是用于填充节点的属性,
    三是血缘系统的应用需要基于元数据才能发挥出最大的价值。

所以构建血缘系统的前提一定是有一个较全面的元数据。

3、技术选型:图数据库

目前业内通常采用图数据库进行血缘关系的存储。

对于血缘关系这种层级较深,嵌套次数较多的应用场景,关系型数据库必须进行表连接的操作,表连接次数随着查询的深度增大而增多,会极大影响查询的响应速度。

而在图数据库中,应用程序不必使用外键约束实现表间的相互引用,而是利用关系作为连接跳板进行查询,在查询关系时性能极佳,而且利用图的方式来表达血缘关系更为直接。

4、血缘关系录入:自动解析and手动登记

自动解析:

    获取到元数据之后,首先可以根据元数据表中的SQL抽取语句,通过SQL解析器可自动化获取到当前表的来源表【SQL解析器推荐jsqlparse】,并进行血缘关系录入。

手动登记:

    如果当前表无SQL抽取语句,数据来源为手动导入、代码写入、SparkRDD方式等无法通过自动化方式确定来源表的时候,我们需要对来源表进行手动登记,然后进行血缘关系的录入。

5、血缘可视化

血缘系统构建完成后,为了能够更好的体现血缘价值,量化产出,需要进行血缘可视化的开发,分为两步:

 (1) 链路-属性展示:

    根据具体节点,通过点击操作,逐级展示血缘节点间的链路走向与涉及到的节点属性信息。

 (2)节点操作:

    基于可视化的血缘节点与当前节点附带的元数据属性,我们可以设想一些自动化操作例如:

        - 节点调度:直接基于血缘开启当前表节点的调度任务

        - 属性修改:通过前端修改当前节点的元数据属性并保存

6、血缘统计分析

数据血缘构建完成后,我们可以做一些统计分析的操作,从不同层面查看数据的分布与使用情况,从而支撑业务更好更快更清晰。

例如:
1. 数据节点下游节点数量排序,用于评估数据价值及其影响范围
2. 查询当前节点的所有上游节点,用于业务追踪溯源
3. 数据节点输出报表信息详情统计,用于报表的上架与更新
4. 查询孤岛节点,即无上下游节点的节点,用于数据删除的依据

7、血缘驱动业务开展

数据血缘构建完成,统计分析结果也有了,业务痛点也明确了,接下来我们即可利用数据血缘驱动业务更好更快开展。

落地的血缘相关业务有以下几点:

(1)影响范围告警:

    将血缘关系与调度任务打通,监测当前血缘节点的调度任务,如果当前节点调度出现异常,则对当前节点的所有下游节点进行告警。

(2)异常原因探查:

    还是将血缘关系与调度任务打通,监测当前血缘节点的调度任务,如果当前节点调度出现异常,则会给出当前节点的直接上游节点,用于探查异常原因。

(3)异常链路一键恢复:

    基于上一应用,异常原因定位并且修复完成之后,可以通过血缘系统,一键恢复当前数据节点的所有下游节点调度任务,真正实现一键操作。

(4)支撑数据下架:

    根据探查孤岛节点即无上下游节点的节点,归档数据表,节省存储空间。

(5)数据质量监控:

    对当前血缘中所有节点输出的下游节点数量进行排序,可以精确的判断某张表的影响范围大小,从而可以根据此对高排序表进行数据质量的监控。

(6)数据标准化监控:

    如果当前公司制定了基于库、表、字段的命名规范,我们可以通过探查血缘中的所有数据节点,并命名规范进行匹配,得到不符合规范的库、表、字段进行整改。

    当然了,此业务仅基于元数据也可实现。

(7)数据安全审计:

    团队基于用户职级、部门、操作行为等权重对目前的库表进行了数据权限等级划分,权限等级越高,当前表的安全级别越高。

    团队基于血缘进行数据全链路的安全等级监测,如果发现下游节点安全等级低于上游节点,则会进行告警并提示整改。确保因为安全等级混乱导致数据泄露。

七、血缘系统评价标准

在推动数据血缘落地过程中,经常会有用户询问:

  • 血缘质量如何?
  • 覆盖场景是否全面?
  • 能否解决他们的痛点?
  • 做出来好用吗?

市面上血缘系统方案那么多,我们自建系统的核心优势在哪里,血缘系统的优劣从哪些层次进行评价,于是量化出了以下三个技术指标:

1、准确率

定义: 假设一个任务实际的输入和产出与血缘中该任务的上游和下游相符,既不缺失也不多余,则认为这个任务的血缘是准确的,血缘准确的任务占全量任务的比例即为血缘准确率。

准确率是数据血缘中最核心的指标,例如影响范围告警,血缘的缺失有可能会造成重要任务没有被通知,造成线上事故。

我们在实践中通过两种途径,尽早发现有问题的血缘节点:

    人工校验: 通过构造测试用例来验证其他系统一样,血缘的准确性问题也可以通过构造用例来验证。实际操作时,我们会从线上运行的任务中采样出一部分,人工校验解析结果是否正确。

    用户反馈: 全量血缘集合的准确性验证是个漫长的过程,但是具体到某个用户的某个业务场景,问题就简化多了。实际操作中,我们会与一些业务方深入的合作,一起校验血缘准确性,并修复问题。

2、覆盖率

定义: 当有数据资产录入血缘系统时,则代表数据血缘覆盖了当前数据资产。被血缘覆盖到的数据资产占所有数据资产的比例即为血缘覆盖率。

血缘覆盖率是比较粗粒度的指标。作为准确率的补充,用户通过覆盖率可以知道当前已经支持的数据资产类型和任务类型,以及每种覆盖的范围。

在内部,我们定义覆盖率指标的目的有两个,
    一是我方比较关注的数据资产集合,
    二是寻找当前业务流程中尚未覆盖的数据资产集合,以便于后续血缘优化。

当血缘覆盖率低时,血缘系统的应用范围一定是不全面的,通过关注血缘覆盖率,我们可以知晓血缘的落地进度,推进数据血缘的有序落地。

3、时效性

定义: 从数据资产新增和任务发生修改的时间节点,到最终新增或变更的血缘关系录入到血缘系统的端到端延时。

对于一些用户场景来说,血缘的时效性并没有特别重要,属于加分项,但是有一些场景是强依赖。不同任务类型的时效性会有差异。

例如:故障影响范围告警以及恢复,是对血缘实时性要求很高的场景之一。如果血缘系统只能定时更新T-1的状态,可能会导致严重业务事故。

提升时效性的瓶颈,需要业务系统可以近实时的将任务相关的修改,以通知形式发送出来,并由血缘系统进行更新。

参考地址:https://www.aboutyun.com/forum.php?mod=viewthread&tid=33811&highlight=%26%231130%3B%26%231333%3B

数据治理 Data Governance 基础概念

数据架构、数据标准、数据质量、主数据管理、元数据管理、数据安全、数据生命周期、数据基础平台、数据应用、数据需求与规划 、外部数据采购、数据运维等;数据治理的6个基本原则:职责、策略、采购、绩效、符合和人员行为;数据管理组织的构成分为三个层次,自上而下划分为决策层、管理协调层以及执行层。

数据治理涉及到哪些方面?

数据架构、数据标准、数据质量、主数据管理、元数据管理、数据安全、数据生命周期、数据基础平台、数据应用、数据需求与规划 、外部数据采购、数据运维等

数据治理的6个基本原则:职责、策略、采购、绩效、符合和人员行为

数据管理组织的构成分为三个层次,自上而下划分为决策层、管理协调层以及执行层。

企业数据架构管理应该遵循 可信数据源原则;数据分布减法原则;数据完整性原则

数据治理过程中用到的工具

  1. 数据生命周期管理相关工具
  2. 数据安全相关工具
  3. 主数据管理工具
  4. 数据清洗工具
  5. 数据资产管理工具
  6. 数据共享交换平台或工具
  7. 数据质量管理工具
  8. 元数据管理工具
  9. 数据标准化工具

数据治理参考标注或方法论

SMART的:Specific(具体的)、Measurable(可衡量的)、Actionable(可操作的)、Relevant(相关的)、Timely(及时的)。

  1. GB/T36073-2018《数据管理能力成熟度评估模型》 —- 《数据管理能力成熟度评估模型》DCMM
    • DCMM按照组织、制度、流程、技术对数据管理能力进行了分析和总结, 提炼出组织数据管理的8个过程域,即数据战略、数据治理、数据架构、数据应 用、数据安全、数据质量、数据标准、数据生存周期
  2. GB/T 34960《信息技术服务治理 数据治理规范》
  3. DAMA DMBOK — DAMA数据管理知识体系指南(原书第2版)
  4. DGI
  5. COBIT 5
  6. TOGAF 9

DAMA数据管理知识体系、DCMM数据管理能力成熟度评估、DGI数据治理框架

DMBOK 简述

  • 数据治理(Data Governance):通过建立一个能够满足企业需求的数据决策体系,为数据管理提供指导和监督。这些权限和责任的建立应该考虑到组织的整体需求。(参见第3章)
  • 数据架构(Data Architecture):定义了与组织战略协调的管理数据资产的“蓝图”,指导基于组织的战略目标,指定符合战略需求的数据架构。(参见第4章)
  • 数据建模和设计(Data Modeling and Design):以数据模型(data model.)的精确形式,进行发现、分析、展示和沟通数据需求的过程。(参见第5章)
  • 数据存储和操作(Data Storage and Operations):以数据价值最大化为目标,包括存储数据的设计、实现和支持活动,以及在整个数据生命周期中,从计划到销毁的各种操作活动。(参见第6章)
  • 数据安全(Data Security):这一活动确保数据隐私和安全,数据的获得和使用必须要有安全的保障。(参见第7章)
  • 数据集成和互操作(Data Integration and Interoperability):包括与数据存储、应用程序和组织之间的数据移动和整合相关的过程。(参见第8章)
  • 文档和内容管理(Document and Content Management):用于管理非结构化媒体的数据和信息的生命周期过程,包括计划、实施和控制活动,尤其是指支持法律法规遵从性要求所需的文档。(参见第9章)
  • 参考数据和主数据管理(Reference and Master Data Management):包括核心共享数据的持续协调和维护,使关键业务实体的真实信息,以准确、及时和相关联的方式在各系统间得到一致使用。(参见第10章)
  • 数据仓库和商务智能(Data Warehousing and Business Intelligence):包括计划、实施和控制流程,来管理决策支持数据,并使知识工作者通过分析报告从数据中获得价值。(参见第11章)
  • 元数据管理(Metadata Management):包括规划、实施和控制活动,以便能够访问高质量的集成元数据,包括定义、模型、数据流和其他至关重要的信息(对理解数据及其创建、维护和访问系统有帮助)。(参见第12章)
  • 数据质量管理(Data Quality Management):包括规划和实施质量管理技术,以测量、评估和提高数据在组织内的适用性。(参见第13章)

除了有关知识领域的章节外DAMA-DMBOK,车轮图以外的内容,包含以下主题章节:

  • 数据处理伦理(Data Handling Ethics):描述了关于数据及其应用过程中,数据伦理规范在促进信息透明、社会责任决策中的核心作用。数据采集、分析和使用过程中的伦理意识对所有数据管理专业人士有指导作用。(参见第2章)
  • 大数据和数据科学(Big Data and Data Science):描述了针对大型的、多样化数据集收集和分析能力的提高而出现的技术和业务流程。(参见第14章)
  • 数据管理成熟度评估(Data Management Maturity Assessment):概述了评估和改进组织数据管理能力的方法。(参见第15章)
  • 数据管理组织和角色期望(Data Management Organization and Role Expectations):为组建数据管理团队、实现成功的数据管理活动提供了实践提供和参考因素。(第16章)
  • 数据管理和组织变革管理(Data Management and Organizational Change Management ):描述了如何计划和成功地推动企业文化变革,文化的变革是将数据管理实践有效地嵌入组织中必然结果。(第17章)

DGI数据治理项目通用10个组成部分

分类 具体内容
与过程相关 ① 最终目标与愿景
② 短期目标、治理标准、评估标准、资金筹集策略
③ 数据规则与定义
④ 决策权
⑤ 问责制度
⑥ 控制措施
与员工与企业部门相关 ⑦ 数据利益相关方
⑧ 数据治理办公室
⑨ 数据管理小组
与过程相关 ⑩ 主动型、应对型与持续性的数据治理过程(项目)

DGI框架的5W1H法则

WHY,为什么需要数据治理?

DGI框架中的第1-2组件,数据治理愿景使命、数据治理目标。用这两个组件来定义企业为什么需要数据治理。它为企业数据治理指明了方向,是其他数据治理活动的总体策略。

WHAT,数据治理治什么?

DGI框架中的3-6个组件,数据规则与定义、数据的决策权、数据问责制、数据管控,DGI框架这4个组件定义出了数据治理到底治什么。

  • 数据规则与定义,侧重业务规则的定义,例如:相关的策略、数据标准、合规性要求等;
  • 数据的决策权,侧重数据的确权,明确数据归口和产权为数据标准的定义、数据管理制度、数据管理流程的制度奠定基础。
  • 数据问责制,侧重数据治理职责和分工的定义,明确谁应该在什么时候做什么。
  • 数据管控,侧重采用什么样的措施来保障数据的质量和安全,以及数据的合规使用。

WHO,谁参与数据治理?

DGI框架中的7-9组件,定义数据治理的利益干系人,主要包括:数据利益相关者、数据治理办公室和数据专员。DGI框架对数据治理的主导、参与的职责分工定义给出了相关参考。

WHEN,什么时候开展数据治理?

DGI框架中的第10个组件,用来定义数据治理的实施路径、行动计划。

HOW,如何开展数据治理?

DGI框架中的第10组件,数据治理流程,描述了数据管理的重要活动和方法。

WHERE,数据治理位于何处?

DGI框架外的组件,虽然没有含在10大组件之列但却十分重要,强调明确当前企业数据治理的成熟度级别,找到企业与先进标杆的差距,是定义数据治理内容和策略的基础。

参考链接:https://blog.csdn.net/m0_56143415/article/details/122706095

python socket 零拷贝

This module provides access to the BSD socket interface. It is available on all modern Unix systems, Windows, MacOS, and probably additional platforms.

python document

Socket 是任何一种计算机网络通讯中最基础的内容。socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

python socket 介绍

传统的文件传输里面(read/write方式),在实现上需要经过多次上下文的切换,文件数据实际上是经过了四次copy操作:

硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎

1. Socket 类型

套接字格式:

socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。

socket类型 描述
socket.AF_UNIX 只能够用于单一的Unix系统进程间通信
socket.AF_INET 服务器之间网络通信
socket.AF_INET6 IPv6
socket.SOCK_STREAM 流式socket , for TCP
socket.SOCK_DGRAM 数据报式socket , for UDP
socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;
其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
socket.SOCK_SEQPACKET 可靠的连续数据包服务
创建TCP Socket: s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
创建UDP Socket: s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  1. Socket 函数

    1. TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。
    2. 服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)。
服务端socket函数 描述
s.bind(address) 将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址.
s.listen(backlog) 开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
s.accept() 接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
客户端socket函数 描述
s.connect(address) 连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.connect_ex(adddress) 功能与connect(address)相同,但是成功返回0,失败返回errno的值。
公共socket函数 描述
s.recv(bufsize[,flag]) 接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
s.send(string[,flag]) 发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
s.sendall(string[,flag]) 完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
s.recvfrom(bufsize[.flag]) 接受UDP套接字的数据。与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
s.sendto(string[,flag],address) 发送UDP数据。将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
s.close() 关闭套接字。
s.getpeername() 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname() 返回套接字自己的地址。通常是一个元组(ipaddr,port)
s.setsockopt(level,optname,value) 设置给定套接字选项的值。
s.getsockopt(level,optname[.buflen]) 返回套接字选项的值。
s.settimeout(timeout) 设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
s.gettimeout() 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。
s.fileno() 返回套接字的文件描述符。
s.setblocking(flag) 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。
非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
s.makefile() 创建一个与该套接字相关连的文件
  1. socket编程思路

TCP服务端:

1. 创建套接字,绑定套接字到本地IP与端口 

# socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.bind()

2. 开始监听连接                   #s.listen()

3. 进入循环,不断接受客户端的连接请求              #s.accept()

4. 然后接收传来的数据,并发送给对方数据         #s.recv() , s.sendall()

5. 传输完毕后,关闭套接字                     #s.close()

TCP客户端:

1. 创建套接字,连接远端地址

# socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.connect()

2. 连接后发送数据和接收数据          # s.sendall(), s.recv()

3. 传输完毕后,关闭套接字          #s.close()

socket server 编写步骤该要

1. 第一步是创建socket对象。
    调用socket构造函数。如:
    socket = socket.socket( family, type )
    family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。
    type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
2. 第二步是将socket绑定到指定地址。
    这是通过socket对象的bind方法来实现的:
    socket.bind( address )
    由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。
    如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。
3. 第三步是使用socket套接字的listen方法接收连接请求。
    socket.listen( backlog )
    backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
4. 第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。
    connection, address = socket.accept()
    调用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。
    accept方法返回一个含有两个元素的元组(connection,address)。
    第一个元素connection是新的socket对象,服务器必须通过它与客户通信;
    第二个元素 address是客户的Internet地址。
5. 第五步是处理阶段。
    服务器和客户端通过send和recv方法通信(传输 数据)。
    服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。
    服务器使用recv方法从客户接收信息。调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。
    recv方法在接收数据时会进入“blocked”状态,最后返回一个字符串,用它表示收到的数据。
    如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,
    多余的数据会从缓冲区 删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。
6. 传输结束,服务器调用socket的close方法关闭连接。

scoket client 编写步骤该要

1. 创建一个socket以连接服务器:socket = socket.socket( family, type )
2. 使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:
    socket.connect( (host,port) )
    host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。
    如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。
3. 处理阶段,客户和服务器将通过send方法和recv方法通信。
4. 传输结束,客户通过调用socket的close方法关闭连接。

python scoket 零拷贝代码实例

接受服务端基本代码实现

    import socket

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_port =5678
    server_addr = ("0.0.0.0", server_port)
    print(f"Start server on port{server_port}")
    sock.bind(server_addr)

    sock.listen(1)

    while True:
        print("Waiting for connection")
        connection, client_addr = sock.accept()
        size =0
        try:
            i =0
            while  True:
                data = connection.recv(65536)
                i +=1
                if data:
                    size += len(data)
                else:
                    print("Done receiving data")
                    break
            print(f"Total size:{size}")
        except Exception as e:
            print(e)
        finally:
            connection.close()

传输客户端实现, 零拷贝的主要实现代码是通过 os.sendfile来达到目的

    import socket
    import time, os

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    server_port =5678
    server_address = ('127.0.0.1', server_port)

    sock.connect(server_address)
    start = time.time()

    try:
        with open(r'/tmp/吞噬星空.txt','rb') as f:
            # 普通方式传输代码实现
            # message = f.read()
            # sock.sendall(message)
            ret =0
            offset =0
            while True:
                ret = os.sendfile(sock.fileno(), f.fileno(), offset,65536)
                offset += ret
                if ret ==0:
                    break
    except Exception as e:
        print(e)
    finally:
        sock.close()
    end = time.time()
    print("Total time: ", end - start)