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

Presto 在美图的实践

导读:本文的主题是Presto高性能引擎在美图的实践,首先将介绍美图在处理ad-hoc场景下为何选择Presto,其次我们如何通过外部组件对Presto高可用与稳定性的增强。然后介绍在美图业务中如何做到合理与高效的利用集群资源,最后如何利用Presto应用于部分离线计算场景中。使大家了解Presto引擎的优缺点,适合的使用场景,以及在美图的实践经验。

正在上传…重新上传取消
如果想及时了解Spark、Hadoop或者HBase相关的文章,欢迎关注微信公众号:过往记忆大数据

技术选型

Presto是一个Ad-Hoc的ROLAP解决方案。ROLAP的优缺点简单介绍如下:

ROLAP优点:

  • ROLAP适合非常灵活的查询。

  • ROLAP查询性能相对比较高。

  • ROLAP针对MPP架构支持实时数据的写入与实时分析。

  • Presto内置支持各种聚合的算子,如sum、count,擅长计算一些指标如PV、UV,适合多维度聚合查询。

ROLAP缺点:

  • 所有计算和分析都是基于内存去完成的,对内存的需求比较大。

  • 线上实际使用过程中发现,查询周期相对比较长时(如查一年、两年的数据),经常会遇到数据量会过大的问题,会线性影响查询性能。

  • 对比MOLAP由于需要提前做一次预计算,Presto则存在一定的性能差距。

MOLAP的典型技术实现是Druid和Kylin。两者均通过做预计算,创建对应的cube,来实现一个性能上比较快的OLAP方案。但是,这是以牺牲业务灵活性为代价的。相比来说,Presto有更好的灵活性。

我们内部调研了三个Ad-Hoc的ROLAP技术组件选型,包括Hive on Spark,Impala和Presto。

Hive on Spark

Hive on Spark的优点,首先是在美图内部广泛使用,经受住了时间的考验。其次是使用上的灵活性,因为已经使用了很多年,相对比较熟悉,做过较多二次改造,包括源码增强和一些重点模块重构。 

缺点也是显而易见的,Hive on Spark在查询一些相对比较大的任务,容易发生shuffle、OOM和数据倾斜等问题。其次,Hive on Spark和其他竞品如Impala和 Presto相比,查询速度很慢,明显无法满足在线查询的需求。

Impala

Impala的优点,首先是轻量快速,支持近实时的查询。其次,所有计算均在内存中完成,减少了计算延迟和磁盘IO开销。

但缺点也比较多,首先是主节点缺乏高可用的机制(HA机制)。其次是零容忍问题,即一个查询发送过来的话,如果其中一个节点查询失败,会导致整个查询都失败。再次,我们在使用过程中发现它对自定义函数支持的不是很好。另外,Impala强依赖于CDH的生态,跟我们现有架构不能很好的融合。我们现有架构使用了一些开源社区的组件。如果强依赖于CDH, 当我们要做版本升级、补丁升级或者代码重构后的升级时,存在过度依赖CDH而操作不友好的问题。最后,就是查询数据量过大的话,会发生比较严重的性能下降。此外,还有对于并发的支持,不是特别好。

Presto

最后来看今天的主角Presto。Presto优点首先是轻量快速,支持近乎实时查询。其次,它的社区活跃度也比较高,文档也比较完善,基本可以兼容业务上所有的SQL,也能扛住比较大的并发。

当然Presto也有一些缺点,一是零容忍问题,如果一个失败,一个节点上的查询失败,会导致整个查询的失败。再就是主节点缺乏HA的机制。HA这个缺点,业界也有方案可以去完善。在下一个章节,会分享美图是如何完善HA机制的。

我们通过对比三个组件的一些特性,包括多表关联、单表查询和系统负载等,得到了一个打分。分数越高越适合我们的业务场景,优势越明显。表格中可以看到,Presto总计39分是最高的,最符合我们的业务场景。

同时我们也做了计算性能上的对比。Presto的性能最好,Impala略微差一些。可能比较细心的同学会发现,在Query 9里面,Impala的结果是空白的,这是因为Impala不兼容Query 9中的语法。这里面我们也对比了在美图内部用的比较多的Spark SQL,由于上篇文章没讲到Spark SQL,所以这里只做了一个性能的比较。基于这些维度考虑,我们最终选择了Presto。

