04 | 移动计算比移动数据更划算

那么如何解决 PB 级数据进行计算的问题呢?

这个问题的解决思路其实跟大型网站的分布式架构思路是一样的,采用分布式集群的解决方案,用数千台甚至上万台计算机构建一个大数据计算处理集群,利用更多的网络带宽、内存空间、磁盘容量、CPU 核心数去进行计算处理。

既然数据是庞大的,而程序要比数据小得多,将数据输入给程序是不划算的,那么就反其道而行之,将程序分发到数据所在的地方进行计算,也就是所谓的移动计算比移动数据更划算

移动计算程序到数据所在位置进行计算是如何实现的呢?(qeustion 待优化)

  1. 将待处理的大规模数据存储在服务器集群的所有服务器上,主要使用 HDFS 分布式文件存储系统,将文件分成很多块(Block),以块为单位存储在集群的服务器上。

  2. 大数据引擎根据集群里不同服务器的计算能力,在每台服务器上启动若干分布式任务执行进程,这些进程会等待给它们分配执行任务。

  3. 使用大数据计算框架支持的编程模型进行编程,比如 Hadoop 的 MapReduce 编程模型,或者 Spark 的 RDD 编程模型。应用程序编写好以后,将其打包,MapReduce 和 Spark 都是在 JVM 环境中运行,所以打包出来的是一个 Java 的 JAR 包。

  4. 用 Hadoop 或者 Spark 的启动命令执行这个应用程序的 JAR 包,首先执行引擎会解析程序要处理的数据输入路径,根据输入数据量的大小,将数据分成若干片(Split),每一个数据片都分配给一个任务执行进程去处理。

  5. 任务执行进程收到分配的任务后,检查自己是否有任务对应的程序包,如果没有就去下载程序包,下载以后通过反射的方式加载程序。走到这里,最重要的一步,也就是移动计算就完成了。

  6. 加载程序后,任务执行进程根据分配的数据片的文件地址和数据在文件内的偏移量读取数据,并把数据输入给应用程序相应的方法去执行,从而实现在分布式服务器集群中移动计算程序,对大规模数据进行并行处理的计算目标。

互联网应用系统架构中有一种重要架构原则是尽量使用无状态的服务,不同服务实例之间不共享状态,也就是不持有数据,用户请求交给任何一个服务实例计算,处理的结果都是一样的,为什么要这样设计?这种架构有什么好处?

  • 服务间无需同步状态或者数据,便于扩缩容

05 | 从RAID看垂直伸缩到水平伸缩的演化

关于存储数据,单机时代,主要的解决方案是 RAID;分布式时代,主要解决方案是分布式文件系统。

数据存储需要解决的问题

1.数据存储容量的问题。既然大数据要解决的是数以 PB 计的数据计算问题,而一般的服务器磁盘容量通常 1~2TB,那么如何存储这么大规模的数据呢?

2.数据读写速度的问题。一般磁盘的连续读写速度为几十 MB,以这样的速度,几十 PB 的数据恐怕要读写到天荒地老。

3.数据可靠性的问题。磁盘大约是计算机设备中最易损坏的硬件了,通常情况一块磁盘使用寿命大概是一年,如果磁盘损坏了,数据怎么办?

RAID(独立磁盘冗余阵列)技术和原理

RAID(独立磁盘冗余阵列)技术是将多块普通磁盘组成一个阵列,共同对外提供服务。主要是为了改善磁盘的存储容量、读写速度,增强磁盘的可用性和容错能力。

首先,我们先假设服务器有 N 块磁盘,RAID 0是数据在从内存缓冲区写入磁盘时,根据磁盘数量将数据分成 N 份,这些数据同时并发写入 N 块磁盘,使得数据整体写入速度是一块磁盘的 N 倍;读取的时候也一样,因此 RAID 0 具有极快的数据读写速度。但是 RAID 0 不做数据备份,N 块磁盘中只要有一块损坏,数据完整性就被破坏,其他磁盘的数据也都无法使用了。

RAID 1是数据在写入磁盘时,将一份数据同时写入两块磁盘,这样任何一块磁盘损坏都不会导致数据丢失,插入一块新磁盘就可以通过复制数据的方式自动修复,具有极高的可靠性。

