presto任务优化参数
presto引擎业内通常用它来做即席查询,它基于内存计算效率确实快,不过它自身的任务优化参数比较杂,不同类型的catalog能用的参数不完全一样,在官网上倒是可以看到相关资料,配置文件中写的见https://prestodb.io/docs/current/admin/properties.html#
,会话参数见https://prestodb.io/docs/current/admin/properties-session.html
,但是看官网配置文档有个要注意的问题,汇总文档里面的配置不全,而且也没有表明配置的版本信息,有些参数比如会话参数hash_partition_count
,源码里面有,查询任务也正常识别,但是在参数说明里面就是没有罗列,只在官网其他文档里提到,有的也可能是官方计划后续版本要删除,但是无论哪种情况对使用历史版本的场景都是个不友好的事,所以日常收集还是有必要的
在设置参数的时候,要注意对于presto来讲,它也是stage分隔任务的执行计划,并在不同的执行节点上,但是和spark这些基于mapreduce-shuffle引擎不一样的是,这些stage是并行的,不是顺序执行。因为presto它采用的是MPP架构,而不是MapReduce,数据交换的机制严格来讲不叫shuffle,而是Exchange
一个sql对于presto来将就是一个查询任务(query),在你提交查询任务时,你会发现会话参数对于presto讲也是一个查询任务,而不是像spark这些引擎一样包含在AM的配置里面,通俗的讲就是在这一个会话提交的生命周期内,更改了集群策略,只生效在一次连接中的任务而已。而一个查询任务不同阶段的执行计划(stage)中包含了多个最小执行单元任务(task),每个任务都有自己的最小调度单元(drivers),可以理解为是线程数,这点和spark这些引擎也不太一样,spark或者yarn是执行器executor或者container持有资源来跑任务,而presto没执行容器这个概念
在下列列出的参数中,并不是所有,只有我在工作中使用较多的,且截止0.272为止
,这些参数使用上都是没问题的,在往后的版本就需要你自己测一下了。除了这些presto还有很多使用权重不高的配置,比如在0.182版本开始,presto提供了任务执行时,用于聚合处理的最大内存,还有在0.254版本开始提供了显示的开启溢出配置,通过experimental.query-limit-spill-enabled配置
或者query_limit_spill_enabled会话属性
开启溢出能力,而之前的版本只有experimental.aggregation-operator-unspill-memory-limit配置
或者aggregation_operator_unspill_memory_limit会话属性
设置溢出策略,效果不明显,同时虽然可选的溢出策略有PER_TASK_MEMORY_THRESHOLD:默认值按照任务自身衡量任务是否溢出
、TOTAL_MEMORY_THRESHOLD:按照集群内存总和来衡量,使得使用内存最大的任务溢出
、NONE:不溢出
、在0.220左右还出现过一个LIMIT策略具体名字记不太清了,但是只存在了一段时间就被删掉了
,但是有资源组和集群级别的资源监控可以让任务触发到内存上限之后就可以歇菜了,一个会溢出数据的任务常常伴随着较大的不合理性。在0.256版本之后还可以单独控制去重操作是否允许溢出的experimental.distinct-aggregation-spill-enabled 配置属性
和distinct_aggregation_spill_enabled 会话属性
,以及排序操作是否允许溢出的experimental.order-by-aggregation-spill-enabled 配置属性
和order_by_aggregation_spill_enabled 会话属性
需要明白的是,这里罗列的参数除了几个特殊的,其他的主要是为了任务级别的优化,所以通常优先记录会话级别参数,但是一般情况下presto提供了对应的配置文件内容,你可以在开头的官网的会话参数链接里面找到对应的超链接
还要留意的是,所有presto配置的值类型需要明确,且单位完整。比如spark在配置一些字节大小单位的时候MB
可以简写为M
,但是在presto中就会报错,而且会话参数使用时,只要不是数字或者布尔类型的都要用双单引号包裹,而写在配置文件里面的就不需要
1、0.204版本开始,presto对hive的数据可以用覆盖写,其他值可以用append和error
set session <hive-catalog>.insert_existing_partitions_behavior = 'overwrite';
注意
从0.123版本开始,可以对hive数据执行insert 和 delete操作,但0.123版本下insert还不能控制覆盖和追加,delete操作也只能删除分区字段类型为字符串的分区表,直到0.126版本开始delete才可以删除非字符串的分区数据,这一点了解一下即可
2、0.191版本开始,添加了运行时生成文件大小的策略
set session scale_writers = true;
-- scale_writers = true时,文件大小超过writer_min_size的阈值才生产下一个文件
set session writer_min_size = '32MB';
3、在0.234版本中加入了writer扩展功能,通过上游stage任务的缓冲区使用情况,来自动调整数据落盘的并行度
set session optimized_scale_writer_producer_buffer = true;
4、从0.102版本开始,可以指定任务运行时写入执行器的并行度,需要注意的是这个配置和writer扩展功能是互斥的。对其他所有insert非分区表类型任务有明显效果,这个配置在0.102之前的版本中只能通过改配置文件的task.writer-count
实现,在设置时个人建议优先使用scale_writers和writer扩展功能
,如果你实在想用指定的方式,需要注意这个配置必须用偶数值
set session task_writer_count = 2
到了0.227版本才添加了针对写入分区表的执行器数量控制,不过可以统一使用task_writer_count
set session task_partitioned_writer_count = 2
5、presto执行任务过程中,任务按照执行计划,内部的具体task操作被分步在固定数量的节点上,这点和spark哪些一样
而从0.55版本开始,参与的执行节点数有多少,则由分区系数也就是query.initial-hash-partitions
影响。或者通俗讲presto在用哈希决定stage内的task要生成多少个时的常数因子,因子越大,生成的task越多,所需要的节点数也就越多,同样使用资源也就越多,当然这个是初始状态,后续执行presto会自己调整,可以理解为spark动态扩展资源类似的策略,presto会尽量让stage的task数靠近这个因子数
修改时通过更改etc/config.properties
文件,来修改默认的分区系数,0.55版本开始生效,默认8,2xx后新版本为100
query.initial-hash-partitions=8
注意
,最终生效的取值是在给定配置和集群可用节点数中取最小值,这是presto为了防止分区系数过大给集群造成不必要的风险,对于单个任务来讲,理想状态下,分区系数应当小于等于节点数,这样集群中所有的任务才能尽量的负载均衡。
从0.101版本开始,除了写在配置文件中的初始哈希分区系数之外,还可以通过会话来指定任务执行中的哈希分区
SET SESSION hash_partition_count=10
6、新版本废弃 presto提供了一个全局的列文件阅读器,在抽取hive数据时,提高读取性能,在0.6x版本提出了概念,随后在0.79(该版本时此功能是实验性的)和0.80版本推出,不过这个配置在后期版本推出不同特殊文件类型的处理优化就失效了,放在这里是为了让大家知道最开始presto是统一优化的
全局可用在hive的catalog文件
配置
hive.optimized-reader.enabled=true
或者任务会话级别
SET SESSION <hive-catalog>.optimized_reader_enabled = true;
7、presto多数应用在即席查询中的引擎,而不用来持久的运行大任务,但是在0.80版本开始支持内部添加了独立于其他配置的单独队列,可以用来跑大任务,但是在0.80版本中是实验性的
使用时需要在etc/config.properties
文件中配置如下内容
# 控制同时运行的“Big Query”数量
experimental.max-concurrent-big-queries=5# 控制等待队列中的“Big Query”数量
experimental.max-queued-big-queries=10# 设置“Big Query”的初始哈希分区数
experimental.big-query-initial-hash-partitions=100# 设置“Big Query”每个任务的最大内存
experimental.big-query-max-task-memory=4GB
随后在大任务的会话属性中携带标识
SET SESSION experimental_big_query = true;
presto最早的正式版本是0.8X,刚开始的时候是没有完整的集群资源管理组件的,所以对于大查询就临时搞了上面的配置。而在0.103版本,推出了一个全新的资源管理器,用来监控并统一管理集群资源,防止集群过载。0.109版本开始上面的大任务查询能力废弃,所有的相关配置也都被删掉了,所以上面的大查询配置更多的是一个了解,知道曾经有怎么个东西就行。
在未配置资源组时,presto可以直接使用这个全新的资源管理器,当然资源组提供了更细致的把控能力,只不过低版本的时候资源组能力不健全而已,到了0.153版本开始,presto才可以正常配置资源组。
改动它需要在在config.properties中操作
。注意
如果你用的是0.116以后的版本,这个内存管理器始终保持开启,没有启停开关
# 启用集群内存管理器,0.116以后这个配置没有了,内存管理器始终保持开启
experimental.cluster-memory-manager-enabled=true
0.116版本,为这个资源管理器新增了终止任务的能力,当集群接近内存上限时终止一个内存使用最多的任务释放内存资源,至于内存的上限是presto自己有判断逻辑。但是按照我的使用经验来讲,如果你用的版本能够直接配置资源组,那你正常使用资源组就行了,这个资源管理器它能够起到的作用微乎其微,甚至很多时候感觉不到它的存在,通常集群负载率高的时候,等不到终止任务策略的生效,任务节点上的task就挂了,总之在集群出问题之前触发的概率低到令人发指
# 启用低内存终止器
query.low-memory-killer.enabled=true# 终止器的生效前的延迟时间为 2 分钟
query.low-memory-killer.delay=2m
注意!!!!!!启用内存终止器在0.191版本之后的配置变了
query.low-memory-killer.enabled 《--这个弃用了query.low-memory-killer.policy 《--用这个了,并且可选的值有三个
none #不启用终止器
total-reservation #终止集群中内存使用最多的一个任务
total-reservation-on-blocked-nodes #终止在高压节点上任然调用大量内存的一个任务
8、如果你能保证所有的hive表分区字段是字符串类型,则0.90版本开始,可以在hive的catalog配置文件中使用有优化的读取策略,节省一些io的消耗。说白了就是presto会跳过分区字段类型的检查和规范读取,直接用字符串的方式识别。这个配置在0.90版本之前是没有提供的,就导致如果你的分区字段类型不是字符串,presto用优化策略读取会有忽略数据的可能,实际使用一般用false。
#默认 false 禁止用优化读取策略
hive.assume-canonical-partition-keys=true
9、presto默认使用编译后的字节码来识别sql,这能够保证高效的执行sql,但偶尔会发生表达式无法转换成字节码。于是0.90版本开始,提供了一个参数,发生无法转换字节码的时候,让presto用解析器识别sql,这种任务执行会慢很多,但是不会直接报错。直到0.195版本相应的问题被解决,这个配置也被删除了
在etc/config.properties
文件中配置如下内容,这个配置并没有提供对应的会话参数,本身是用于调试或测试集群的一个参数,使用0.195以后的版本限于了解就行
#false指始终不使用解析器,遇到问题直接报错
compiler.interpreter-enabled=true
10、从0.94版本开始,可以指定每个task任务最小可持有线程数,注意这个配置不能小于3,不然presto很容易出现资源锁
task.min-drivers=8
到了0.205版本开始,提供了一对新的配置,用来指定任务在有足够工作要做的情况下,并发线程数的最小最大数量,0.205+的版本建议用这个,因为上面的配置直接指定的话,不可能对所有任务都是有益的
#最小一般用 1 就行
task.min-drivers-per-task=1
task.max-drivers-per-task=16
11、从0.100版本开始,在presto的配置文件中,可以控制单个执行节点可持有的最大线程数,合理的设置可以保证任务的稳定,在之前的版本中使用的是task.shard.max-threads
在etc/config.properties
中修改如下配置,它的默认值是所在节点的CPU数*2
,可以执行一个常数,或者使用1.5C
这种表达式,指核数的1.5倍,presto解析时会四舍五入取整数
task.max-worker-threads=64
12、在spark中处理orc数据有强制解析的能力,而presto在0.137开始也支持了一样的能力,达到用具体列名字在文件中找列数据的能力,需要你在hive的catalog文件中启用。
不过,orc和presto的这个能力,通常是用来弥补presto虽然完全使用hive的元数据,但是受到hive修改表元数据或分区元数据时,是否级联或是否使用了replace,而导致的分区字段顺序和表元数据顺序不一致的问题,因为hive自身在不一致的情况下是参考表级别元数据的字段顺序在分区级别元数据对应的列中取一个,错了就错了,当然这主要是因为hive新增或者修改字段元数据是不改变已有字段顺序的,除非用户手动用replace语句修改。因此如果你可以保证顺序不变,就不要用这个配置
hive.orc.use-column-names=true
13、从0.101版本开始,hive的Parquet文件数据使用按顺序读取的方式,如果需要按字段直接访问,也就是和orc强制解析一样的能力,需要在hive的catalog文件中启用
hive.parquet.use-column-names=true
14、从0.101版本开始,考虑到hive数据由于spark这些第三方引擎处理时会有目录,添加了递归目录的支持,在hive的catalog配置文件中启用即可,但是这个能力谨慎使用,因为不是所有的目录都是有效数据,可能只是任务失败没有删除,尤其是spark处理过的数据
hive.recursive-directories=true
15、在0.103版本中,加入了中间结果聚合时的多线程控制,提高聚合效率,因为之前版本都是单线程
SET SESSION task_default_concurrency
SET SESSION task_join_concurrency
SET SESSION task_hash_build_concurrency
SET SESSION task_aggregation_concurrency
0.147版本开始,presto用一个统一的参考值来自动决定上面的4个配置,提供的新会话参数为
SET SESSION task_concurrency=16
或者在config文件中配置
task.concurrency=16
16、presto在读取hive数据时,可以控制拆分数据块的大小,需要在hive的catalog文件中配置
#对于非特殊格式,可以通用下面的4项
hive.max-split-size:控制Hive表拆分的最大大小。增加此值可以减少拆分数量,从而减少查询开销。hive.max-initial-split-size:控制初始拆分的最大大小。增加此值可以加快查询启动速度。hive.max-outstanding-splits:控制同时处理的最大拆分数量。增加此值可以提高并行度,但也会增加内存使用量。hive.max-split-iterator-threads:控制用于生成拆分的线程数。增加此值可以加快拆分生成速度。#orc这个类型配置是单独的
hive.orc.max-buffer-size:控制ORC文件读取器的最大缓冲区大小。增加此值可以提高读取性能,但也会增加内存使用量。hive.orc.stream-buffer-size:控制ORC文件读取器的流缓冲区大小。增加此值可以提高读取性能,但也会增加内存使用量。hive.orc.max-read-block-size:控制ORC文件读取器的最大块大小。增加此值可以提高读取性能,但也会增加内存使用量。#常用的文件存储类型还有一个Parquet,在presto中提供了一个单独的读取器,下一条单独说
presto在0.272版本中,加入了对hive数据拆分能力的启停配置
SET SESSION file_splittable=true或者写在hive的catalog文件中
hive.file-splittable=true
17、在0.138版本开始,presot对对于hive的Parquet数据新增了一个阅读器,提供了更好的读取能力,注意
这个配置在0.213版本删掉了,并不是这个新的阅读器有什么问题,而是删除了旧的读取器,直接使用这个新的了
SET SESSION <hive-catalog>.parquet_optimized_reader_enabled=true
或者写在hive的catalog文件中
hive.parquet-optimized-reader.enabled=true
到了0.227版本,添加了读取parquet数据块最大值的限制
SET SESSION parquet_max_read_block_size='16MB'或者写在hive-catalog中
hive.parquet.max-read-block-size=16MB
到了0.138版本开始,presto对hive的Parquet数据提供了predicate push down
能力,直译过来叫谓词下推,其实就是将可行的过滤条件下放到抽取文件这一层,而不是文件加载到内存中之后跑任务的时候过滤,来减少计算过程中的数据IO消耗。注意
这个能力在0.213版本开始始终启用,对应的配置也不允许配置更改了
0.213版本之前可以使用会话属性开启
SET SESSION <hive-catalog>.parquet_predicate_pushdown_enabled=true
或者写在hive的catalog中
hive.parquet-predicate-pushdown.enabled=true
18、0.153版本开始,对于hive数据的orc也有了predicate push down
能力,通过会话属性开启
SET SESSION orc_bloom_filters_enabled=true
或者写在hive的catalog文件中
hive.orc.bloom-filters.enabled=true
19、0.107版本开始添加了会话级别的任务可用最大内存,但是不能超过配置文件中的限制,因此用的不多
SET SESSION query_max_memory
20、0.109版本,支持数据落盘前重新进行哈希分区,也就是写如的分区下的文件尽量平衡,避免数据倾斜,通过修改etc/config.properties
可以起停
redistribute-writes=true
或者写会话参数也行
SET SESSION redistribute_writes=true
需要知道的是,在0.232版本添加过一个没有太大实际意义,如重新分区可行,则强制分区的会话参数,主要是用来解决数据写入时发生了跨分区问题,开启后会严格按照分区写入数据,但是一般不会出现分区错乱问题,我本人在工作中没有使用过,只是官方文档中有提到这个配置,在后期的版本中已经删除
SET SESSION use_exact_partitioning=true
21、0.112版本加入了对hive的orc数据读取时的域压缩,就是指针对or或者in语句,元祖域在多少范围内不压缩,个人理解就是你写的条件查多少个之内,presto不对把单个的扫描,优化为扫描一个范围后在单独找,配置时需要在hive的catalog文件中操作
hive.domain-compaction-threshold=20
22、0.202版本中加入了,读取hive-orc数据时视为小条带的阈值,这使得presto决定是否一次读取多个条带,来提升读取性能
hive.orc.tiny-stripe-threshold=20MB
或者
SET SESSION orc_tiny_stripe_threshold=20MB
23、从0.112版本开始,不要直接用presto对hive执行create table
语句,因为这个版本开始直接create hive表在元数据上会不完整,导致hive表无法访问,注意create table as
不受影响
24、从0.116版本开始,可以对查询指定最大的执行时间,注意
这个配置和资源组的最大执行时间限制是互斥的,资源组优先级高
在config.properties中全局配置
# 设置查询的最大运行时间为 1 小时
query.max-run-time=1h
或者使用会话配置
SET SESSION query_max_run_time = '30m';
25、从0.116版本开始,presto内部默认对哈希的使用做优化来减少生成开销,并且了优化join时的操作,可以在config文件中启停它们。
# 启用哈希生成策略的优化
optimizer.optimize-hash-generation=true# true 讲join涉及的数据分布给多节点并行处理,false 将小表广播
distributed-joins-enabled=true
或者用会话参数
SET SESSION optimize_hash_generation=true
SET SESSION distributed_joins=true
注意
0.123版本之前不要关闭哈希优化,查询会由于哈希生成的一个bug失败。在0.139版本之前不要启用join数据分布执行优化,会有失败的情况
0.207版本开始,presto对于join优化提出了新的优化配置,并且不再推荐直接使用上面的distributed-joins-enabled
配置项,新的配置项如下
新的会话属性:join_distribution_type
新的配置属性:join-distribution-type
新的配置项有三个可选值,但是为了简化开发,presto任然允许你携带旧参数,会自动转化为对应的配置值
PARTITIONED:等价于distributed_joins=true,按照join条件字段分区后多节点并行
BROADCAST:等价于distributed_joins=false,将小表广播出去
AUTOMATIC:根据执行计划,自动选择 PARTITIONED 或者 BROADCAST
在0.238版本开始,对于小表的广播presto可以限制可用资源的内存大小
SET SESSION query_max_broadcast_memory='1GB'query.max-broadcast-memory=1GB
在0.289开始,提供了一种智能广播策略,presto会自己决定join时哪些数据可以广播,不需要你在额外的手动配置
SET SESSION confidence_based_broadcast=true或者写在config文件中
optimizer.confidence-based-broadcast=true
26、0.241版本开始,presto通过添加动态过滤和桶修剪支持,提高广播或串联的查询性能,需要时在config文件中配置
experimental.enable-dynamic-filtering=true或者使用会话参数
SET SESSION enable_dynamic_filtering=true
27、0.191版本开始,如果你的任务所抽取的数据,在分布式join中的分布依据相同,比如hive表的分区键值相同,则可以使得Presto 尝试利用表数据的分布信息,将 Join 操作的数据分发到相同的 Worker 节点上执行,从而减少数据移动和网络传输,提升查询性能,个人建议0.197以后的版本再考虑用这个参数
SET SESSION colocated_join=true
SET SESSION concurrent_lifespans_per_task=1
在0.205之前要用colocated_join,就必须同时携带concurrent_lifespans_per_task,但是在之后的版本中,concurrent-lifespans-per-task
默认值是1,它是指一个task中可以并行处理几个presto对文件生命周期的抽象计划,通俗的理解为同时对几个数据块跑数
28、0.177版本开始,提供了一些join性能和聚合性能的优化,可以通过会话属性打开
SET SESSION push_aggregation_through_join=true
SET SESSION push_partial_aggregation_through_join=true
29、从0.124版本开始,presto实验行的支持了MR和Spark类似的中间聚合,来减少大内存任务数据交换量
SET SESSION task_intermediate_aggregation=true
或者在配置文件中全局配置
optimizer.use-intermediate-aggregations=true
在0.147版本这个实验性质的能力删掉了。提供了全面的磁盘数据交换能力,从使用上来讲,截止本文书写时间2025-03月,要求存在一个用来做数据交换的hive-catalog,在将来可能会支持其他的,使用上只需要携带下面的会话参数即可
#控制数据磁盘交换的行为,可选值:NONE(禁止)、ALL(对所有的数据交换做物理交换)、AUTOMATIC(自适应,但是一般不用)
SET SESSION exchange_materialization_strategy='ALL';#这里是你的hive-catalog
SET SESSION partitioning_provider_catalog='hive';#当你开启了数据磁盘交换,hash_partition_count就不再和集群节点取最小值,而是跟随你的设置来,并且官方建议设置为presto节点数的5-10倍
SET SESSION hash_partition_count = 4096;
0.222版本开始,物理数据交换,可以指定任务计划的并行度,适当的提升即可
max-concurrent-materializations=10SET SESSION max_concurrent_materializations=10
30、从0.126版本开始,可以使得所有task之间共享数据的索引,说白了就是缓存了元数据信息,比如hive的数据存储路径这种,这在查询速度的优化上起到关键作用
在config文件中配置
task.share-index-loading=true
或者会话属性
SET SESSION task_share_index_loading=true
31、0.126版本加入了一个特殊的配置hive.immutable-partitions
,默认值是false
,可以将hive的分区数据视为不变的,使得presto缓存数据表分区元数据,包括列、文件大小、类型等等,好处是下一次读取不需要在元数据识别上额外开销,坏处是会影响更新后数据的读取,不过不是每次都影响,是个偶发的时间
可以在hive的catalog中配置
hive.immutable-partitions=true
到了0.235版本,presto支持直接指定缓存哪些表的元数据信息于文件中
# *代表缓存所有表,多个表用逗号隔开
hive.file-status-cache-tables=*#缓存的实效时间
hive.file-status-cache-expire-time=1d
如果你要使用这个配置,遇到元数据没更新的相关问题,可以调用presto的储存过程,这个存储过程调用前提,必须是连接presto后指定了默认的catalog为hive,比如./prestocli --server node3:8881 --catalog hive
,在sql中写catalog不生效
# 同步元数据到缓存中,FULL 是同步模式,不用改
CALL system.sync_partition_metadata(schema_name => 'default',table_name => 'a',mode => 'FULL'
);
32、在0.129版本开始,presto尝试支持了hive的retention_days表属性,但是然并卵,因为它照常调用hive内部的支持,但hive自身表失效时间是一个没有使用的功能,所以在0.137的时候presto又把这个参数给删掉了,这一点了解就行
33、在0.130版本开始,presto对于过滤执行、列存储数据、可用的字典编码、列映射上提供了查询性能的改进
可以在config文件中修改
optimizer.columnar-processing-dictionary=true
也可以用会话参数
SET SESSION columnar_processing_dictionary=true
0.149版本以后这个配置被重置为optimizer.processing-optimization
配置,或者使用processing_optimization
会话属性,可选配置值为disabled
、 columnar
、columnar_dictionary
,而0.174版本开始这些配置就都被删掉了,除了字典编码优化之外,其他的都不再使用了,所以如果你使用的是130-173的版本,可以用一用这个参数
而字典编码优化能力被单独保留了下来,你可以通过dictionary_aggregation
会话参数开启,这里的字典编码指的是presto会自己判断,在合适的实际将数据组成类似于我们数据处理中常用的代码值那样的字典数据,来优化执行效率
SET SESSION dictionary_aggregation=true或者写在config文件中
optimizer.dictionary-aggregation=true
34、在0.132版本开始,presto添加了一个参数,可以让集群在内存不足的时候情况下,任然调度任务,但是集群负载高的时候容易触发OOM,以及增加集群风险
SET SESSION resource_overcommit=true
35、0.138版本开始,可以控制任务执行初始状态下每个节点负责的数据分片数量,以及任务执行过程中自动调整的时间间隔
写在config文件中
task.initial-splits-per-node=32
task.split-concurrency-adjustment-interval=100ms
或者使用会话参数
SET SESSION initial_splits_per_node=32
SET SESSION split_concurrency_adjustment_interval='100ms'
36、0.142版本开始,presto跑任务提供了读取元数据上的优化,来提高效率,但是个人不建议用,因为如果操作的数据是空的,比如只有hive数据的物理路径被删除了,这个配置可能影响任务结果,而且在0.279版本修复了使用这个参数,对分区列聚合以及行字段元数据读取上的bug,bug导致查询结果错误,总之不建议轻易使用,知道有这么个配置当作逼不得已用的一个参数就行,用也在0.279之后用
SET SESSION optimize_metadata_queries=true
36、0.142版本开始,presto写hive数据会使用压缩,默认是gzip,可以在hive的catalog中更改
hive.compression-codec=GZIP
注意,0.220版本后,可以通过会话属性compression_codec
指定,可选择NONE、SNAPPY和GZIP
37、0.143版本开始,添加了对查询可用最大cputime的限制,需要在config中设置,不过一般会商用场景下会使用资源组限制查询时间
query.max-cpu-time=1h
38、0.147版本开始,presto支持对有长度字符串数据源控制,比如mysql这种关系数据库的varchar类型,你可用通过varchar(n)
来实现
0.153版本开始,支持了real类型来操作hive的float单精度浮点数,并支持了char(x)
,和上面的varchar(n)
一样
39、0.156版本开始,presto针对聚合项很多的任务提供了一种优化,底层执行会尝试将多个共性的任务合并成一个统一的执行计划,但是个人建议不要在0.200版本之前用它,因为早先用170左右的版本时,当聚合数据的预期结果是0,发现实际结果可能会是错误的NULL
,而不是预期的0
,后面使用0.272的时候没有发现这个bug问题复现
SET SESSION optimize_mixed_distinct_aggregations=true
或者写在config文件中
optimizer.optimize-mixed-distinct-aggregations=true
到了0.281版本,presto对同节点上的多个相似聚合也提供了合并优化的能力
SET SESSION merge_duplicate_aggregations=true
40、0.159版本开始,presto可以在hive的catalog文件中限制任务最大扫描的分区数
hive.max-partitions-per-scan=100000
41、0.165版本开始,presto支持数据处理过程中,不同节点交换数据是否压缩,这里的交换指的就是最开头说的MPP架构中的exchange,可以在config文件中配置
exchange.compression-enabled=true
42、0.175版本开始,presto支持了非分组shuffer时的中间聚合
SET SESSION enable_intermediate_aggregations=true
51、0.188版本开始,presto提供了对gc的优化,在任务执行中陆续压缩处理中间数据,而不是到了一个临界点一次性压缩,这个优化能力需要在config文件中配置
pages-index.eager-compaction-enabled=true
43、0.190版本开始,对于十进制的数字,可以选择让presto用double类型处理,而不是DECIMAL,所以当你的任务中浮点数允许舍去精度的话可以考虑采用,这个是生效在拉数据阶段,所以开启后cast成decimal(x, y)
虽然也可以,但是要分实际使用情况而定
在config文件中全局配置
parse-decimal-literals-as-double=true
或者使用会话级别参数
# true是可以解析成double
SET SESSION parse_decimal_literals_as_double = true;
44、0.190版本开始,对于hive数据,可以限制等待处理数据切片的总大小,使得集群稳定行更强,当拉取的数据切片到达了上限后会暂停拉取,直到已拉取的数据切片处理完成,这依赖于presto主节点对hive元数据的处理,如果设置不合理那么在任务的耗时和成功率上可能会有一些影响
在hive的catalog中配置
hive.max-outstanding-splits-size=512MB
45、0.198版本开始,可以限制任务节点上不同task之间的本地数据交换缓冲区大小
task.max-local-exchange-buffer-size=32MB
46、0.198版本开始,presto对去重关键字提供了一种实验性的优化,用来解决高基数场景
optimizer.use-mark-distinct=true
或者
SET SESSION use_mark_distinct=true
在0.234版本之后,去掉了实现性质,并支持强制mark-distinct去重策略
SET SESSION use_stream_exchange_for_mark_distinct=true或者写在配置中
query.use-streaming-exchange-for-mark-distinct=true
47、0.208版本中加入了任务stage数量的限制,一般单任务可承受12T抽取数据-4T任务内存
的生产集群,通常在200-250之间,通过config文件修改
query.max-stage-count=100
或者会话属性,注意不要轻易改会话属性,因为它可以超过配置文件中的限制
SET SESSION query_max_stage_count=100
在0.217版本中加入了一个配套使用的config配置,当stage到达指定阈值后,会抛出一个TOO_MANY_STAGES
警告
query.stage-count-warning-threshold=50
在0.221版本中加入了一个stage中task的上限,这个和最上面的哈希分区基数是互斥的
stage.max-tasks-per-stage=20SET SESSION max_tasks_per_stage=20
48、0.207版本开始,presto对join的连接计划提供了一种优化手段
SET SESSION join_reordering_strategy
或者配置文件中写死
optimizer.join-reordering-strategy
可选的值有三种
NONE:不对任务的join计划做任何变动
ELIMINATE_CROSS_JOINS:会优化掉不必要的连接,比如重复的交叉连接
AUTOMATIC:根具给定的条件自动整理并执行最优解
在0.207版本之前,没有AUTOMATIC
策略,用的是reorder_joins会话属性 或者 reorder-joins配置
来控制优化方法,为了简化变更难度,和分布式join优化配置项一样,presto没有物理删除这两个旧的配置,当reorder_joins=true相当于ELIMINATE_CROSS_JOINS,false相当于NONE
需要注意的是,如果你使用了AUTOMATIC
,则必须限制自动优化join条件时,可以考虑的组合次数,这个配置写在文件中,不允许会话参数修改
。因为presto的优化值得是尝试出执行计划的最优解,当有n张表连接的时候,presto将尝试n次幂的组合对,所有如果你不限制最大的对数那就废了
optimizer.max-reordered-joins=5
49、0.215版本开始,presto添加了对执行计划的动态调整,优先大数据分组的处理,并缓解资源争抢导致的节点高压,在0.239版本开始这个能力默认开启,并且0.243版本中删除了启停的配置项
这里要说一个容易混淆的点,这里提到的分组(grouped_execution),指的是presto的MPP架构下Exchange执行时,对所有数据操作分布到多个节点并行处理的一种优化手段,比如sum时多个节点一起执行最后聚合结果,而不是group by这种sql中的分组,分布式join处理也可以互补
SET SESSION dynamic_schedule_for_grouped_execution=true或者config文件中全局设置
dynamic-schedule-for-grouped-execution=true
50、0.239版本开始,默认对发生聚合和连接操作的任务,使用分组聚合优化
SET SESSION grouped_execution_for_aggregation=true
SET SESSION grouped_execution_for_join=true或者config文件中全局设置
grouped-execution-for-aggregation-enabled=true
grouped-execution-for-join-enabled=true
但是到了0.243版本,presto把上面的配置统一到了一个中,上面的配置被废弃了
grouped-execution-enabled=trueSET SESSION grouped_execution=true
51、0.222版本开始,对没有聚合、连接等操作的任务也支持grouped分组聚合执行,比如普通的select这种,但是这是个实现性的功能,在0.239版本删掉了
SET SESSION grouped_execution_for_eligible_table_scans=trueexperimental.grouped-execution-for-eligible-table-scans-enabled=true
0.224版本开始,和上面发生聚合与连接的任务一样,也可以控制生成的虚拟桶数来提高执行效率,不过只有会话参数
SET SESSION hive.virtual_bucket_count=50
52、到了0.234版本中加入了通过数据上游缓冲区的利用率,来自动调整写入执行器写入性能的能力
SET SESSION optimized_scale_writer_producer_buffer=true也可以写在config文件中
optimized-scale-writer-producer-buffer=true
53、0.234版开始,可以指定集群中在运行的任务数到达多少之后就不再调度新的任务了,从而提升集群的稳定性,但是很少用,通常都是通过资源组来完成这个限制,如果和资源组共用,会交叉影响
experimental.max-total-running-task-count-to-not-execute-new-query=100
54、到了0.238版本,对于连接查询中的空条件,presto做出了优化处理,来降低空连接的资源消耗,在config配置中开启。不过在0.250左右不再允许配置了,presto默认会优化
optimize-nulls-in-joins=true
55、0.239版本开始,对于重复的查询条件presto只会执行一次,如果有影响可以使用会话参数关闭
SET SESSION optimize_common_sub_expressions=false
56、0.240版本开始,对于嵌套数据,比如hive的复杂类型,可以尝试直接读取精确的键值,而不是读取整个字段的数据
SET SESSION pushdown_dereference_enabled=true或者在config文件中写死
experimental.pushdown-dereference-enabled=true
57、0.248版本开始,可以关闭presto处理hive数据时,为空数据对象创建空文件的行为,来提高处理效率,比如空桶等,在hive的catalog文件中配置
hive.create-empty-bucket-files-for-temporary-table=false
58、0.251版本开始,presto提供了一种保障策略,当任务节点出现异常,会把异常消息记录并对其他任务做出一定的调控
# 启停开关
internal-communication.memoize-dead-nodes-enabled=true
59、0.252版本开始,presto提供了对任务的自动重试配置,在config文件中设置非0值即启用
per-query-retry-limit=2
60、如果你的hive元数据服务配置了多个实例,对于presot来讲默认是高可用的访问方式,大白话就是顺序访问,直到成功连接。但是在0.253版本开始,可以选择让presto以负载均衡的方式访问这些元数据服务实例,只需在hive的catalog中添加一个配置
hive.metastore.load-balancing-enabled=true
61、presto在0.257版本开始支持了offset子句,需要通过配置打开能力支持
SET SESSION offset_clause_enabled=true或者写在config文件中
offset-clause-enabled=true
62、presto在0.270开始,如果去重操作的基数在一个固定的上限以内,presto提供了底层执行对哈希优化的算法
SET SESSION hash_based_distinct_limit_enabled=true或者写在config文件中
hash-based-distinct-limit-enabled=true
而这个上限,通过配置调整,默认是10000
SET SESSION hash_based_distinct_limit_threshold=10000hash-based-distinct-limit-threshold=10000
注意这个能力在0.279被删掉了,被融合在了SET SESSION quick_distinct_limit_enabled=true
中,用来优化DISTINCT 和 LIMIT
共存的语句
63、presto在0.272开始,presto加入了流聚合提高处理性能,说大白话就是减少中间结果的生成开销,不一次加载所有数据,而是如flink流计算那样,从0到1的逐渐加载数据并计算
但是有个限制!!流聚合只能生效在分组字段和排序字段相同的场景下
SET SESSION streaming_for_partial_aggregation_enabled=true写在config中
streaming-for-partial-aggregation-enabled=true
不过有个要注意的情况!!按照官网的说法,如果对hive数据开启流聚合,presto提供了单独的流聚合支持,可以在分组键是排序键子集的情况下也能用流聚合,但是在具体使用的时候发现这个参数不支持,即使退出了版本到0.272
SET SESSION streaming_aggregation_enabled=true写在hive的catalog中
hive.streaming-aggregation-enabled=true
不过在0.273版本中hive流聚合的配置被改成了新的
SET SESSION order_based_execution_enabled=truehive.order-based-execution-enabled=true
64、presto在0.272开始加入了自适应调度模式
SET SESSION execution_policy可选值:
all-at-once 默认值,一次调度所有stage阶段,保持并行执行任务
phased 需要配合 `max_stage_count_for_eager_scheduling`会话设置一个阈值,在stage数量到达这个阈值之上时,从上游到下游顺序调度stage,如果在阈值之下则采用默认的模式SET SESSION max_stage_count_for_eager_scheduling
65、presto在0.274版本开始,对查询有约束的表数据提供了优化性能,比如mysql的主键、非空、唯一等等这种表约束
SET SESSION exploit_constraints=true或者写在config文件中
optimizer.exploit-constraints=true
66、presto在0.274版本开始,如果你的sql逻辑中排序字段是分组字段的子集,则可以开启presto的执行优化,可以减少内存使用提高聚合性能
SET SESSION segmented_aggregation_enabled=true或者写在config中
optimizer.segmented-aggregation-enabled=true
67、presto在0.274版本开始,处理hive数据时,如果排序字段是分组字段的子集,presto提供了分段聚合的能力,个人理解类似于hive的conbiner
SET SESSION order_based_execution_enabled=true或者写在hive的catalog中
hive.order-based-execution-enabled=true
68、presto在0.281版本开始,如果你的sql中聚合操作有多个类似的过滤子句,就比如使用count(1) filter(where 条件)
求多个情况下的count数,这种语句presto提供了合并执行计划的能力,可以通过会话参数打开
SET SESSION merge_aggs_with_and_without_filter=true
69、从0.291版本开始,如果你的任务对于集群来讲相当小,比如任务节点都是单台上TB内存的机器,这个时候你任务处理的数据量不到100G,这种情况,你可以通过配置让这个任务只在单节点上执行
SET SESSION single_node_execution_enabled=true或者写在config文件里
single-node-execution-enabled=true
70、如果你的sql在写入语句中使用了UNION ALL
,注意UNION
不在考虑范围内,此时你可以让presto并行写入不同的select集合,着可以提高写入效率,并降低集群内存资源负载。这个参数的版本信息并没有找到,不过0.260以后是明确可以正常使用的,之前的版本需要自己试一下
SET SESSION push_table_write_through_union=true或者写在config文件中
optimizer.push-table-write-through-union=true
71、在0.289版本开始,presto提供了一种将低估值任务因素直接视为未知的策略,防止presto做出过度优化的执行计划,甚至过度到影响任务效率
SET SESSION treat-low-confidence-zero-estimation-as-unknown=true或者写在config文件中
optimizer.treat-low-confidence-zero-estimation-as-unknown=true
72、在0.289版本开始,presto可以根据HBO的结果来重试查询任务,并自适应执行计划。HBO说白了就是presto对往期执行计划的消息收集与判断,具体信息可以看官网的资料-》https://prestodb.io/docs/current/optimizer/history-based-optimization.html#configuration-properties
SET SESSION retry-query-with-history-based-optimization=true或者写在config中
optimizer.retry-query-with-history-based-optimization=true
73、在0.290+的版本,一批次提交多个查询时,可以让presto缓冲处理表和列的元数据信息
SET SESSION useJdbcMetadataCache=true
相关文章:
presto任务优化参数
presto引擎业内通常用它来做即席查询,它基于内存计算效率确实快,不过它自身的任务优化参数比较杂,不同类型的catalog能用的参数不完全一样,在官网上倒是可以看到相关资料,配置文件中写的见https://prestodb.io/docs/cu…...
uniapp + Axios + 小程序封装网络请求
前言 小程序自带的网络请求使用起来比较麻烦,不便于管理,就需要封装网络请求,减少繁琐步骤,封装最终效果,根据类别将网络请求封装在文件中,使用得时候调用文件名名称加文件中得自定义名称,就可…...
《网络管理》实践环节01:OpenEuler22.03sp4安装zabbix6.2
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 1 环境 openEuler 22.03 LTSsp4PHP 8.0Apache 2Mysql 8.0zabbix6.2.4 表1-1 Zabbix网络规划(用你们自己的特征网段规划) 主机名 IP 功能 备注 zbx6svr 19…...
4.6js面向对象
js原型继承 JavaScript 的原型链继承是其核心特性之一,理解原型链对于掌握 JavaScript 的面向对象编程至关重要。 1. 原型(Prototype)基础 在 JavaScript 中,每个对象都有一个内部属性 [[Prototype]](可以通过 __p…...
【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft Fabric 服务器搭建,Fabric 模组详细搭建教程
【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft Fabric 服务器搭建,Fabric 模组详细搭建教程 一、 服务器介绍二、安装 JDK 21三、搭建 Minecraft 服务端四、本地测试连接五、如何添加模组(mods)六、添加服务,并设置开…...
SQL SELECT DISTINCT 语句详解:精准去重的艺术
SQL SELECT DISTINCT 语句详解:精准去重的艺术 一、为什么需要数据去重? 在日常数据库操作中,我们经常会遇到这样的场景:查询客户表时发现重复的邮箱地址,统计销售数据时出现冗余的订单记录,分析用户行为…...
从ChatGPT到AutoGPT——AI Agent的范式迁移
一、AI Agent的范式迁移 1. ChatGPT的局限性与Agent化需求 单轮对话的“工具属性” vs. 多轮复杂任务的“自主性” ChatGPT 作为强大的生成式AI,虽然能够进行连贯对话,但本质上仍然是“工具型”AI,依赖用户提供明确的指令,而无法自主规划和执行任务。 人类介入成本过高:提…...
SQL EXISTS 与 NOT EXISTS 运算符
EXISTS 和 NOT EXISTS 是 SQL 中的逻辑运算符,用于检查子查询是否返回任何行。它们通常用在 WHERE 子句中,与子查询一起使用。 EXISTS 运算符 EXISTS 运算符用于检查子查询是否返回至少一行数据。如果子查询返回任何行,EXISTS 返回 TRUE&…...
AGI 的概念、意义与未来展望
随着人工智能技术的飞速发展,我们已经见证了在图像识别、自然语言处理等特定领域取得的巨大突破。然而,这些成就都属于弱人工智能(Narrow AI)的范畴,它们只能在预设的任务范围内高效工作。 人们对于一种拥有更广泛、更…...
基于Java与Go的下一代DDoS防御体系构建实战
引言:混合云时代的攻防对抗新格局 2024年某金融平台遭遇峰值2.3Tbps的IPv6混合攻击,传统WAF方案在新型AI驱动攻击面前全面失效。本文将以Java与Go为技术栈,揭示如何构建具备智能决策能力的防御系统。 一、攻击防御技术矩阵重构 1.1 混合攻击特征识别 攻击类型Java检测方案…...
FPGA调试笔记
XILINX SSTL属性电平报错 错误如下: [DRC BIVRU-1] Bank IO standard Vref utilization: Bank 33 contains ports that use a reference voltage. In order to use such standards in a bank that is not configured to use INTERNAL_VREF, the banks VREF pin mu…...
Axure项目实战:智慧城市APP(七)我的、消息(显示与隐藏交互)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:智慧城市APP 主要内容:我的、消息、活动模块页面 应用场景:消息页设计、我的页面设计以及活动页面设计 案例展示ÿ…...
深度学习——图像余弦相似度
计算机视觉是研究图像的学问,在图像的最终评价时,往往需要用到一些图像相似度的度量指标,因此,在本文中我们将详细地介绍原生和调用第三方库的计算图像余弦相似度的方法。 使用原生numpy实现 import numpy as npdef image_cosin…...
求矩阵某列的和
设计函数sum_column( int A[E1(n)][E2(n)], int j ),E1(n)和E2(n)分别为用宏定义的行数和列数,j为列号。在该函数中,设计指针ptr&A[0][j],通过*ptr及ptrptrE2(n)访问第j列元素,从而求得第j列元素的和。在主函数中定…...
【论文分析】无人机轨迹规划,Fast-Planner:实时避障+全局最优的路径引导优化算法
这篇论文《Robust Real-time UAV Replanning Using Guided Gradient-based Optimization and Topological Paths》由香港科技大学提出,主要针对无人机(UAV)在复杂环境中的实时轨迹重新规划问题,提出了一种结合梯度优化和拓扑路径搜…...
李飞飞、吴佳俊团队新作:FlowMo如何以零卷积、零对抗损失实现ImageNet重构新巅峰
目录 一、摘要 二、引言 三、相关工作 四、方法 基于扩散先前的离散标记化器利用广告 架构 阶段 1A:模式匹配预训练 阶段 1B:模式搜索后训练 采样 第二阶段:潜在生成建模 五、Coovally AI模型训练与应用平台 六、实验 主要结果 …...
AutoDev 2.0 正式发布:智能体 x 开源生态,AI 自动开发新标杆
在我们等待了几个月之后,国内终于有模型(DeepSeek V3-0324)能支持 AutoDev 的能力,也因此是时候发布 AutoDev 2.0 了!在 AutoDev 2.0 中,你可以: 编码智能体 Sketch 进行自动化编程自动化编程的…...
PHP 应用MYSQL 架构SQL 注入跨库查询文件读写权限操作
MYSQL 注入:(目的获取当前 web 权限) 1 、判断常见四个信息(系统,用户,数据库名,版本) 2 、根据四个信息去选择方案 root 用户:先测试读写,后测试获取…...
鸿蒙-全屏播放页面(使用相对布局)---持续更新中
最终实现效果图: 实现步骤 创建FullScreenPlay.ets全品播放页面 并将其修改为启动页面。 全屏播放,屏幕必然横过来,所以要将窗口横过来。 编辑 src/main/ets/entryability/EntryAbility.ets 若写在/EntryAbility.ets中,则所有…...
第4期:重构软件测试体系——生成式AI如何让BUG无所遁形
真实战场报告 某金融系统上线前,测试团队用AI生成3000条边缘用例,发现了一个隐藏极深的并发漏洞——该BUG在传统用例覆盖下需要7年才会触发一次。这次发现直接避免了可能上亿元的资金风险! 一、测试革命:当AI遇见质量保障 场景1&…...
力扣.旋转矩阵Ⅱ
59. 螺旋矩阵 II - 力扣(LeetCode) 代码区: class Solution {const int MAX25; public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> ans;vector<int> hang;int len_nn;int arry[25][25]…...
Docker 安装部署Harbor 私有仓库
Docker 安装部署Harbor 私有仓库 系统环境:redhat x86_64 一、首先部署docker 环境 定制软件源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repoyum install -y yum-utils device-mapper-persistent-data lvm2…...
SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景
以下是 SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景: 数据类型类别数据类型解释内存占用适用场景整数类型bigint用于存储范围较大的整数,范围是 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)8 字节需要…...
javascript实现一个函数,将字符串中的指定子串全部替换为另一个字符串的原理,以及多种方法实现。
大白话javascript实现一个函数,将字符串中的指定子串全部替换为另一个字符串的原理,以及多种方法实现。 在JavaScript里,要是你想把字符串里的指定子串都替换成另外一个字符串,有不少方法可以实现。下面我会详细介绍实现的原理&a…...
Python 3 与 MySQL 数据库连接:mysql-connector 模块详解
Python 3 与 MySQL 数据库连接:mysql-connector 模块详解 概述 在Python 3中,与MySQL数据库进行交互是一个常见的需求。mysql-connector是一个流行的Python模块,它提供了与MySQL数据库连接和交互的接口。本文将详细介绍mysql-connector模块…...
HCIA-Datacom高阶:基础的单区域 OSPF 与多区域 OSPF的配置
动态路由协议是实现网络高效通信的关键技术之一。开放式最短路径优先(Open Shortest Path First,OSPF)协议作为内部网关协议(IGP)的一种,因其高效性、稳定性和扩展性,在大型网络中得到了广泛应用…...
蓝桥杯单片机刷题——E2PROM记录开机次数
设计要求 使用E2PROM完成数据记录功能,单片机复位次数记录到E2PROM的地址0中。每复位一次数值加1,按下按键S4,串口发送复位次数。串口发送格式如下: Number:1 备注: 单片机IRC振荡器频率设置为12MHz。 …...
杂草YOLO系列数据集4000张
一份开源数据集——杂草YOLO数据集,该数据集适用于农业智能化、植物识别等计算机视觉应用场景。 数据集详情 训练集:3,664张高清标注图像测试集:180张多样性场景样本验证集:359张严格筛选数据 下载链接 杂草YOLO数据集分…...
Python自动化面试通关秘籍
Python自动化测试工程师面试,不仅仅是考察你的代码能力,更看重你如何在项目中灵活运用工具和框架解决实际问题。如果你正准备面试,这篇文章将为你总结最常见的高频考题及答题技巧,帮助你快速上手,通关面试,…...
机器学习的一百个概念(1)单位归一化
前言 本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...
Python 笔记 (二)
Python Note 2 1. Python 慢的原因2. 三个元素3. 标准数据类型4. 字符串5. 比较大小: 富比较方法 rich comparison6. 数据容器 (支持*混装* )一、允许重复类 (list、tuple、str)二、不允许重复类 (set、dict)1、集合(set)2、字典(dict)3、特殊: 双端队列 deque 三、数据容器的共…...
【商城实战(97)】ELK日志管理系统的全面应用
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…...
3.使用epoll实现单线程并发服务器
目录 1. epoll的概述 2. 多线程与epoll的处理流程 2.1 多线程处理流程 2.2 epoll处理流程 3. epoll与多线程的比较 4. epoll的操作函数 4.1 epoll_create() 4.2 epoll_ctl() 4.3 epoll_wait() 5. 示例代码 6. epoll的工作模式 7. 使用O_NONBLOCK防止阻塞 8.运行代…...
蓝桥杯真题------R格式(高精度乘法,高精度加法)
对于高精度乘法和加法的同学可以学学这几个题 高精度乘法 高精度加法 文章目录 题意分析部分解全解 后言 题意 给出一个整数和一个浮点数,求2的整数次幂和这个浮点数相乘的结果最后四舍五入。、 分析 我们可以发现,n的范围是1000,2的1000次方非常大&am…...
PyCharm操作基础指南
一、安装与配置 1. 版本选择 专业版:支持 Web 开发(Django/Flask)、数据库工具、科学计算等(需付费)。 社区版:免费,适合纯 Python 开发。 2. 安装步骤 访问 JetBrains 官网 下载对应版本。…...
21 python __name__ 与 __main__
在办公室里,每个员工都有自己的工牌,上面写着姓名和部门。 一、__name__:模块的名字 Python 模块也有类似的 "工牌"——__name__属性,它记录了模块的身份: 直接运行时 → __name__ "__main__"&…...
NixVis 开源轻量级 Nginx 日志分析工具
NixVis NixVis 是一款基于 Go 语言开发的、开源轻量级 Nginx 日志分析工具,专为自部署场景设计。它提供直观的数据可视化和全面的统计分析功能,帮助您实时监控网站流量、访问来源和地理分布等关键指标,无需复杂配置即可快速部署使用。 演示…...
elementUI el-image图片加载失败解决
是不是,在网上找了一些,都不行,这里一行代码,解决,后端返回图片路径,el-image图片加载失败的问题 解决办法, vue项目里,index.html文件里加一行代码就可 <meta name"refe…...
lxd-dashboard 图形管理LXD/LXC
前言 LXD-WEBGUI是一个完全用AngularJS编写的Web应用程序,无需应用服务器、数据库或其他后端服务支持。只需要简单地托管静态HTML和JavaScript文件,就能立即投入使用。这个项目目前处于测试阶段,提供了直观的用户界面,帮助用户便捷地管理和控制LXD实例。 安装lxd-dashboa…...
C# MemoryStream 使用详解
总目录 前言 在.NET开发中,流(Stream)是一个用于处理输入和输出的抽象类,MemoryStream是流的一个具体实现,它允许我们在内存中读写数据,就像操作文件一样,而无需涉及磁盘 I/O 操作。尤其适合需…...
(二)万字长文解析:deepResearch如何用更长的思考时间换取更高质量的回复?各家产品对比深度详解
DeepResearch的研究背景 业务背景:用更长的等待时间,换取更高质量、更具实用性的结果 当前AI技术发展正经历从“即时响应”到“深度思考”的范式转变。用户对延迟的容忍度显著提升,从传统200ms的交互响应放宽至数秒甚至数分钟,以…...
Redis场景问题1:缓存穿透
Redis 缓存穿透是指在缓存系统(如 Redis)中,当客户端请求的数据既不在缓存中,也不在数据库中时,每次请求都会直接穿透缓存访问数据库,从而给数据库带来巨大压力,甚至可能导致数据库崩溃。下面为…...
数据结构(并查集,图)
并查集 练习版 class UnionFindSet { public:void swap(int* a, int* b){int tmp *a;*a *b;*b tmp;}UnionFindSet(size_t size):_ufs(size,-1){}int UnionFind(int x){}void Union(int x1, int x2){}//长分支改为相同节点int FindRoot(int x){}bool InSet(int x1, int x2)…...
深度学习篇---断点重训模型部署文件
文章目录 前言一、断点重训(Checkpoint)文件1. 动态图(DyGraph)模式.pdparams 文件.pdopt 文件.pdscaler 文件.pdmeta 或 .pkl 文件 2. 静态图(Static Graph)模式.pdparams 和 .pdopt 文件.ckpt 文件 3. 恢…...
chromem-go + ollama + bge-m3 进行文档向量嵌入和查询
Ollama 安装 https://ollama.com/download Ollama 运行嵌入模型 bge-m3:latest ollama run bge-m3:latestchromem-go 文档嵌入和查询 package mainimport ("context""fmt""runtime""github.com/philippgille/chromem-go" )func ma…...
运维面试题(十一)
1.如果一个硬盘 IO 时阻塞了,会发生什么情况? 进程/线程挂起:发起I/O操作的进程或线程会被操作系统置为阻塞状态(等待状态),直到I/O完成。CPU资源释放:阻塞的线程会让出CPU,操作系统…...
深度学习中常见的专业术语汇总
本硕博都是搞机械的匠人,当然也想做一下交叉学科的东西,蹭一下人工智能的热点。虽然世界是个草台班子,但是来都来了,咱也要把这场戏演好。 记得之前网上爆料有位大学生发了很多水文,对,是交叉学科的&#x…...
人工智能赋能医疗:开启智慧医疗新时代
在当今数字化浪潮的推动下,人工智能(AI)技术正以前所未有的速度渗透到各个行业,其中医疗领域更是成为AI技术大放异彩的重要舞台。从疾病诊断到治疗方案制定,从医疗影像分析到药物研发,AI正在为传统医疗带来…...
stable diffusion 本地部署教程 2025最新版
前提: 需要环境 git git下载地址Git - Downloading Package 直接装即可 python3.10.6 下载地址 Python Release Python 3.10.6 | Python.org 记得python环境一定要3.10.6!!! 第一个版本 项目地址https://github.…...
[Mac]利用Hexo+Github Pages搭建个人博客
由于我这台Mac基本没啥环境,因此需要从零开始配置,供各位参考。 注意⚠️:MacBook (M4)使用/bin/zsh作为默认Shell,其对应的配置文件为~/.zshrc 参考文档: HEXO系列教程 | 使用GitHub部署静态博客HEXO | 小白向教程 文…...