Coordinator HA

单点问题

前面提到,Presto有一个比较致命的缺陷,就是缺乏主节点的HA高可用性。在这一章节中,看看我们如何去克服和完善这个组件。

首先,我们看一看Presto的整体流程。Presto Client端发送一个查询请求给Presto的Coordinator, Coordinator先去Hive Metastore获取这个任务执行过程中所需的一些源数据信息,再将任务转发给它对应的Worker节点,然后Worker节点从文件系统里面去拉数据做计算。

这个流程中,显而易见致命的缺点是Coordinator的单节点。Coordinator故障会导致整个集群的不可用,会严重影响线上业务。此外,Coordinator对集群升级也带来比较大的风险。

方案

这里面整理了业界广泛使用的两个方案。

方案一:

方案一是多集群部署的方式,分为两个集群,分别为Presto集群一和Presto集群二。Client端在运行任务时,会按照一定的规则去选择某一个Presto集群,建立连接,创建任务。任务建立完成后,Client端将连接的Presto Coordinator会话信息保存起来,存储在DB里面。这样当Presto集群挂掉之后,当前会话会有一些任务失败,在连接到新的集群之后,可以做任务恢复。最后,每一次任务进行交互的时候,都直接访问当前获取连接的Presto集群即可。

这个方案本身没有问题,可以快速的搭建出一套容灾方案。但是其缺点也是显而易见的。其实只需要一套集群,但是做了过多的冗余,用了两套集群来完成在线查询的业务,在成本方面不能接受。当然基于这个方案,也可以在同一个机器上做混部,相当于一个机器多个Worker实例。但会存在管理难度比较大的问题,可能会涉及到Worker与Worker之间的资源抢占,终归不是最优的方案。

这里稍微点一下,这边Meta Store有三台机器,是为了实现高可用。Coordinator接收到任务,会去获取任务的一些源数据信息。此时通过三个Meta Store进行轮询选择。当一台Meta Store挂掉之后,还有两个实例可以用。这个方案一被pass掉了,因为不能接受它的冗余。

方案二:

接下来看方案二,Presto采取了一个主备的Coordinator单集群部署方式。这个是大规模集群比较常见的部署方式。

首先,在Presto集群上层部署一个KeepAlived的第三方服务。然后通过KeepAlived创建单独的虚拟IP(Virtual IP),指向对应的主备节点。这样,客户端通过虚拟IP访问集群,内部Worker也通过虚拟IP访问Coordinator节点。主节点故障时,KeepAlived通过内部的服务注册Discovery机制,注册到一台新的Coordinator上,这样对虚拟IP的访问会飘移至另外一台Coordinator,同样Worker节点也会访问另外一台Coordinator。

总结来说:如果Coordinator master发生了故障,可以业务无感知的切换到备用Coordinator上。这个方案可以解决我们Coordinator单点的问题,也不存在任何的资源浪费的问题。

实施步骤

接下来我们再细细的看一下方案二的一个大致的实施步骤。第一,需要绑定一个通配地址,也就是类似0.0.0.0这么一个通配地址,确保能接受VIP的请求。如果是同网段,这样的IP也可以, 只要他的这个网络环境是互通的就可以了。

第二点就是使用KeepAlived去监控本地的Coordinator进程。当服务发生异常时,去关闭这个KeepAlived进程,使得这个VIP可以漂移到另外一台机器上。将Worker的Coordinator地址配置成对应的VIP,然后定期上报状态。其实再展开一点,Worker并不是向真正的Coordinator服务上报状态,而是向Discovery这个服务去上报状态。Discovery相当于是Coordinator的一个进程。当发生虚拟IP漂移的时候,Worker会在下一次上报状态的时候,无感知的去注册到新的Coordinator。Client可以继续通过VIP去访问集群。

可能会有点绕,大家只要记住,Coordinator和Worker都是通过这个VIP去进行关联与信息交互。在网上,这个方案也相对比较成熟,具体的代码和配置都可以找到。

跨集群调度