结合 RAID 0 和 RAID 1 两种方案构成了RAID 10,它是将所有磁盘 N 平均分成两份,数据同时在两份磁盘写入,相当于 RAID 1;但是平分成两份,在每一份磁盘(也就是 N/2 块磁盘)里面,利用 RAID 0 技术并发读写,这样既提高可靠性又改善性能。不过 RAID 10 的磁盘利用率较低,有一半的磁盘用来写备份数据。

一般情况下,一台服务器上很少出现同时损坏两块磁盘的情况,在只损坏一块磁盘的情况下,如果能利用其他磁盘的数据恢复损坏磁盘的数据,这样在保证可靠性和性能的同时,磁盘利用率也得到大幅提升。

顺着这个思路,RAID 3可以在数据写入磁盘的时候,将数据分成 N-1 份,并发写入 N-1 块磁盘,并在第 N 块磁盘记录校验数据,这样任何一块磁盘损坏(包括校验数据磁盘),都可以利用其他 N-1 块磁盘的数据修复。

但是在数据修改较多的场景中,任何磁盘数据的修改,都会导致第 N 块磁盘重写校验数据。频繁写入的后果是第 N 块磁盘比其他磁盘更容易损坏,需要频繁更换,所以 RAID 3 很少在实践中使用,因此在上面图中也就没有单独列出。

相比 RAID 3,RAID 5是使用更多的方案。RAID 5 和 RAID 3 很相似,但是校验数据不是写入第 N 块磁盘,而是螺旋式地写入所有磁盘中。这样校验数据的修改也被平均到所有磁盘上,避免 RAID 3 频繁写坏一块磁盘的情况。

如果数据需要很高的可靠性,在出现同时损坏两块磁盘的情况下(或者运维管理水平比较落后,坏了一块磁盘但是迟迟没有更换,导致又坏了一块磁盘),仍然需要修复数据,这时候可以使用RAID 6

RAID 6 和 RAID 5 类似,但是数据只写入 N-2 块磁盘,并螺旋式地在两块磁盘中写入校验信息(使用不同算法生成)。

垂直伸缩和水平伸缩

在计算机领域,实现更强的计算能力和更大规模的数据存储有两种思路,一种是升级计算机,一种是用分布式系统。前一种也被称作**“垂直伸缩”(scaling up),通过升级 CPU、内存、磁盘等将一台计算机变得更强大;后一种是“水平伸缩”(scaling out)**,添加更多的计算机到系统中,从而实现更强大的计算能力。

思考题

传统机械磁盘进行数据连续写入的时候,比如磁盘以日志格式连续写入操作,其写入速度远远大于磁盘随机写入的速度,比如关系数据库连续更新若干条数据记录,你知道这是为什么吗?

连续写入:写入只寻址一次 存储位置与逻辑位置相邻 不用多次寻址

随机写入:每写一次 便寻址一次 增加了磁盘的寻址时间

06 | 新技术层出不穷,HDFS依然是存储的王者

在整个大数据体系里面,最宝贵、最难以代替的资产就是数据,大数据所有的一切都要围绕数据展开。

HDFS 也许不是最好的大数据存储技术,但依然最重要的大数据存储技术

HDFS 是如何实现大数据高速、可靠的存储和访问

类似 RAID 设计理念

DataNode 负责文件数据的存储和读写操作,HDFS 将文件数据分割成若干数据块(Block),每个 DataNode 存储一部分数据块,这样文件就分布存储在整个 HDFS 服务器集群中。

NameNode 负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、数据块的 ID 以及存储位置等信息,相当于操作系统中文件分配表(FAT)的角色。

HDFS 高可用设计

  1. 数据存储故障容错

对于存储在 DataNode 上的数据块,计算并存储校验和(CheckSum)。在读取数据的时候,重新计算读取出来的数据的校验和。不对就从备份更新数据

  1. 磁盘故障容错

如果 DataNode 监测到本机的某块磁盘损坏,就将该块磁盘上存储的所有 BlockID 报告给 NameNode。根据备份数据更新

  1. DataNode 故障容错

