最新要闻
- 独居老人为家中热闹没装大门 多车误入院子
- 每日资讯:RTX 4090显卡都能用 长城850W金牌全模电源504元(每瓦0.6元)
- 热门:沃尔沃XC90 T8充电版:经过最新升级后仍是首选SUV
- 全球新消息丨网友用AI生成《黑豹2》电影白人版海报 激怒正义人士
- 热讯:邝飚
- 天天滚动:长度仅23.5mm:尼康尼克尔Z 26mm f/2.8饼干镜头上架
- iPhone更香?调查显示近半数安卓用户考虑换苹果
- 最后一个武侠杂志 《今古传奇·武侠版》停刊:闭关修炼
- 今日快看!力压西游记、红楼梦 豆瓣9.8分:《大明王朝1566》封神国产剧
- 青海首次实现330千伏同塔双回线路中相导线带电消缺
- 男子工作期间上厕所摔伤:被判工伤
- 周杰伦发文谈论AI 称AI取代不了音乐创作的美感
- 今日快讯:86岁老人鸡骨头卡入支气管16年:部分骨头被气管黏膜包住
- 带货主播李佳琦进浙江一大学招美女主播:教室爆满 女生尖叫
- 学生点外卖评3星被商家威胁:不删除差评 让学校把你开除
- 世界速读:周鸿祎:ChatGPT迟早会产生自主意识 为人类带来毁灭危机
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Spark系列 - (4) Spark任务调度
目前已经更新完《Java并发编程》,《Spring核心知识》《Docker教程》和《JVM性能优化》,都是多年面试总结。欢迎关注【后端精进之路】,轻松阅读全部文章。
(资料图片仅供参考)
Java并发编程:
- Java并发编程系列-(1) 并发编程基础
- Java并发编程系列-(2) 线程的并发工具类
- Java并发编程系列-(3) 原子操作与CAS
- Java并发编程系列-(4) 显式锁与AQS
- Java并发编程系列-(5) Java并发容器
- Java并发编程系列-(6) Java线程池
- Java并发编程系列-(7) Java线程安全
- Java并发编程系列-(8) JMM和底层实现原理
- Java并发编程系列-(9) JDK 8/9/10中的并发
Docker教程:
- Docker系列-(1) 原理与基本操作
- Docker系列-(2) 镜像制作与发布
- Docker系列-(3) Docker-compose使用与负载均衡
- Docker 安装 Jenkins 并实现项目自动化部署
- 如何0失误快速搭建K8s环境?你想了解的这都有
JVM性能优化:
- JVM性能优化系列-(1) Java内存区域
- JVM性能优化系列-(2) 垃圾收集器与内存分配策略
- JVM性能优化系列-(3) 虚拟机执行子系统
- JVM性能优化系列-(4) 编写高效Java程序
- JVM性能优化系列-(5) 早期编译优化
- JVM性能优化系列-(6) 晚期编译优化
- JVM性能优化系列-(7) 深入了解性能优化
Spring MVC系列:
Spring MVC系列-(1) Spring概述
Spring MVC系列-(2) Bean的装配
Spring MVC系列-(3) Bean的装配
Spring MVC系列-(4) Bean的生命周期
Spring MVC系列-(5) AOP
Spring MVC系列-(6) 声明式事务
Spring MVC系列-(7) IOC初始化流程
Spark系列:
Spark系列 - (1) Spark基础
Spark系列 - (2) Spark核心概念
Spark系列 - (3) Spark SQL
4. Spark任务调度
4.1 核心组件
本节主要介绍Spark运行过程中的核心以及相关组件。
4.1.1 Driver
Spark驱动器节点,用于执行Spark任务中的main方法,负责实际代码的执行工作。Driver在Spark作业时主要负责:
- 将用户程序转化为任务(job)
- 在Executor之间调度任务
- 跟踪Executor的执行情况
- 通过UI展示查询运行情况
4.1.2 Executor
Spark Executor 节点是一个JVM进程,负责在Spark作业中运行具体任务,任务彼此之间相互独立。 Spark应用启动时, Executor节点被同时启动, 并且始终伴随着整个Spark应用的生命周期而存在。 如果有Executor节点发生了故障或崩溃, Spark应用也可以继续执行,会将出错节点上的任务调度到其他 Executor节点上继续运行。
Executor 有两个核心功能:
- 负责运行组成Spark应用的任务,并将结果返回给Driver进程;
- 他们通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
4.1.3 SparkContext
在Spark中由SparkContext负责与集群进行通讯、资源的申请以及任务的分配和监控等。当Work节点中的Executor运行完Task后,Driver同时负责将SparkContext关闭,通常也可以使用SparkContext来代表驱动程序(Driver)。
SparkContext 是用户通往 Spark 集群的唯一入口,可以用来在Spark集群中创建RDD 、累加器和广播变量。SparkContext 也是整个 Spark 应用程序中至关重要的一个对象, 可以说是整个Application运行调度的核心(不包括资源调度)。
SparkContext的核心作用是初始化 Spark 应用程序运行所需的核心组件,包括高层调度器(DAGScheduler)、底层调度器( TaskScheduler )和调度器的通信终端( SchedulerBackend ), 同时还会负责Spark程序向ClusterManager的注册等。
当RDD的action算子触发了作业( Job )后, SparkContext 会调用DAGScheduler根据宽窄依赖将 Job 划分成几个小的阶段( Stage ),TaskScheduler 会调度每个 Stage 的任务( Task ),另外,SchedulerBackend 负责申请和管理集群为当前Applic ation分配的计算资源(即 Executor ) 。
下图描述了Spark-On-Yarn 模式下在任务调度期间, ApplicationMaster、Driver以及Executor内部模块的交互过程:
Driver初始化SparkContext过程中,会分别初始化DAGScheduler、TaskScheduler 、SchedulerBackend 以及 HeartbeatReceiver,并启动SchedulerBackend 以及 HeartbeatReceiver。SchedulerBackend通过 ApplicationMaster申请资源,并不断从TaskScheduler 中拿到合适的Task分发到Executor执行。HeartbeatReceiver 负责接收Executor的心跳信息,监控Executor的存活状况,并通知到TaskScheduler 。
4.2 YARN
Yarn虽然不属于Spark的组件,但是现在Spark程序基本都是依赖Yarn来调度,因此专门介绍下YARN。
Yarn(Yet Another Resource Negotiator)是Hadoop集群的资源管理系统,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
4.2.1 架构
将JobTracker和TaskTracker进行分离,它由下面几大构成组件:
a. 一个全局的资源管理器 ResourceManagerb. ResourceManager的每个节点代理 NodeManagerc. 表示每个应用的ApplicationMasterd. 每一个ApplicationMaster拥有多个Container在NodeManager上运行
- Client:提交job。
- Resource Manager:它是YARN的主守护进程,负责所有应用程序之间的资源分配和管理。每当它接收到处理请求时,它都会将其转发给相应的节点管理器,并相应地分配资源以完成请求。它有两个主要组成部分:
- Scheduler:它根据分配的应用程序和可用资源执行调度。它是一个纯调度程序,意味着它不执行其他任务,例如监控或跟踪,并且不保证在任务失败时重新启动。 YARN调度器支持Capacity Scheduler、Fair Scheduler等插件对集群资源进行分区。
- Application Manager:它负责接受应用程序并与资源管理器协商第一个容器。如果任务失败,它还会重新启动 Application Master 容器。
Node Manager:它负责 Hadoop 集群上的单个节点,并管理应用程序和工作流以及该特定节点。它的主要工作是跟上资源管理器的步伐。它向资源管理器注册并发送带有节点健康状态的心跳。它监控资源使用情况,执行日志管理,还根据资源管理器的指示杀死容器。它还负责创建容器进程并根据Application master的请求启动它。
Application Master:应用程序是提交给框架的单个作业。应用主负责与资源管理器协商资源,跟踪单个应用的状态和监控进度。应用程序主机通过发送一个容器启动上下文(CLC)从节点管理器请求容器,其中包括应用程序需要运行的所有内容。一旦应用程序启动,它会不时地向资源管理器发送健康报告。
Container:它是单个节点上物理资源的集合,例如 RAM、CPU 内核和磁盘。容器由容器启动上下文(CLC)调用,这是一个包含环境变量、安全令牌、依赖项等信息的记录。
容器(Container)这个东西是 Yarn 对资源做的一层抽象。就像我们平时开发过程中,经常需要对底层一些东西进行封装,只提供给上层一个调用接口一样,Yarn 对资源的管理也是用到了这种思想。
如上所示,Yarn 将CPU核数,内存这些计算资源都封装成为一个个的容器(Container)。
4.2.2 任务提交流程
- 客户端提交申请
- Resource Manager分配一个Container来启动Application Manager
- Application Manager向Resource Manager注册自己
- AM从RM申请容器资源
- AM通知 Node Manager 启动容器
- 应用程序代码在容器中执行
- 客户端联系RM/AM以监控应用程序的状态
- Job完成后,AM向RM取消注册
4.3 Spark程序运行流程
在实际生产环境下, Spark集群的部署方式一般为 YARN-Cluster模式,之后的内核分析内容中我们默认集群的部署方式为YARN-Cluster模式。
下图展示了一个Spark应用程序从提交到运行的完整流程:
提交一个Spark应用程序,首先通过Client向 ResourceManager请求启动一个Application,同时检查是否有足够的资源满足Application的需求,如果资源条件满 足,则准备ApplicationMaster的启动上下文,交给 ResourceManager,并循环监控Application状态。
当提交的资源队列中有资源时, ResourceManager 会在某个 NodeManager 上启动 ApplicationMaster 进程,ApplicationMaster会单独启动Driver后台线程,当 Driver启动后,ApplicationMaster 会通过本地的 RPC 连接 Driver ,并开始向 ResourceManager 申请 Container 资源运行Executor进程(一个Executor对应与一个 Container),当ResourceManager返回Container 资源,ApplicationMaster则在对应的Container上启动 Executor 。
Driver 线程主要是初始化 SparkContext 对象, 准备运行所需的上下文, 然后一方面保持与ApplicationMaster 的 RPC 连接,通过 ApplicationMaster 申请资源,另一方面根据用户业务逻辑开始调度任务,将任务下发到已有的空闲Ex ecutor上。
当 ResourceManager 向 ApplicationMaster返回 Container 资源时,ApplicationMaster 就尝试在对应的 Container 上启动Executor 进程Executor进程起来后,会向Driver反向注册,注册成功后保持与Driver的心跳,同时等待 Driver 分发任务,当分发的任务执行完毕后,将任务状态上报给Driver 。
从上述时序图可知,Client只负责提交Application并监控 Application的状态。对于Spark的任务调度主要是集中在两个方面: 资源申请和任务分发,其主要是通过ApplicationMaster、Driver以及Executor之间来完成。
4.4 Spark任务调度概述
一个Spark程序包括Job、Stage以及Task三个概念:
- Job是以Action方法为界,遇到一个Action方法则触发一个Job;
- Stage是Job的子集,以RDD宽依赖(即Shuffle)为界,遇到Shuffle做一次划分;
- Task是Stage的子集,以并行度(分区数)来衡量,分区数是多少,则有多少个task。
Spark任务的调度总体上分两路进行,一路是Stage级的调度,一路是Task级的调度,总体的调度流程如下:
Spark RDD通过Transformation操作,形成了RDD血缘关系图,即DAG,最后通过Action的调用,触发job并调度执行。
DAGScheduler负责Stage级的调度,主要是将job切分成若干个Stages,并将每个Stage打包成TaskSet交给TaskScheudler调度。
TaskScheduler负责Task级的调度,将DAGScheduler传过来的TaskSet按照指定的调度策略分发到Executor上执行,调度过程中SchedulerBackend负责提供可用资源,其中SchedulerBackend有多种实现,分别对接不同的资源管理系统。
4.4.1 Spark Stage级调度
下图是Spark Stage级调度时的流程图:
SparkContext将Job交给DAGScheduler提交, 它会根据 RDD 的血缘关系构成的 DAG 进行切分,将一个Job 划分为若干Stages,具体划分策略是,由最终的RDD不断通过依赖回溯判断父依赖是否是宽依赖,即以Shuffle为界,划分Stage,窄依赖的 RDD之间被划分到同一个 Stage 中,可以进行 pipeline 式的计算,如上图紫色流程部分。划分的Stages 分两类,一类叫做ResultStage,为 DAG 最下游的Stage,由Action方法决定,另一类叫做ShuffleMapStage,为下游Stage准备数据。
下图以WordCount为例,说明整个过程:
一个Stage是否被提交,需要判断它的父Stage是否执行,只有在父Stage执行完毕才能提交当前Stage,如果一个Stage没有父Stage,那么从该Stage开始提交。Stage提交时会将Task信息(分区信息以及方法等)序列化并被打包成TaskSet交给TaskScheduler。
4.4.2 Spark Task级调度
Spark Task的调度是由TaskScheduler来完成,由前文可知,DAGScheduler将Stage打包到TaskSet交给TaskScheduler,TaskScheduler会将TaskSet封装为TaskSetManager加入到调度队列中,TaskSetManager结构如下图所示。
TaskSetManager负责监控管理同一个Stage中的Tasks,TaskScheduler就是以TaskSetManager为单元来调度任务。TaskScheduler初始化后会启动SchedulerBackend,它负责跟外界打交道,接收Executor的注册信息,并维护Executor的状态,TaskScheduler在SchedulerBackend轮询它的时候,会从调度队列中按照指定的调度策略选择TaskSetManager去调度运行,大致方法调用流程如下图所示:
TaskScheduler提交Tasks的原理
获取当前TaskSet里的所有Task;
根据当前的TaskSet封装成对应的TaskSetManager。每一个TaskSet都会创建一个TaskSetManager与之对应。该TaskSetManager的作用就是监控它对应的所有的Task的执行状态和管理。TaskScheduler就是以TaskSetManager为调度单元去执行Tasks的;
将封装好的TaskSetManager加入到等待的调度队列等待调度,又schedueBuilder决定调度的顺序,scheduleBuilder有两种实现类,一种是FIFOOSchedulerBuilder,另一个是FairSchedulerBuilder,而Spark默认采用的是FIFO调度模式。
在初始化TaskSchedulerImpl的时候会调用start方法来启动SchedulerBackend,SchedulerBackend(实际上是CoarseGrainedSchedulerBackend)调用riviveOffers方法。SchedulerBackend负责与外界打交道,接受来自Executor的注册,并维护Executor的状态。
调用CoarseGrainedSchedulerBackend的riviveOffers方法对Tasks进行调度。
reviveOffers方法里向DriverEndpoint发送ReviveOffers消息触发调度任务的执行,DriverEndpoint接受到ReviveOffers消息后接着调用makeOffers方法
SchedulerBackend(实际上是CoarseGrainedSchedulerBackend)负责将新创建的Task分发给Executor上执行。
调度策略
TaskScheduler支持两种调度策略,一种是FIFO,也是默认的调度策略,另一种是FAIR。
在TaskScheduler初始化过程中会实例化rootPool,表示树的根节点,是Pool类型。
1. FIFO调度策略
如果是采用FIFO调度策略,则直接简单地将TaskSetManager按照先来先到的方式入队,出队时直接拿出最先进队的TaskSetManager,其树结构如下图所示,TaskSetManager保存在一个FIFO队列中。
2. FAIR调度策略(0.8开始支持)
FAIR模式中有一个rootPool和多个子Pool,各个子Pool中存储着所有待分配的TaskSetMagager。
在FAIR模式中,需要先对子Pool进行排序,再对子Pool里面的TaskSetMagager进行排序,因为Pool和TaskSetMagager都继承了Schedulable特质,因此使用相同的排序算法。
排序过程的比较是基于Fair-share来比较的,每个要排序的对象包含三个属性: runningTasks值(正在运行的Task数)、minShare值、weight值,比较时会综合考量runningTasks值,minShare值以及weight值。
注意,minShare、weight的值均在公平调度配置文件fairscheduler.xml中被指定,调度池在构建阶段会读取此文件的相关配置。
比较规则如下:
- 如果 A 对象的runningTasks大于它的minShare,B 对象的runningTasks小于它的minShare,那么B排在A前面;(runningTasks 比 minShare 小的先执行)
- 如果A、B对象的 runningTasks 都小于它们的 minShare,那么就比较 runningTasks 与 math.max(minShare1, 1.0) 的比值(minShare使用率),谁小谁排前面;(minShare使用率低的先执行)
- 如果A、B对象的runningTasks都大于它们的minShare,那么就比较runningTasks与weight的比值(权重使用率),谁小谁排前面。(权重使用率低的先执行)
- 如果上述比较均相等,则比较名字。
整体上来说就是通过minShare和weight这两个参数控制比较过程,可以做到让minShare使用率和权重使用率少(实际运行task比例较少)的先运行。
FAIR模式排序完成后,所有的TaskSetManager被放入一个ArrayBuffer里,之后依次被取出并发送给Executor执行。
从调度队列中拿到TaskSetManager后,由于TaskSetManager封装了一个Stage的所有Task,并负责管理调度这些Task,那么接下来的工作就是TaskSetManager按照一定的规则一个个取出Task给TaskScheduler,TaskScheduler再交给SchedulerBackend去发到Executor上执行。
可以采用如下设置启动公平调度器:
val conf = new SparkConf().setMaster(...).setAppName(...)conf.set("spark.scheduler.mode", "FAIR")val sc = new SparkContext(conf)
本地化调度
DAGScheduler切割Job,划分Stage, 通过调用submitStage来提交一个Stage对应的tasks,submitStage会调用submitMissingTasks,submitMissingTasks 确定每个需要计算的 task 的preferredLocations,通过调用getPreferrdeLocations()得到partition的优先位置,由于一个partition对应一个Task,此partition的优先位置就是task的优先位置,
对于要提交到TaskScheduler的TaskSet中的每一个Task,该ask优先位置与其对应的partition对应的优先位置一致。
从调度队列中拿到TaskSetManager后,那么接下来的工作就是TaskSetManager按照一定的规则一个个取出task给TaskScheduler,TaskScheduler再交给SchedulerBackend去发到Executor上执行。前面也提到,TaskSetManager封装了一个Stage的所有Task,并负责管理调度这些Task。 根据每个Task的优先位置,确定Task的Locality级别,Locality一共有五种,优先级由高到低顺序:
在调度执行时,Spark 调度总是会尽量让每个task以最高的本地性级别来启动,当一个task以本地性级别启动,但是该本地性级别对应的所有节点都没有空闲资源而启动失败,此时并不会马上降低本地性级别启动而是在某个时间长度内再次以本地性级别来启动该task,若超过限时时间则降级启动,去尝试下一个本地性级别,依次类推。
可以通过调大每个类别的最大容忍延迟时间,在等待阶段对应的Executor可能就会有相应的资源去执行此task,这就在在一定程度上提升了运行性能。
失败重试和黑名单
除了选择合适的Task调度运行外,还需要监控Task的执行状态,前面也提到,与外部打交道的是SchedulerBackend,Task被提交到Executor启动执行后,Executor会将执行状态上报给SchedulerBackend,SchedulerBackend则告诉TaskScheduler,TaskScheduler找到该Task对应的TaskSetManager,并通知到该TaskSetManager,这样TaskSetManager就知道Task的失败与成功状态,对于失败的Task,会记录它失败的次数,如果失败次数还没有超过最大重试次数,那么就把它放回待调度的Task池子中,否则整个Application失败。
在记录Task失败次数过程中,会记录它上一次失败所在的Executor Id和Host,这样下次再调度这个Task时,会使用黑名单机制,避免它被调度到上一次失败的节点上,起到一定的容错作用。黑名单记录Task上一次失败所在的Executor Id和Host,以及其对应的“拉黑”时间,“拉黑”时间是指这段时间内不要再往这个节点上调度这个Task了。
参考:
- https://cloud.tencent.com/developer/article/1733855
- https://www.jianshu.com/p/8cf5f16432f8
- https://blog.csdn.net/Suubyy/article/details/81945638
Spark系列 - (4) Spark任务调度
天天快资讯丨第122篇: JS函数一些基本概念
独居老人为家中热闹没装大门 多车误入院子
每日资讯:RTX 4090显卡都能用 长城850W金牌全模电源504元(每瓦0.6元)
day03-自己实现Mybatis底层机制-02
如何设计高并发项目
天天快资讯丨Android 应用接入 Firebase Crashlytics 进行崩溃分析上报
热议:Java 中 hashCode 和 equals 方法是什么?它们和 == 各有什么区别?
热门:沃尔沃XC90 T8充电版:经过最新升级后仍是首选SUV
全球新消息丨网友用AI生成《黑豹2》电影白人版海报 激怒正义人士
面向对象进阶第二天
环球视点!# 009 - 检验 (2)
热讯:邝飚
天天滚动:长度仅23.5mm:尼康尼克尔Z 26mm f/2.8饼干镜头上架
iPhone更香?调查显示近半数安卓用户考虑换苹果
最后一个武侠杂志 《今古传奇·武侠版》停刊:闭关修炼
今日快看!力压西游记、红楼梦 豆瓣9.8分:《大明王朝1566》封神国产剧
【天天快播报】python-函数
焦点热文:58.抽象数据类型
青海首次实现330千伏同塔双回线路中相导线带电消缺
男子工作期间上厕所摔伤:被判工伤
周杰伦发文谈论AI 称AI取代不了音乐创作的美感
今日快讯:86岁老人鸡骨头卡入支气管16年:部分骨头被气管黏膜包住
带货主播李佳琦进浙江一大学招美女主播:教室爆满 女生尖叫
学生点外卖评3星被商家威胁:不删除差评 让学校把你开除
linux中redis下载安装部署启动
环球视讯!21、现有网络模型的使用以及修改
环球看热讯:(数据库系统概论|王珊)第七章数据库设计-第二节:需求分析
世界速读:周鸿祎:ChatGPT迟早会产生自主意识 为人类带来毁灭危机
我国新一代载人登月飞船模型首次展出:将建造月球科研站
每日热议!委员建议:允许重大节日燃放烟花爆竹 应科学限放
吃透8图1模板,人人可以做架构
免费开源的邮件服务器搭建
天天热门:蚁群算法
每日热闻!Prometheus安装部署(主体)
【世界速看料】保时捷新能源车高架冒烟 司机:开得好好的就着了 差点被烧死
环球讯息:罗技Trophy G驾驶舱发布:兼容所有方向盘、踏板、主机和PC
百事通!网友称5千元买洗地机用2小时就坏掉:售后无门
天天速讯:十铨发布新款PCIe 5.0固态硬盘:顺序读取12000MB/s、配石墨烯散热片
当前速看:祸从天降!东北冰溜子从5楼坠落砸伤女子:北方人一定要注意
惠州普通话水平考试准考证查询
Joomla未授权访问漏洞(CVE-2023-23752)
环球头条:Go复合数据类型数组和切片
世界热点!springCloud Alibaba服务的注册与发现之eureka搭建
当前简讯:业内第三种烘干技术!石头宣布分子筛洗烘一体机H1
全国多地现“三星连珠”天象:金星、木星、弯月连成一条线
世界快讯:石头分子筛洗烘一体机H1发布:打破洗烘行业技术天花板
百度新车标外观专利获授权 造型罕见
世界观天下!小米新专利获授权:一卡多号 可节省功耗
what are ESC、BEC and UBEC ?
环球微动态丨不通过ArcGIS写Personal Geodatabase(esri mdb)
最新消息:我们喜爱的 10 种免费 SQL Server 资源
世界新消息丨ChatGPT对于普通人有什么机会和影响?
世界热消息:8成特效中国制作!《流浪地球2》豆瓣涨至8.3 超100万人评分
当前动态:38秒旋风榨汁 小熊无线多功能榨汁机34.9元大促
3000元档超香二代骁龙8旗舰!努比亚Z50 16GB+256GB狂飙版来了
《暗黑》平替?《火炬之光:无限》国服官宣5月公测
头条焦点:首个游戏版ChatGPT 网易《逆水寒》手游预计上半年推出:自研AI得分超过人类
tcl电冰箱
消息!北向资金本周净卖出41.25亿元
观天下!分布式事务和Spanner分布式数据库
8000+字,就说一个字Volatile
环球关注:ChatGPT迅速学会下棋精髓 把人类给整不会了 网友:这谁预判得了?
世界快报:长城拼了!哈弗H6 DHT-PHEV限时优惠1.5万元:仅14.48万起
全球短讯!iPhone 15标准版上了灵动岛和USB-C接口:但跟Pro版差距还是太大
《狂飙》高启兰在日本火爆出圈 网友:《柯南》妃英理本理
全球今亮点!数字孪生|可视化图表之分组柱状图
世界今日讯!测试角色在项目各阶段的项目管理tips
当前速读:【JVM】JDK7后intern方法总结
世界热讯:centos7多网口配置同网段IP解决方案
焦点快播:【Vue】vue3 元素在某区域内缩放拖拽
灵活就业交医保太亏了怎么说?交医保太亏了具体指的是什么
苹果水下操控iPhone屏幕专利获批:或万元起售的Ultra机型独享
当前信息:魅族20电池寿命稳了:1600天连续充放容量仍大于80%
【新视野】日系车再受质疑!铃木维特拉遭车主集体投诉:刹车变硬踩不动
全球快讯:女子下班途中被狗撞伤被判工伤 法院:非本人主要责任
LGV 引理
【报资讯】如何实现把多个git仓库合并为一个,并保留提交记录?
AI创作享有版权吗?
世界视讯!卖的比“老头环”快!《霍格沃茨之遗》销量破1200万
今天是世界讨厌香菜日 不爱吃竟是“天注定”:跟基因有关
测试版用户终于能“反悔”了:Win11新功能允许退回正式版系统
今日报丨果然是“应试” IIHS碰撞测试难度提高:年度获奖车型数量腰斩
海绵宝宝是一种原始的什么动物?红色海绵球是干什么用的?
正者无敌三个太太的结局是什么?正者无敌演员表介绍
宫锁连城为什么下架了?宫锁连城的大结局是什么?
安全帽能代替头盔吗?安全帽颜色的级别区分
光盘怎么进行拷贝?光盘拷贝到u盘需要多少钱?
word安全模式是怎么回事?word安全模式怎么解除?
苹果怎么查询激活时间?苹果怎么传输数据到新的手机上?
闪存卡损坏是什么原因?闪存卡损坏怎样修复?
当前速看:易基因|DNA甲基化研究的测序数据挖掘思路:干货分享
速看:Centos7单机部署Etcd
Springcloud~openfeign开启hystrix基于线程池熔断的传值问题
环球热点!产品经理
【网关开发】9.Openresty 自定义流量分流策略支持灰度(金丝雀)等发布业务场景
每日热议!刘洋一杆领跑资格考试36洞 四人并列第二
天天热议:曾凭五菱宏光MINI EV火爆出圈 小米汽车营销负责人周钘离职
全球限量1962台!徕卡推出D-Lux7 “007”限量版相机:售价达16800元
全球最资讯丨《嗜血印》魅魔DLC完善更新 新增魅魔纹和性感尾巴