背景介绍

 

第三部分,我们来介绍一下美图内部跨集群调度的实现。这是基于我们的业务特性去做的一个优化。我们内部有两套集群,其中一个为离线集群,主要就是跑一些统计报表,离线查询之类的任务,另一个是Presto集群。他们存在一个资源错峰状态,离线集群业务高峰是在凌晨的0点到9点,会将资源利用率持续打满。Presto本身是一个在线查询的集群,基本上凌晨没人使用,0点到9点是它的一个业务低谷,资源利用率接近0%。这样存在一个资源错峰。我们想把Presto在业务低谷的这部分资源利用上。

可能大家会有个疑问,传统的集群部署基本上都是从自己的HDFS去拉取数据。如果资源要互通的话,就需要去访问各个集群上的文件,才能做下一步的计算。

架构演进

 

美图在去年完成了一个上云的操作,在云上使用了存算分离的架构,实现了数据的统一存储。这样的好处是打破了传统架构的数据孤岛的问题,离线集群和Presto集群可以无差别的访问云上的存储,即离线集群可以访问到Presto集群上的数据,Presto上的数据也可以访问到离线集群的数据。基于这两点,我们就提出了一个跨集群调度的概念,去减轻离线集群的高峰负载,提升Presto集群凌晨业务低谷资源使用率。 

在上云初期,因为有数据孤岛,各自集群有各自的HDFS,数据没法互通。如图所示,这是上云初期架构示意图。在上层,是对应的大数据开放平台,做一些临时查询,和一些例行任务。在下一层,是自研的一个分布式调度系统,主要是做任务的一些日常调度。再下来,我们开发了一个检验层,做一些合法性的校验。任务合法性,是指这个任务所携带的参数和语法,是否合法等。在这里还做了统一的权限校验等数据安全的拦截。这些校验完成之后,才会转发给离线集群,通过Yarn去做资源调度,以及跟HDFS的交互。

转发策略

 

在实现跨区域调度之后,团队内部研发了一个智能内核。智能内核其实里面有三个比较核心的东西,一个是智能引擎,也就是和团队现在一起在做的事情。跨集群调度就是通过这个任务根据评估离线集群和Presto集群的一个业务集群负载,去转发到各自的集群,去分担各自的集群压力,或者说提升一个资源的利用率。这边也实现了一个算力互补的这么一个东西,当然最底层是通过我们的云基建,云上存储进行实现的。当然我们在评估这个转发,就是什么样的任务可以去转发到Presto上呢,我们也做了一些简单的转发策略,比如说转发量上,我们会根据Presto集群规模,去设置一些离线任务的转发率。

再就是转发的时间段,需要在指定的时间段内转发。因为业务低峰是0点到9点,那么在9点之后,分析师同学已经上班了,可以开始去做一些在线查询的一些操作。那不能影响他们的业务,所以我们需要规定一个转发时间段。还有一些任务的类型,需要判断历史任务的一些耗时,若耗时比较大的任务,就不适合做这个转发。

实施步骤

 

具体的实施步骤跟大家简单的看一下。

首先是Hive Server服务的搭建。在离线集群上,我们用了Hive on Spark。了解过Hive on Spark的同学呢,就知道他们其实是通过Hive Server进行任务接收的。我们在Presto集群内去搭建和部署自己的Yarn和Hive Server环境,主要是用于跨区域调度的任务、接受和执行等。再就是,因为Hive集群的这个任务要转发至Presto集群上运行,所以离线集群的配置也要和Presto集群做一些统一。

其次是用到的一些第三方包,还有一些补丁。在内部团队也做了比较多的代码重构。需要去将这些代码去Merge到Presto的集群上,做好补丁的统一,还有相关告警配置,队列资源计费统计。再就是一些服务开发,这个服务开发主要就是用于我们的专家系统,还有智能引擎的一些服务模块,最后就是灰度上线。

当前面的这些环境全部都做好之后,开始灰度,灰度覆盖率由小到大做任务的转发。可以看一下这个收益分析。离线集群的资源在夜间它的消耗降低了10%,因为集群间已经实现了算力互补,可以将离线集群的一部分机器去迁移至Presto集群上,那也相当于对Presto做一个扩容。这样Presto的集群性能也提高了19%。