DataNode 会通过心跳和 NameNode 保持通信,如果 DataNode 超时未发送心跳,NameNode 就会认为这个 DataNode 已经宕机失效。

  1. NameNode 故障容错

NameNode 是 HDFS 的核心,记录着 HDFS 文件分配表信息,所有的文件路径和数据块存储信息都保存在 NameNode。

NameNode 采用主从热备的方式提供高可用服务,请看下图。

关于保证数据完整性

分布式系统可能出故障地方又非常多,内存、CPU、主板、磁盘会损坏,服务器会宕机,网络会中断,机房会停电,

常用的保证系统可用性的策略有冗余备份、失效转移和降级限流。

失效转移需要注意失效的鉴定,防止“脑裂”现象。这也是引入 zooKeeper原因

当大量的用户请求或者数据处理请求到达的时候,由于计算资源有限,可能无法处理如此大量的请求,进而导致资源耗尽,系统崩溃。这种情况下,可以拒绝部分请求,即进行限流;也可以关闭部分功能,降低资源消耗,即进行降级

比如电商的“双十一”促销,为了保障促销活动期间应用的核心功能能够正常运行,比如下单功能,可以对系统进行降级处理,关闭部分非重要功能,比如商品评价功能。

思考题

想象一个场景,我们想利用全世界的个人电脑、手机、平板上的空闲存储空间,构成一个可以付费共享的分布式文件系统,希望用户可以安装一个 App 在自己的个人设备上,将个人资料安全地存储到这个分布式文件系统中,并支付一定费用;用户也可以用这个 App 将自己设备上的空闲存储空间共享出去,成为这个分布式文件系统存储的一部分,并收取一定费用。

难点

【1】 不能保障高可用的性能,随时被访问被验证;【2】网络条件要求过高,尤其是被需求或者均衡需要均衡时频繁的文件迁移;【3】要验证HDFS所有备份块的可用性,因此个人中端上不能过多不同用户,过碎的数据块;【4】为了保证系统的高效一般一块数据不会过小,要不然会浪费过多的计算资源(进程),如果单块数据在128M左右,自然会受到终端存储规模的制约【5】等等诸多隐患。因此,稳定的分布式端点还是必要的,不然文件将在诸多节点中频繁移动浪费大量的网络资源。【补】过于复杂的架构网络,对验证的响应延时也造成了麻烦

针对这些问题,是否可以添加检测机制,当用户机器满足共享条件,才可入网并产生价值,且根据风险有一个自身稳定积分。另外可以提供技术支持,主要参考云平台爬虫。具体还是看需求

07 | 为什么说MapReduce既是编程模型又是计算框架?

以前的分布式计算,只能专门处理某一类计算,比如进行大规模数据的排序,无法复用。

很多优秀的人,他们各有所长、各有特点,但是无一例外都有个共同的特征,就是对事物的洞察力来源于他们对事物的抽象能力,揭示出背后规律和模型。

目前的主流开发方式,只需要关心业务逻辑,不用关心系统调用与运行环境

Hadoop 解决大规模数据分布式计算的方案——MapReduce

开发人员必须基于 MapReduce 编程模型进行编程开发,然后将程序通过 MapReduce 计算框架分发到 Hadoop 集群中运行

编程模型

Map本意可以理解为地图,映射(面向对象语言都有Map集合),这里我们可以理解为从现实世界获得或产生映射。Reduce本意是减少的意思,这里我们可以理解为归并前面Map产生的映射。

编程模型只包含 Map 和 Reduce 两个过程,map 的主要输入是一对 <Key, Value> 值,经过 map 计算后输出一对 <Key, Value> 值;然后将相同 Key 合并,形成 <Key, Value 集合 >;再将结果输入 reduce,经过计算输出零个或多个 <Key, Value> 对。

WordCount 主要解决的是文本处理中词频统计的问题,就是统计文本中每一个单词出现的次数。下面是MapReduce 编程模型的主要计算过程和原理,红框分别是 MapReduce 作业启动和运行,以及 MapReduce 数据合并与连接

08 | MapReduce如何让数据完成一次旅行?