展望未来

 

最后,我们对未来进行一个展望。在大数据场景下,根据任务属性的不同可以分为三类任务:大shuffle任务,中大型任务和小型任务。

  • 大shuffle任务数据量非常大,查询级别在数百亿,还有比如说做多维度的cube构建,或者grouping set类似这样的操作,比较适合Hive on Spark运行。因为Hive on Spark是基于磁盘进行计算,稳定性相对高。

  • 中大型任务的数据量相对比较大,SQL语句也比较复杂,比较适合Hive on Spark或者Spark SQL。在日常使用中,我们发现Spark on SQL的性能明显优于Hive on Spark。但是,对于在这部分中大型任务,团队内正在尝试使用Presto来解决时效性或者运行时间问题。

  • 小型任务的数据量比较小,SQL也比较简单,非常适合Presto去做。Presto对小型任务也有比较好的性能表现。

用一句话来总结:对于中大型任务和小型任务,会将原来的Hive on Spark或者Spark SQL的运行方式,逐步切换到Presto上,来达到性能提升的目的。

 

目前的架构也遇到了一些挑战:

  • 比如,在离线统计Hive集群上,有些UDF有一些语法兼容的问题,还有一些语义差异。

  • 比如某个任务,在离线集群上用了一个Hive UDF,在Presto上也要实现对应的UDF。现在这个完全是靠人力去开发对应的UDF。当然,后面也在想一些更好的方式,如何去快速的适配Hive上已有的UDF。 

  • 再就是一些语法上的兼容,比如说Hive语法在Presto上去跑,它不一定能兼容。那么我们会去采集线上所有的任务,去做一个提前的预编译,去找出语法上的一个兼容性问题,然后针对性的有选择的去做一些改造和兼容。为什么是有选择性呢?我们不一定会将线上所有任务都都扔到Presto上,只是有选择性把一些中小任务放Presto上执行。

  • 还有就是语义的差异,我们会用Hive和Presto两个引擎执行,然后对比结果,针对性的做一些改造的兼容。再就是转发策略,什么样的任务能够转发到Presto上呢?我们会分析它的一个SQL语句,包括一些语法树的分析,还有任务的输入输出,任务复杂度的一些分析。

  • 最后一点,是权限校验。我们会在客户端层做一个基于多引擎级别的统一权限校验。

问答环节

Q:是否考虑过使用Doris来对接Hive,性能相比Presto会快。

A:Doris暂时没有考虑,我们有在做ClickHouse。ClickHouse在我们内部慢慢做起来了之后,随着业务的接入,框架的相对比较成熟之后,也会考虑将ClickHouse接入到多引擎的这个架构里面。所以说Doris我们现在没有用。

Q:Presto在查询大数据性能和Hive on Mapreduce差的很多吗?可以对比一下吗?

A:Presto在查询中小型任务性能远远好于Hive on Mapreduce,但如果查询大任务的话就不一定了,因为Presto主要基于内存上的计算。在线上其实也发现,如果一个任务查询的时间周期比较长的话,拉取数据的量级也比较大,计算复杂度高。任务很可能会失败,甚至会拖垮整个集群。所以我们会在客户端做一定的拦截去保护,相当于一定的熔断机制,就不让这样的任务发到Presto集群内部。所以若一个非常大的查询的话,我还是比较建议将这样的任务去转发到Hive on MR或者说Hive on Spark这样的引擎上。中小型任务可以尝试在Presto引擎上执行。 

Q:更进一步了解智能引擎是如何工作的?

A:智能引擎一个核心的概念,就是会对历史的一些做一些分析,得到任务画像系统。当任务下一次任务再运行后,会根据这个画像系统里面的存储的一些任务metric信息,去指定给我们下层的最适合的引擎,就是相当于最适合的任务交给最适合的引擎执行。例如我们有MapReduce,Hive on Spark, Spark SQL引擎还有包括说后面会继续引入的Presto,那么什么样的任务适合什么样的引擎执行,这正是智能引擎做的事。

分享嘉宾:

 