程序是如何在分布式集群中运行起来的呢?MapReduce 程序又是如何找到相应的数据并进行计算的呢?答案就是需要 MapReduce 计算框架来完成

计算模型运作方式

在实践中,这个过程有两个关键问题需要处理。

  • 如何为每个数据块分配一个 Map 计算任务,也就是代码是如何发送到数据块所在服务器的,发送后是如何启动的,启动以后如何知道自己需要计算的数据在文件什么位置(BlockID 是什么)。

  • 处于不同服务器的 map 输出的 <Key, Value> ,如何把相同的 Key 聚合在一起发送给 Reduce 任务进行处理。

MapReduce 作业启动和运行机制

我们以 Hadoop 1 为例,MapReduce 运行过程涉及三类关键进程。

  1. 大数据应用进程。这类进程是启动 MapReduce 程序的主入口,主要是指定 Map 和 Reduce 类、输入输出文件路径等,并提交作业给 Hadoop 集群,也就是下面提到的 JobTracker 进程。这是由用户启动的 MapReduce 程序进程,比如我们上期提到的 WordCount 程序。

  2. JobTracker 进程。这类进程根据要处理的输入数据量,命令下面提到的 TaskTracker 进程启动相应数量的 Map 和 Reduce 进程任务,并管理整个作业生命周期的任务调度和监控。这是 Hadoop 集群的常驻进程,需要注意的是,JobTracker 进程在整个 Hadoop 集群全局唯一。

  3. TaskTracker 进程。这个进程负责启动和管理 Map 进程以及 Reduce 进程。因为需要每个数据块都有对应的 map 函数,TaskTracker 进程通常和 HDFS 的 DataNode 进程启动在同一个服务器。也就是说,Hadoop 集群中绝大多数服务器同时运行 DataNode 进程和 TaskTracker 进程。

JobTracker (主)进程和 TaskTracker (从)进程是主从关系。主服务器通常只有一台,从服务器可能有几百上千台。主服务器负责为应用程序分配服务器资源以及作业执行的调度,而具体的计算操作则在从服务器上完成。

一主多从的服务器架构也是绝大多数大数据系统的架构方案。例如 HDFS、Yarn、Spark

可重复使用的架构方案叫作架构模式,一主多从可谓是大数据领域的最主要的架构模式。

MapReduce 具体的作业启动和计算过程,如下

  1. 应用进程 JobClient 将用户作业 JAR 包存储在 HDFS 中,将来这些 JAR 包会分发给 Hadoop 集群中的服务器执行 MapReduce 计算。

  2. 应用程序提交 job 作业给 JobTracker。

  3. JobTracker 根据作业调度策略创建 JobInProcess 树,每个作业都会有一个自己的 JobInProcess 树。

  4. JobInProcess 根据输入数据分片数目(通常情况就是数据块的数目)和设置的 Reduce 数目创建相应数量的 TaskInProcess。

  5. TaskTracker 进程和 JobTracker 进程进行定时通信。

  6. 如果 TaskTracker 有空闲的计算资源(有空闲 CPU 核心),JobTracker 就会给它分配任务。分配任务的时候会根据 TaskTracker 的服务器名字匹配在同一台机器上的数据块计算任务给它,使启动的计算任务正好处理本机上的数据,以实现我们一开始就提到的“移动计算比移动数据更划算”。

  7. TaskTracker 收到任务后根据任务类型(是 Map 还是 Reduce)和任务参数(作业 JAR 包路径、输入数据文件路径、要处理的数据在文件中的起始位置和偏移量、数据块多个备份的 DataNode 主机名等),启动相应的 Map 或者 Reduce 进程。

  8. Map 或者 Reduce 进程启动后,检查本地是否有要执行任务的 JAR 包文件,如果没有,就去 HDFS 上下载,然后加载 Map 或者 Reduce 代码开始执行。

  9. 如果是 Map 进程,从 HDFS 读取数据(通常要读取的数据块正好存储在本机);如果是 Reduce 进程,将结果数据写出到 HDFS。

日常业务开发中,仅仅是编写一个 map 函数和一个 reduce 函数。其他都交给 MapReduce 计算框架完成。

MapReduce 数据合并与连接机制

MapReduce 计算真正产生奇迹的地方是数据的合并与连接。

在 map 输出与 reduce 输入之间,MapReduce 计算框架处理数据合并与连接操作,这个操作有个专门的词汇叫shuffle。具体过程如下图。

每个 Map 任务的计算结果都会写入到本地文件系统,等 Map 任务快要计算完成的时候,MapReduce 计算框架会启动 shuffle 过程,在 Map 任务进程调用一个 Partitioner 接口,对 Map 产生的每个 <Key, Value> 进行 Reduce 分区选择,然后通过 HTTP 通信发送给对应的 Reduce 进程。

map 输出的 <Key, Value> shuffle 到哪个 Reduce 进程是这里的关键,它是由 Partitioner 来实现,MapReduce 框架默认的 Partitioner 用 Key 的哈希值对 Reduce 任务数量取模,相同的 Key 一定会落在相同的 Reduce 任务 ID 上。从实现上来看的话,这样的 Partitioner 代码只需要一行。(question)

思考题

互联网应用中,用户从手机或者 PC 上发起一个请求,请问这个请求数据经历了怎样的旅程?完成了哪些计算处理后响应给用户?

浏览器解析url,查看缓存,本地DNS解析,服务器DNS解析,TCP请求三次握手,HTTP请求,nginx转发,后台处理,HTTP responce返回,关闭TCP连接四次挥手,解析数据,存入缓存,请求HTML中资源并渲染

参考:https://blog.csdn.net/baidu_37837739/article/details/102839010

FAQ

map结果放入硬盘,虽然reducer需要再次读取,主要为了可靠性,spark就不写入硬盘,所以快

局限性,MapReduce没法计算斐波那契数列,因为不能分片计算。但是大数据场景几乎都是可以分片计算的。

移动计算主要是map阶段,reduce阶段数据还是要移动数据合并关联,不然很多计算无法完成

JobTracker和NameNode 通常不会再一个服务器。

绝对先后关系,一个reduce必须要他前置的所有map执行完才能执行。

MapReduce框架会在85%的map程序执行完成时,开始启动reduce程序,reduce程序一边shuffle已完成的map数据,一边等待未完成的map继续执行,直到全部map完成,reduce才开始执行计算。

09 | 为什么我们管Yarn叫作资源调度框架?

(question 需要review)

Hadoop 1 时代,资源调度主要通过TaskTracker 和 JobTracker 通信来完成。

主要缺点是,服务器集群资源调度管理和 MapReduce 执行过程耦合在一起,如果想在当前集群中运行其他计算任务,比如 Spark 或者 Storm,就无法统一使用集群中的资源了。

Hadoop 2 时代,将 Yarn(Yet Another Resource Negotiator) 从 MapReduce 中分离出来,成为一个独立的资源调度框架。

下面是 Yarn 架构图

Yarn 包括两个部分:一个是资源管理器(Resource Manager),一个是节点管理器(Node Manager)。

ResourceManager 进程负责整个集群的资源调度管理,通常部署在独立的服务器上;NodeManager 进程负责具体服务器上的资源和任务管理,在集群的每一台计算服务器上都会启动,基本上跟 HDFS 的 DataNode 进程一起出现。

具体说来,资源管理器又包括两个主要组件:调度器和应用程序管理器。

调度器其实就是一个资源分配算法,根据应用程序(Client)提交的资源申请和当前服务器集群的资源状况进行资源分配。Yarn 内置了几种资源调度算法,包括 Fair Scheduler、Capacity Scheduler 等,你也可以开发自己的资源调度算法供 Yarn 调用。

Yarn 进行资源分配的单位是容器(Container),每个容器包含了一定量的内存、CPU 等计算资源,默认配置下,每个容器包含一个 CPU 核心。容器由 NodeManager 进程启动和管理,NodeManger 进程会监控本节点上容器的运行状况并向 ResourceManger 进程汇报。