本博客文章除特别声明,全部都是原创!
原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【Presto 在美图的实践】(https://www.iteblog.com/archives/10015.html)
喜欢 (1)

分享 (0)

相关文章:

Presto 在美图的实践

导读:本文的主题是Presto高性能引擎在美图的实践,首先将介绍美图在处理ad-hoc场景下为何选择Presto,其次我们如何通过外部组件对Presto高可用与稳定性的增强。然后介绍在美图业务中如何做到合理与高效的利用集群资源,最后如何利用…...

Molecule:使用Jetpack Compose构建StateFlow流

Molecule:使用Jetpack Compose构建StateFlow流 看下面的jetpack compose片段: Composable fun MessageCard(message: Message) {Column {Text(text message.author)Text(text message.body)} }这段代码最有趣的部分是它实际上是reactive。其反应性为 通过Composa…...

计算机组成原理(2.2)--系统总线

目录 一、总线结构 1.单总线结构 1.1单总线结构框图 ​编辑1.2单总线性能下降的原因 2.多总线结构 2.1双总线结构 2.2三总线结构 2.3四总线结构 ​编辑 二、总线结构举例 1. 传统微型机总线结构 2. VL-BUS局部总线结构 3. PCI 总线结构 4. 多层 PCI 总线结构 …...

如何使用dlinject将一个代码库实时注入到Linux进程中

关于dlinject dlinject是一款针对Linux进程安全的注入测试工具,在该工具的帮助下,广大研究人员可以在不使用ptrace的情况下,轻松向正在运行的Linux进程中注入一个共享代码库(比如说任意代码)。之所以开发该工具&#…...

Docker安装Cassandra数据库,在SpringBoot中连接Cassandra

简介 Apache Cassandra是一个高度可扩展的高性能分布式数据库,旨在处理许多商用服务器上的大量数据,提供高可用性而没有单点故障。它是NoSQL数据库的一种。首先让我们了解一下NoSQL数据库的作用。 NoSQL 数据库 NoSQL数据库(有时称为“Not …...

Linux常用命令总结(建议收藏)

Linux常用命令总结(建议收藏) 这里收集了一些常用命令以便需要时查看,欢迎作补充。(这里的提到操作都默认以CentOS系统为基础) 文件管理 目录操作 切换目录 cd 查看目录 ls -l 列出文件详细信息 或者直接ll-a 列出当前目录下所有文件及…...

【Java】P1 基础知识与碎碎念

Java 基础知识 碎碎念安装 Intellij IDEAJDK 与 JREJava 运行过程Java 系统配置Java 运行过程Java的三大分类前言 本节内容主要围绕Java基础内容,从Java的安装到helloworld,什么是JDK与什么是JRE,系统环境配置,不深入Java代码知识…...

Jackson CVE-2017-7525 反序列化漏洞

0x00 前言 Jackson 相对应fastjson来说利用方面要求更加苛刻,默认情况下无法进行利用。 同样本次的调用链也可以参考fastjson内容:Java代码审计——Fastjson TemplatesImpl调用链 相关原理,可以参考:Jackson 反序列化漏洞原理 …...

【2023】DevOps、SRE、运维开发面试宝典之Kubernetes相关面试题

文章目录 1、Kubernetes集群的特点?2、Kubernetes集群各节点的组件有那些?分别有什么作用?3、简述Kubernetes集群的工作原理4、什么是Pod资源5、Label标签的作用?6、Deployment控制器与Statfulset控制器的区别?7、Pod拉取镜像的三种策略?8、简述Pod的生命周期9、Pod的生命…...

【算法】PatchMatch立体匹配算法_原理解析

目录 前言 原理解析 1.倾斜支持窗口(Slanted Support Windows) 什么是视差平面? 为什么视差和像素坐标点之间的关系可以解释为平面方程? 视差平面的通用参数方程和点加法向量方程 什么是倾斜支持窗口? 2.基于倾…...

【同步工具类:CyclicBarrier】

同步工具类:CyclicBarrier介绍源码分析CyclicBarrier 基于ReetrantLock Condition实现。构造函数await() 函数业务场景方案一:代码实现测试截图方案二代码实现测试打印总结介绍 官方介绍: 一种同步辅助工具,允许一组线程都等待对方到达共同的障碍点。CyclicBarrie…...

Android 12.0 Settings 去掉打开开发者模式和USB调试模式的广播

1.概述 在12.0的系统产品rom定制化开发中,在系统Settings的开发者模式中,打开开发者模式和usb调试模式都会发出开发者模式改变广播和usb调试模式改变广播, 项目开发功能需要要求去掉这两个广播以免影响其他功能,所以就要看哪里发出广播来屏蔽掉就可以了,这样就可以去掉开发…...

OSI七层网络模型和TCP/IP四层网络模型的异同

文章目录前言一、什么是OSI?二、什么是TCP/IP四层模型?三、OSI七层网络模型和TCP/IP四层网络模型的关系:四、 OSI七层和TCP/IP的区别:前言 本节系统总结: 一、什么是OSI?二、什么是TCP/IP四层模型&#xf…...

接口测试必备技能 - 加密和签名

1、什么是加密以及解密? 加密:在网络上传输的原始数据(明文)经过加密后形成(密文)传输,防止被窃取。 解密:将加密还原成原始数据 2、加密方式分类? 对称式加密&#xf…...

JVM虚拟机概述(1)

1.JVM概述 1.1为什么要学习JVM 通过学习JVM ( java Virtual Machine )可以帮助我们理解java程序运行的过程,了解虚拟机中各种机制的实现原理。为后期写出优质的代码做好准备,为向更高的层次提升打好基础。 1.2虚拟机 虚拟机的本质就是在windows中&…...

学习.NET MAUI Blazor(七)、实现一个真正的ChatGPT聊天应用

今天在新闻上看到一条消息,OpenAI已经开放了ChatGPT的接口,也就是GPT-3.5,对比原来的GPT-3,增加了gpt-3.5-turbo、gpt-3.5-turbo-0301两个模型。 gpt-3.5-turbo:使用最新的GPT-3.5模型,并针对聊天进行了优…...

Django框架学习

文章目录Django框架项目开发1. 创建项目2. 项目目录结构3. 视图函数(view)4. 路由配置url5. HTTP请求6. HTTP响应 - 状态吗7. GET方式传参8. POST传递参数模板Templates1. 通过 loader 获取模板,通过HttpResponse进行响应2. 使用 render() 直接加载并响应…...

JavaSE21-集合1-set

文章目录一、集合概念二、set集合1、set集合的特点2、HashSet2.1 特点2.2 创建对象2.3 常用方法2.4 遍历2.4.1 foreach遍历2.4.2 使用迭代器遍历2.4.3 转换为数组遍历一、集合概念 集合就是用于存储多个数据的容器。相对于具有相同功能的数组来说,集合的长度可变会…...

Web版和客户端哪种SQL工具更好?ChatGPT有话要说

2023年年初公司发布了一款Web版SQL工具,短期内就赢得了众多用户的喜爱和下载。不过,也有SQL用户在评论区中提出自己的观点,认为Web版工具都不可靠,甚至看见Web版工具就劝返… … 工具Web化逐渐成为一种趋势,比如&…...

从客户端的角度来看移动端IM即时通讯的消息可靠性和送达机制

如何确保IM 不丢消息是个相对复杂的话题,从客户端发送数据到服务器,再从服务器抵达目标客户端,最终在 UI 成功展示,其间涉及的环节很多,这里只取其中一环「接收端如何确保消息不丢失」来探讨,粗略聊下我接触…...

2023年java春招面试题及答案

2023年java春招面试题1、下面有关jdbc statement的说法错误的是?2、下面有关JVM内存,说法错误的是?3、下面有关servlet service描述错误的是?4、下面有关servlet和cgi的描述,说法错误的是?5、下面有关SPRIN…...

Django学习——基础篇(上)

一、Django的安装 pip install djangopython目录下出现两个文件 djando-admin.exe django django-admin.exe django 二、创建项目 1.命令行(终端) 1.打开终端 winR 输入cmd 2.进入项目目录 3.执行命令创建项目 2.Pycharm 两种方法对比 1.命令行创…...

研报精选230302

目录 【个股230302华西证券_比亚迪】系列点评五十四:迪“王”需求向上 出口“海”阔天空【个股230302华西证券_华利集团】下游去库存背景下承压,毛利率保持稳健【个股230302开源证券_恒顺醋业】公司信息更新报告:四季度业绩承压,期…...

Unity心得

- 将结果与因子颠倒的函数Mathf.InverseLerp非常实用 - at 10 meters, you want volume 1 - at 20 meters, you want volume 0 - volume InvLerp( 20, 10, distance ) - 显示HideFlags为Hide类型的物体 Resources .FindObjectsOf…...

TryHackMe-Binex

Binex 枚举计算机并获取交互式 shell。利用 SUID 位文件,使用 GNU 调试器利用缓冲区溢出并通过 PATH 操作获得根访问权限。 端口扫描 循例 nmap SMB枚举 题目给了提示:Hint 1: RID range 1000-1003 Hint 2: The longest username has the unsecure pa…...

外贸人如何写出优秀的开发信?附详细思路

如何写出优秀的开发信?最近做出口生意的客户都在抱怨,开发信的回复率越来越低,其实原因有很多,有时候并非自己的能力实在很欠缺。原因总结如图:第一:市场不景气这个就是就属于客观因素了,这也许…...

python自学之《21天学通Python》(18)——第21章 案例2 Python搞定大数据

“大数据(Big Data)”这个术语最早期的引用可追溯到apache org的开源项目Nutch。当时,大数据用来描述为更新网络搜索索引需要同时进行批量处理或分析的大量数据集。随着谷歌MapReduce和GoogleFileSystem (GFS)的发布&a…...

面试问题【数据库】

数据库数据库的三范式是什么drop、delete、truncate 分别在什么场景之下使用char 和 varchar 的区别是什么数据库的乐观锁和悲观锁是什么SQL 约束有哪几种mysql 的内连接、左连接、右连接有什么区别MyIASM和Innodb两种引擎所使用的索引的数据结构是什么mysql 有关权限的表都有哪…...

Allegro如何输出钻孔表操作指导

Allegro如何输出钻孔表操作指导 用Allegro做PCB设计的时候,需要输出钻孔表格,用于生产加工,如下图 如何输出钻孔表,具体操作如下 点击Manufacture点击NC...

消息队列 面试题 整理

消息队列 为什么要使用消息队列? 异步解耦:关注的是通知而非处理。 流量削峰:将短时间内高并发的请求持久化,然后逐步处理,削平高峰期的请求。 日志收集: 事务最终一致性 系统间的消息通信方式&#xff…...

做旅游网站的好处/52种新颖的促销方式

所谓插入排序,就是检查第i个数字,若比它的左边的数字小,则进行交换,一直持续这个动作,直到它的左边的数字比它还要小,则停止。 #coding:utf-8def insertion_sort(nums): for i in range(1,len(nums)): …...

网站建设有哪些技术/百度推广公司电话

在移动端需要安全算法时,直接使用开源库可能不合适(开源库都比较大,也可以自己抽取需要的代码),本Demo是根据AES的原理来实现算法,采用ECB/PKCS5Padding,实现短小精悍!! 注意:本算法…...

做网站卖东西赚钱吗/上海百度关键词搜索推广服务

删除文件时排除特定文件删除当前目录下所有 *.txt文件,除了test.txtrm ls *.txt|egrep -v test.txt或者rm ls *.txt|awk {if($0 ! "test.txt") print $0}排除多个文件rm ls *.txt|egrep -v (test.txt|fff.txt|ppp.txt)---------------rm -f ls *.log.1|eg…...

北京网站建设app/国外域名注册平台

内容来源于悟空问答"如何看待程序员在火车站候车室写代码画面曝光?"作者:大学生编程指南原文可点击阅读全文前去围观。10月2日,有网友曝光了某程序员在火车站候车室写代码的画面,网友评价这是程序员的悲哀。大过节的,许…...

wordpress添加动态图标/搜索引擎营销的原理是什么

STL之deque容器1. deque容器基本概念2. deque容器实现原理3. deque常用API1. deque容器基本概念 vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作&#xff0c…...

标签管理wordpress/青岛seo服务

高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被…...