应用程序管理器负责应用程序的提交、监控应用程序运行状态等。应用程序启动后需要在集群中运行一个 ApplicationMaster,ApplicationMaster 也需要运行在容器里面。每个应用程序启动后都会先启动自己的 ApplicationMaster,由 ApplicationMaster 根据应用程序的资源需求进一步向 ResourceManager 进程申请容器资源,得到容器以后就会分发自己的应用程序代码到容器上启动,进而开始分布式计算。

我们以一个 MapReduce 程序为例,来看一下 Yarn 的整个工作流程。

  1. 我们向 Yarn 提交应用程序,包括 MapReduce ApplicationMaster、我们的 MapReduce 程序,以及 MapReduce Application 启动命令。

  2. ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一个容器,并将 MapReduce ApplicationMaster 分发到这个容器上面,并在容器里面启动 MapReduce ApplicationMaster。

  3. MapReduce ApplicationMaster 启动后立即向 ResourceManager 进程注册,并为自己的应用程序申请容器资源。

  4. MapReduce ApplicationMaster 申请到需要的容器后,立即和相应的 NodeManager 进程通信,将用户 MapReduce 程序分发到 NodeManager 进程所在服务器,并在容器中运行,运行的就是 Map 或者 Reduce 任务。

  5. Map 或者 Reduce 任务在运行期和 MapReduce ApplicationMaster 通信,汇报自己的运行状态,如果运行结束,MapReduce ApplicationMaster 向 ResourceManager 进程注销并释放所有的容器资源。

框架在架构设计上遵循一个重要的设计原则叫“依赖倒转原则”,依赖倒转原则是高层模块不能依赖低层模块,它们应该共同依赖一个抽象,这个抽象由高层模块定义,由低层模块实现。

高层模块和低层模块的划分,简单说来就是在调用链上,处于前面的是高层,后面的是低层。我们以典型的 Java Web 应用举例,用户请求在到达服务器以后,最先处理用户请求的是 Java Web 容器,比如 Tomcat、Jetty 这些,通过监听 80 端口,把 HTTP 二进制流封装成 Request 对象;然后是 Spring MVC 框架,把 Request 对象里的用户参数提取出来,根据请求的 URL 分发给相应的 Model 对象处理;再然后就是我们的应用程序,负责处理用户请求,具体来看,还会分成服务层、数据持久层等。

思考题

10|总结:我们能从Hadoop学到什么?

方向对了,路就不怕远

大数据领域的架构模式,也就是集中管理,分布存储与计算。

需要将知识关联起来,才能成为自己的东西

关于学习新知识我有一点心得体会想与你分享。我在学习新知识的时候会遵循一个5-20-2 法则,用 5 钟的时间了解这个新知识的特点、应用场景、要解决的问题;用 20 分钟理解它的主要设计原理、核心思想和思路;再花 2 个小时看关键的设计细节,尝试使用或者做一个 demo。

如果 5 分钟不能搞懂它要解决的问题,我就会放弃;20 分钟没有理解它的设计思路,我也会放弃;2 个小时还上不了手,我也会放一放。你相信我,一种真正有价值的好技术,你这次放弃了,它过一阵子还会换一种方式继续出现在你面前。这个时候,你再尝试用 5-20-2 法则去学习它,也许就会能理解了。我学 Hadoop 实际上就是经历了好几次这样的过程,才终于入门。而有些技术,当时我放弃了,它们再也没有出现在我面前,后来它们被历史淘汰了,我也没有浪费自己的时间。

思考题:

请求taobao.com,经历过程。

资料参考

从0开始学大数据 - 极客时间

Hadoop 原理和架构相关推荐

  1. 分布式计算框架Hadoop原理及架构全解

    Hadoop是Apache软件基金会所开发的并行计算框架与分布式文件系统.最核心的模块包括Hadoop Common.HDFS与MapReduce. HDFS HDFS是Hadoop分布式文件系统(H ...

  2. Hadoop的基础架构

    Hadoop这个名字现在对很多开发者来说,并不陌生,但是很多开发者对其工作原理和架构并不了解.Hadoop怎么实现的分布式存储和分布式计算,其计算性能为什么会提高那么多.本文将从其基本工作原理方面解释 ...

  3. Hadoop分布式系统集成架构

    一.概念 Hadoop是一个由Apache基金会所开发的分布式系统基础架构.(发音 是:[hædu:p]) http://hadoop.apache.org/ Hadoop Hadoop实现了一个分布 ...

  4. Amazon EMR(Elastic MapReduce):亚马逊Hadoop托管服务运行架构Hadoop云服务之战:微软vs.亚马逊...

    http://s3tools.org/s3cmd Amazon Elastic MapReduce (Amazon EMR)简介 Amazon Elastic MapReduce (Amazon EM ...

  5. 深入理解Hadoop之HDFS架构

    Hadoop分布式文件系统(HDFS)是一种分布式文件系统.它与现有的分布式文件系统有许多相似之处.但是,与其他分布式文件系统的差异是值得我们注意的: ♦  HDFS具有高度容错能力,旨在部署在低成本 ...

  6. 音视频开发(7)---流媒体服务器原理和架构解析

    流媒体服务器原理和架构解析 多媒体数据文件 一个完整的多媒体文件是由音频和视频两部分组成的,H264.Xvid等就是视频编码格式,MP3.AAC等就是音频编码格式,字幕文件只是附加文件.目前大部分的播 ...

  7. paip.性能跟踪profile原理与架构与本质-- python扫带java php

    paip.性能跟踪profile原理与架构与本质-- python扫带java php ##背景 弄个个输入法音标转换atiEnPH工具,老是python性能不的上K,7k记录浏览过k要30分钟了. ...

  8. 流媒体服务器原理和架构解析

    流媒体服务器原理和架构解析 多媒体数据文件 一个完整的多媒体文件是由音频和视频两部分组成的,H264.Xvid等就是视频编码格式,MP3.AAC等就是音频编码格式,字幕文件只是附加文件.目前大部分的播 ...

  9. 鸿蒙OS原子化服务卡片原理和架构分析

    引言 2021年6月2日晚间,华为在HarmonyOS 2系统及全场景新品发布会上正式推出了服务卡片,颠覆了人们对APP信息展示的认知,引起了行业内的极大关注,本文是对HarmonyOS服务卡片的原理 ...

最新文章

  1. 为什么要放弃 Lombok ?
  2. mysql zip 安装 启动_window的zip版mysql安装启动
  3. WSS(MOSS)如何修改Rich文本编辑器的宽度
  4. 最新的C#SqlHelper 类苏飞修改版(转载)
  5. 卢松松:如何复制暴利产品
  6. 使用 Edit + MASM 5.0 编译器 + Linker 连接器
  7. python实现文件上传和下载_[Python] socket实现TFTP上传和下载
  8. Java并发编程—线程间协作方式wait()、notify()、notifyAll()和Condition
  9. java中读取单个字符_如何使用Java中的Scanner类读取单个字符?
  10. python考试题库程序改错_求助,程序改错
  11. CompletableFuture详解~创建实例
  12. dhrystone测试结果_Linux性能测试工具-UnixBench--安装以及结果分析-阿里云开发者社区...
  13. 生活中要常常鼓励别人
  14. GitHub 开源跨平台神器 Electron 实践 | 技术头条
  15. 三角传输的在链路均衡项目中的灵活应用
  16. 【论文写作】体育城场地预约系统的数据表如何设计
  17. strpos、 strstr、 substr三个函数的对比讲解
  18. 高低压恒流斩波步进电机驱动器设计
  19. Google jib插件的使用
  20. 二分查找算法详细汇总

热门文章

  1. Chapter 15 Outcome Regression and Propensity Scores
  2. win10 如何打开sql server配置管理器
  3. 掌握这三招,你也能从容的拒绝别人
  4. Decorate the Newcomers: Visual Domain Prompt for Continual Test Time Adaptation
  5. 解决域控服务器时间错误,ntp时间服务器异常
  6. 有什么轻量级的大数据技术
  7. 使用XShell通过SSH访问Google谷歌云服务器方法
  8. cmos放电的方式和一些具体作用
  9. 宝藏软件Notion的基础使用攻略
  10. awstats linux日志分析,Linux/Centos服务器安装配置日志分析Awstats