【OLAP】trino安装和基本使用

目录

​一、概述

1.1Trino不是什么

1.2Trino是什么

二、Trino特点

三、Trino架构

3.1架构和服务节点

3.2Trino数据模型

四、Trino安装部署

4.1配置JDK

4.2单机版(Coordinator和Worker同进程)

4.2.1启动服务

4.2.2下载客户端

五、配置HTTPS(coordinator)

5.1生成证书

5.2设置密码

5.3配置 kerberos认证

六、新增Worker

七、Hive连接器

7.1无kerberos的hive

7.2带kerberos的hive

7.3 访问hivecatalog异常


一、概述


Presto是Facebook开源的MPP(Massively Parallel Processing:大规模并行处理)架构的OLAP(on-line transaction processing:联机分析处理),完全基于内存的并⾏计算,可针对不同数据源,执行大容量数据集的一款分布式SQL交互式查询引擎。 它是为了解决Hive的MapReduce模型太慢以及不能通过BI或Dashboards直接展现HDFS数据等问题。

但是Presto目前有两大分支:PrestoDB(背靠Facebook)和PrestoSQL现在改名为Trino(Presto的创始团队),虽然PrestoDB背靠Facebook,但是社区活跃度和使用群体还是远不如Trino。所以这里以Trino为主展开讲解。

PrestoDB官方文档:https://prestodb.io/docs/current/

Trino官方文档:Trino documentation — Trino 476 Documentation

Trino 是一个运行速度极快的查询引擎,专为大数据分析设计,支持快速分布式 SQL 查询,帮助您探索数据宇宙。

1.1Trino不是什么

由于社区中的许多成员都将Trino称为数据库,因此首先定义一下Trino不是什么。不要误以为Trino理解SQL就意味着它具备标准数据库的功能。Trino不是通用关系型数据库。它不是MySQL、PostgreSQL或Oracle等数据库的替代品。Trino并非为处理在线事务处理(OLTP)而设计。对于许多其他为数据仓库或分析而设计和优化的数据库来说,也是如此。

1.2Trino是什么


Trino是一款旨在通过分布式高效查询海量数据的工具。如果你处理的是TB级或PB级的数据,你很可能正在使用与Hadoop和HDFS交互的工具。Trino被设计为使用MapReduce作业管道查询HDFS的工具(如Hive或Pig)的替代方案,但Trino并不局限于访问HDFS。Trino可以并且已经被扩展,以操作不同类型的数据源,包括传统的关系数据库以及其他数据源,如Oracle。Trino旨在处理数据仓库和分析:数据分析、聚合大量数据并生成报告。这些工作负载通常被归类为联机分析处理(OLAP)。

二、Trino特点


Trino是基于java开发的,对于大部分开发者和使用者而言,Trino容易学习并对特定的场景进行二次开发和性能优化等。多数据源、支持SQL、扩展性强、高性能,流水线模式。

  • 多数据源:目前版本支持20多种数据源,几乎能覆盖所有常见情况,Elasticsearch 、Hive 、phoenix 、Kafka、Iceberg 、Local File、clickhouse 、MongoDB 、MySQL 、Redis等等;
  • 支持SQL:完成支持ANSI SQL,提供SQL shell;
  • 扩展性:支持开发自己的特定数据源的connector;
  • 高性能:Trino基于内存计算,在绝大多数情况下,Trino的查询性能是hive的10倍以上,完全能实现交互式,实时查询;
  • 流水线:Trino是基于PipeLine设计的,在进行大量设计处理过程中,终端不需要等待所有的数据计算完毕之后才能看到结果,计算一部分就可以看部分结果。

三、Trino架构


3.1架构和服务节点

  • Trino查询引擎是一个Master-Slave的架构,有两种进程Coordinator服务进程和worker服务进程组成。细分的话还有一个Discovery Server节点,Discovery Server通常内嵌于Coordinator节点中。
  • Coordinator主要作用是接收查询请求,解析查询语句,生成查询执行计划,任务调度和worker管理。
  • Worker服务进程执行被分解的查询执行任务:task
  • Worker节点启动完成后向Discovery Server服务注册,CoordinatorDiscovery Server获得可以正常工作的Worker节点。
  • 如果配置了Hive Connector,需要配置一个Hive MetaStore服务为Trino提供Hive元信息,Worker节点与HDFS交互读取数据。

3.2Trino数据模型

Trino就是通过Connector来访问不同的数据源的,相当于访问不同数据源的驱动程序,每种connector都实现了Trino的标准SPI接口,因此只要实现了标准SPI接口就可以制定特殊的Connector来访问数据源。

Trino采取三层表结构:

  • Catalog

Trino中Catalog类似于mysql中的一个数据库实例,Schema类似于mysql当中的一个database。如用Trino去连接一个hive中的一个库

  • Schema

Trino中的schema就相当于mysql中的一个具体的database

  • Table

Trino中的table和mysql中table含义一样

trino --server ip:port --catalog hive --schema xxx 这样就可以访问hive的中的xxx库。

四、Trino安装部署


官方安装文档:Deploying Trino — Trino 476 Documentation

4.1配置JDK

将JDK放在trino目录下面 ,我直接 修改了launcher启动脚本

4.2单机版(Coordinator和Worker同进程)

下载 trino

https://repo1.maven.org/maven2/io/trino/trino-server/367/

# 解压后的路径
/opt/trino-367# 创建配置目录
mkdir etc data

etc目录下的配置文件

Config properties

cat << EOF > etc/config.properties
# 设置该节点为coordinator节点
coordinator=true
# 指定HTTP服务器的端口。Trino使用HTTP进行内部和外部web的所有通信。
http-server.http.port=8086
# 查询可以在任何一台机器上使用的最大用户内存。【注意】也是不能配置超过jvm配置的最大堆栈内存大小
query.max-memory-per-node=2GB
# 查询可以使用的最大分布式内存。【注意】不能配置超过jvm配置的最大堆栈内存大小
query.max-memory=4GB
# hdp-node3也可以是IP
discovery.uri=http://hdp-node3:8086
# 允许在协调器上调度工作,也就是coordinator节点又充当worker节点用
node-scheduler.include-coordinator=true
EOF

node properties

cat << EOF > etc/node.properties
# 环境的名字。集群中所有的Trino节点必须具有相同的环境名称。
node.environment=production
# 此Trino安装的唯一标识符。这对于每个节点都必须是唯一的。可以填写md5值
node.id=trino-worker
# 数据目录的位置(文件系统路径)。Trino在这里存储日志和其他数据。
node.data-dir=/opt/trino-367/data
EOF

Log properties

cat << EOF > etc/log.properties
# 设置日志级别,有四个级别:DEBUG, INFO, WARN and ERROR
io.trino=INFO
EOF

JVM config

cat << EOF > etc/jvm.config
-server
-Xmx6G
-XX:-UseBiasedLocking
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
-XX:+UnlockDiagnosticVMOptions
-XX:+UseAESCTRIntrinsics
EOF

4.2.1启动服务

cd  /opt/trino-367
./bin/launcher start

4.2.2下载客户端

下载客户端
cd /opt/trino-367
wget https://repo1.maven.org/maven2/io/trino/trino-cli/367/trino-cli-367.jar
mv trino-cli-367.jar trino-cli.jar
chmod +x trino-cli.jar# 连接测试 
[root@hdp-node3 trino-367]# ./bin/trino-cli.jar --server  hdp-node3:8086
trino> select * from hive.hive_test.employee_txn;

登录web查看任务http://hdp-node3:8086/ui/login.html 账号随便/密码为空

五、配置HTTPS(coordinator)


注意】要使用trino的权限控制,从官方文档上看,需要先开启https,因此一定需要证书的。

5.1生成证书


cd /opt/trino-367
mkdir tls && cd tls
# 生成 CA 证书私钥
openssl genrsa -out trino.key 4096
# 生成 CA 证书
openssl req -x509 -new -nodes -sha512 -days 3650 \-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=mytrino.com" \-key trino.key \-out trino.cert# 合并
cat trino.key trino.cert > trino.pem

在etc/config.properties添加如下配置:

http-server.https.enabled=true
http-server.https.port=8443
http-server.https.keystore.path=/opt/trino-367/tls/trino.pem
# 节点之间不需要使用https通信,在内网部署无需,外网需打开,默认就是false
internal-communication.https.required=false

web UI:https://hdp-node3:8443/ ,账号 :admin/123456

5.2设置密码


注意】要使用trino的权限控制,从官方文档上看,需要开启https,因此一定需要证书的。

# etc/config.properties增加如下配置:
http-server.authentication.type=PASSWORD

创建配置etc/password-authenticator.properties,此处可以配置使用LDAP密码文件认证,这里测试我们先采用密码文件认证。

password-authenticator.name=file
file.password-file=/opt/trino-367/etc/password.db

etc/password.db内容如下:

admin:$2y$10$YG12RuoTiJjTzXFM.UgRy.AP.c2Me9KaKcYe6ufsy.ztpFRehnpE2

password.db用户密码文件,一行就是一个用户名密码,用户密码用 : 隔开,比如我定义了一个admin/123456的用户。在使用bcrypt加密的时候,生成的密码可能是$2a$开头的,而根据trino文档内定义的password规范是需要$2y$开头的,这里需要注意。

在线Bcrypt密码生成工具: 在线Bcrypt密码生成工具-Bejson.com

重启

客户端访问输入密码

./bin/trino-cli.jar --server https://hdp-node3:8443 --user=admin --password --insecure 

5.3配置 kerberos认证


官方文档:Kerberos authentication — Trino 476 Documentation

【注意】使用Kerberos认证时,访问Trino协调器必须通过TLS和HTTPS。

kadmin
addprinc -randkey trino@WINNER.COM
addprinc -randkey trino/hdp-node3@WINNER.COM
ktadd -k /etc/security/keytabs/trino.service.keytab trino@WINNER.COM
ktadd -k /etc/security/keytabs/trino.service.keytab trino/hdp-node3@WINNER.COM

config.properties 完整配置如下:

# 设置该节点为coordinator节点
coordinator=true
# 指定HTTP服务器的端口。Trino使用HTTP进行内部和外部web的所有通信。
http-server.http.port=8086
# 查询可以在任何一台机器上使用的最大用户内存。【注意】也是不能配置超过jvm配置的最大堆栈内存大小
query.max-memory-per-node=2GB
# 查询可以使用的最大分布式内存。【注意】不能配置超过jvm配置的最大堆栈内存大小
query.max-memory=4GB
# hdp-node3也可以是IP
discovery.uri=http://hdp-node3:8086
# 允许在协调器上调度工作,也就是coordinator节点又充当worker节点用
node-scheduler.include-coordinator=true
http-server.https.enabled=true
http-server.https.port=8443
http-server.https.keystore.path=/opt/trino-367/tls/trino.keystore
http-server.https.keystore.key=password
internal-communication.shared-secret=password
http-server.process-forwarded=true#Kerberos 通常对 DNS 名称敏感。 将此属性设置为使用 FQDN 可确保正确操作和使用有效的 DNS 主机名。
node.internal-address-source=FQDN
# 多种认证方式用逗号分割
http-server.authentication.type=KERBEROS,PASSWORD
http-server.authentication.krb5.service-name=trino
http-server.authentication.krb5.principal-hostname=hdp-node3
http-server.authentication.krb5.keytab=/etc/security/keytabs/trino.service.keytab
http.authentication.krb5.config=/etc/krb5.conf
http-server.https.secure-random-algorithm=SHA1PRNG

六、新增Worker


直接将trino-367 包拷贝到另一台服务器上,修改如下配置

node.properties

[root@hdp-node2 trino-367]# cat etc/node.properties 
# 环境的名字。集群中所有的Trino节点必须具有相同的环境名称。
node.environment=production
# 此Trino安装的唯一标识符。这对于每个节点都必须是唯一的。可以填写md5值   -- 修改
node.id=trino-worker02
# 数据目录的位置(文件系统路径)。Trino在这里存储日志和其他数据。
node.data-dir=/opt/trino-367/data

config.properties

# 设置为false             -- 修改
coordinator=false
# 指定HTTP服务器的端口。Trino使用HTTP进行内部和外部web的所有通信。
http-server.http.port=8086
# 查询可以在任何一台机器上使用的最大用户内存。【注意】也是不能配置超过jvm配置的最大堆栈内存大小
query.max-memory-per-node=2GB
# 查询可以使用的最大分布式内存。【注意】不能配置超过jvm配置的最大堆栈内存大小
query.max-memory=4GB
# hdp-node3也可以是IP
discovery.uri=http://hdp-node3:8086
# 允许在协调器上调度工作,也就是coordinator节点又充当worker节点用
node-scheduler.include-coordinator=true
http-server.https.enabled=true
http-server.https.port=8443
http-server.https.keystore.path=/opt/trino-367/tls/trino.keystore
http-server.https.keystore.key=password
internal-communication.shared-secret=password
http-server.process-forwarded=true#Kerberos 通常对 DNS 名称敏感。 将此属性设置为使用 FQDN 可确保正确操作和使用有效的 DNS 主机名。
node.internal-address-source=FQDNhttp-server.authentication.type=KERBEROS,PASSWORD
http-server.authentication.krb5.service-name=trino
http-server.authentication.krb5.principal-hostname=hdp-node3
http-server.authentication.krb5.keytab=/etc/security/keytabs/trino.service.keytab
http.authentication.krb5.config=/etc/krb5.conf
http-server.https.secure-random-algorithm=SHA1PRNG

查表验证

./bin/trino-cli.jar \
--server https://hdp-node3:8443   \
--krb5-config-path /etc/krb5.conf \
--krb5-principal trino/hdp-node3@WINNER.COM \
--krb5-keytab-path /etc/security/keytabs/trino.service.keytab \
--krb5-remote-service-name trino \
--keystore-path /opt/trino-367/tls/trino.keystore \
--keystore-password password \
--user trino/hdp-node3@WINNER.COM \
--execute "select * from system.runtime.nodes;" --output-format=TSV_HEADER

七、Hive连接器


连接器其实就是指定某种数据源,如下给出hive连接器示例。

7.1无kerberos的hive


[root@hdp-node3 trino-367]# cat   etc/catalog/hive.properties 
connector.name=hive
hive.metastore.uri=thrift://192.168.2.100:9083
hive.config.resources=/opt/datasophon/core-site.xml,/opt/datasophon/hdfs-site.xml

7.2带kerberos的hive

【注意】使用Kerberos认证时,访问Trino协调器必须通过TLS和HTTPS。

# 生成新的密钥库,包含 hdp-node3 作为主机名
keytool -genkeypair \-alias trino \-keyalg RSA \-keysize 2048 \-validity 3650 \-keystore /opt/trino-367/tls/trino.keystore \-storepass password \-keypass password \-dname "CN=hdp-node3, OU=Trino, O=Example, L=Beijing, ST=Beijing, C=CN" \-ext "SAN=dns:hdp-node3,dns:localhost,ip:127.0.0.1"

config.properties

# 设置该节点为coordinator节点
coordinator=true
# 指定HTTP服务器的端口。Trino使用HTTP进行内部和外部web的所有通信。
http-server.http.port=8086
# 查询可以在任何一台机器上使用的最大用户内存。【注意】也是不能配置超过jvm配置的最大堆栈内存大小
query.max-memory-per-node=2GB
# 查询可以使用的最大分布式内存。【注意】不能配置超过jvm配置的最大堆栈内存大小
query.max-memory=4GB
# hdp-node3也可以是IP
discovery.uri=http://hdp-node3:8086
# 允许在协调器上调度工作,也就是coordinator节点又充当worker节点用
node-scheduler.include-coordinator=true
http-server.https.enabled=true
http-server.https.port=8443
http-server.https.keystore.path=/opt/trino-367/tls/trino.keystore
http-server.https.keystore.key=password
internal-communication.shared-secret=password
http-server.process-forwarded=true#Kerberos 通常对 DNS 名称敏感。 将此属性设置为使用 FQDN 可确保正确操作和使用有效的 DNS 主机名。
node.internal-address-source=FQDNhttp-server.authentication.type=KERBEROS,PASSWORD
http-server.authentication.krb5.service-name=trino
http-server.authentication.krb5.principal-hostname=hdp-node3
http-server.authentication.krb5.keytab=/etc/security/keytabs/trino.service.keytab
http.authentication.krb5.config=/etc/krb5.conf
http-server.https.secure-random-algorithm=SHA1PRNG

jvm.config

-server
-Xmx8G
-XX:-UseBiasedLocking
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
-XX:+UnlockDiagnosticVMOptions
-XX:+UseAESCTRIntrinsics
-Dsun.security.krb5.debug=true
-Djava.security.krb5.conf=/etc/krb5.conf

hive catalog

[root@hdp-node3 trino-367]# cat  etc/catalog/hive.properties 
connector.name=hive
hive.metastore.uri=thrift://hdp-node2:9083
hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=hive/_HOST@WINNER.COM;
hive.metastore.client.principal=trino/hdp-node3@WINNER.COM
hive.metastore.client.keytab=/etc/security/keytabs/trino.service.keytab
hive.hdfs.authentication.type=KERBEROS
hive.hdfs.trino.principal=trino/hdp-node3@WINNER.COM
hive.hdfs.trino.keytab=/etc/security/keytabs/trino.service.keytab
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
hive.hdfs.impersonation.enabled=true
# 是否开启向Hive的外部表写入数据,默认是False
hive.non-managed-table-writes-enabled=true

客户端访问

./bin/trino-cli-367-executable.jar \
--server https://hdp-node3:8443   \
--krb5-config-path /etc/krb5.conf \
--krb5-principal trino/hdp-node3@WINNER.COM \
--krb5-keytab-path /etc/security/keytabs/trino.service.keytab \
--krb5-remote-service-name trino \
--keystore-path /opt/trino-367/tls/trino.keystore \
--keystore-password password \
--user trino/hdp-node3@WINNER.COM \
--catalog hive

执行查询

7.3 访问hivecatalog异常

2025-08-11T13:34:06.371+0800    ERROR   SplitRunner-0-92        io.trino.execution.executor.TaskExecutor        Error processing Split 20250811_053355_00000_97364.2.0.0-0 io.trino.connector.informationschema.InformationSchemaSplit@35e48236 (start = 1.6171929350256409E10, wall = 9739 ms, cpu = 0 ms, wait = 2 ms, calls = 1)
com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: javax.security.auth.login.LoginException: Message stream modified (41)at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2055)at com.google.common.cache.LocalCache.get(LocalCache.java:3966)at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3989)at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4950)at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4956)at io.trino.plugin.hive.metastore.cache.CachingHiveMetastore.get(CachingHiveMetastore.java:261)at io.trino.plugin.hive.metastore.cache.CachingHiveMetastore.getAllDatabases(CachingHiveMetastore.java:295)at io.trino.plugin.hive.HiveMetastoreClosure.getAllDatabases(HiveMetastoreClosure.java:66)at io.trino.plugin.hive.metastore.SemiTransactionalHiveMetastore.getAllDatabases(SemiTransactionalHiveMetastore.java:197)at io.trino.plugin.hive.HiveMetadata.listSchemaNames(HiveMetadata.java:416)at io.trino.plugin.base.classloader.ClassLoaderSafeConnectorMetadata.listSchemaNames(ClassLoaderSafeConnectorMetadata.java:205)at io.trino.metadata.MetadataManager.listSchemaNames(MetadataManager.java:293)at io.trino.metadata.MetadataListing.listSchemas(MetadataListing.java:100)at io.trino.metadata.MetadataListing.listSchemas(MetadataListing.java:95)at io.trino.connector.informationschema.InformationSchemaPageSource.addSchemataRecords(InformationSchemaPageSource.java:316)at io.trino.connector.informationschema.InformationSchemaPageSource.buildPages(InformationSchemaPageSource.java:225)at io.trino.connector.informationschema.InformationSchemaPageSource.getNextPage(InformationSchemaPageSource.java:183)at io.trino.operator.TableScanOperator.getOutput(TableScanOperator.java:311)at io.trino.operator.Driver.processInternal(Driver.java:388)at io.trino.operator.Driver.lambda$processFor$9(Driver.java:292)at io.trino.operator.Driver.tryWithLock(Driver.java:685)at io.trino.operator.Driver.processFor(Driver.java:285)at io.trino.execution.SqlTaskExecution$DriverSplitRunner.processFor(SqlTaskExecution.java:1076)at io.trino.execution.executor.PrioritizedSplitRunner.process(PrioritizedSplitRunner.java:163)at io.trino.execution.executor.TaskExecutor$TaskRunner.run(TaskExecutor.java:488)at io.trino.$gen.Trino_367____20250811_053005_2.run(Unknown Source)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.RuntimeException: javax.security.auth.login.LoginException: Message stream modified (41)

修改了 krb5.cof

vim /etc/ krb5.conf删除 krb5.conf 配置文件里的 renew_lifetime = xxx 这行配置即可


参考文章

javax.security.auth.login.LoginException: Message stream modified (41)-CSDN博客

Kerberos authentication — Trino 476 Documentation

大数据Hadoop之——基于内存型SQL查询引擎Presto(Presto-Trino环境部署) - 大数据老司机 - 博客园

【大数据】通过 docker-compose 快速部署 Presto(Trino)保姆级教程 - 大数据老司机 - 博客园

【大数据】Presto(Trino)SQL 语法进阶 - 大数据老司机 - 博客园

presto(trino)+kerberos+https - mzjnumber1 - 博客园

Presto/Trino的Hive Connector的使用(内部表、外部表、分区表):

Presto/Trino的Hive Connector的使用(内部表、外部表、分区表)_presto分区表-CSDN博客

HDFS file system support — Trino 476 Documentation

trino 安装(带web ui 与 coordinator 和 worker 与 coordinator 安全通讯)_trino webui-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93711.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何写出更清晰易读的布尔逻辑判断?

列编码技巧和规范&#xff0c;来降低逻辑的“认知负荷”。成功的实践&#xff0c;必须系统性地涵盖五大关键策略&#xff1a;采用有意义的变量名进行封装、将复杂的判断拆解为独立的函数、优先使用“肯定式”而非“否定式”逻辑、利用括号明确运算的优先级、以及运用德摩根定律…

新手向:Java方向讲解

从诺基亚塞班到阿里双11&#xff0c;从安卓应用到华尔街交易&#xff0c;Java用一行System.out.println()征服了数字世界1998年&#xff0c;诺基亚在塞班系统上首次采用Java ME技术&#xff0c;让手机具备了运行应用程序的能力&#xff0c;开启了移动互联网的序幕。当时的Java开…

视觉图像界面设计【QT-creator高级编程 - 01】图像显如何保证跟随主窗口变化,且保留必要的设定窗口

前言&#xff1a;问题&#xff0c;显示图像的时候&#xff0c;按最大窗口&#xff0c;图片窗口不跟着变大&#xff0c;还有&#xff0c;右边那些设置控件都没有动解决&#xff1a;步骤1&#xff1a;1️⃣ 让 graphicsView 自动占满在 Qt Creator 中选中 graphicsView_7 / 12 / …

pair之于vector、queue(vector<pair<int,int>>)

1、vector&#xff1c;pair&#xff1c;int,int&#xff1e;&#xff1e; 和 Map 的异同点map&#xff1a;会对插入的元素按键Key&#xff0c;自动排序&#xff0c;而且键Key不允许重复&#xff1b;vector&#xff1a;的这种用法不会自动排序&#xff0c;而且允许重复。2、queu…

从合规到卓越:全星QMS如何成为制造企业的质量战略引擎

从合规到卓越&#xff1a;全星质量管理QMS软件系统如何成为制造企业的质量战略引擎 全星质量管理QMS软件系统凭借其高度定制化、智能化、全流程覆盖等核心优势&#xff0c;已在汽车制造、电子、医疗、航空航天等多个高端制造领域实现领先性应用&#xff0c;显著提升了企业的质…

按键及消抖

方法一&#xff1a;延时阻塞key.c:#include "key.h" #include "delay.h"//初始化GPIO void key_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟//调用GPIO初始化函数…

什么是接口?PHP如何使用 SessionHandlerInterface 接口实现Session自定义会话数据存储

在面向对象编程中&#xff0c;接口&#xff08;Interface&#xff09;作为类与类之间的契约规范&#xff0c;定义了实现类必须遵守的方法签名集合&#xff0c;却不包含具体实现细节。这种抽象机制通过强制统一的方法命名和参数结构&#xff0c;实现了代码的解耦与多态性&#x…

健身房预约系统SSM+Mybatis-plus实现(二、增删改查的具体实现)

文章目录一、环境搭建二、用户管理页面&#xff08;纯展示无事件操作&#xff09;0.三步走1.查询表单&#xff08;1&#xff09;书写页面代码 &#xff1a;&#xff08;2&#xff09;对应的js部分创建对象数据模型的绑定部分&#xff1a;&#xff08;3&#xff09;引入需要的库…

在IAR Embedded Workbench for Arm中实现NXP S32K3安全调试

随着汽车电子系统变得越来越智能&#xff0c;对功能安全&#xff08;Safety&#xff09;的要求越来越高&#xff0c;同时信息安全&#xff08;Security&#xff09;也越来越被关注&#xff0c;安全调试&#xff08;Secure Debug&#xff09;机制已成为一个重要的信息安全特性。…

Vue实例中的其他属性【5】

目录1.计算属性&#xff1a;1.概述&#xff1a;2.语法特点&#xff1a;3.案例&#xff1a;案例1&#xff1a;案例2&#xff1a;案例3&#xff1a;4.总结&#xff1a;5.get函数什么时候执行&#xff1f;6.注意:2.监视属性&#xff1a;1.概述&#xff1a; 2.用法&#xff1a;1.监…

C++入门自学Day11-- String, Vector, List 复习

往期内容回顾 List类型的自实现 List类型&#xff08;初识&#xff09; Vector类的自实现 Vector类&#xff08;注意事项&#xff09; 初识Vector String类的自实现 String类的使用&#xff08;续&#xff09; String类&#xff08;续&#xff09; String类&#xff08;初识&…

JavaScript性能优化实战(三):DOM操作性能优化

想象一下&#xff0c;你正在精心布置一个豪华蛋糕&#xff08;你的网页&#xff09;&#xff0c;每次添加一颗草莓&#xff08;DOM元素&#xff09;都要把整个蛋糕从冰箱拿出来、放回去&#xff08;重排重绘&#xff09;&#xff0c;来来回回几十次&#xff0c;不仅效率低下&am…

【力扣】面试经典150题总结02-双指针、滑动窗口

1.验证回文串&#xff08;简单&#xff09;用toLowerCase()转为小写字母&#xff0c;然后前后指针向中间进行比对。2.判断子序列&#xff08;简单&#xff09;两个指针一个指向长字符串&#xff0c;另一个指向短字符串。匹配就都1&#xff0c;不匹配就将长字符串指针1。长字符串…

MQ迁移方案

以下是完整的MQ迁移方案设计&#xff0c;涵盖同构/异构迁移、零丢失保障、灰度切换等关键环节&#xff0c;适用于Kafka、RabbitMQ、RocketMQ等主流消息队列&#xff1a;​一、迁移方案选型矩阵​​场景​​适用方案​​技术实现​​优缺点​​同集群版本升级​滚动重启 协议兼…

RAG 分块中表格填补简明示例:Markdown、HTML、Excel、Doc

表格填补是RAG分块中常见的需求&#xff0c;但不同格式的表格处理方式有所不同。本文将对 Markdown、HTML、Excel 的合并单元格进行说明&#xff0c;并给出 Python 示例&#xff0c;演示如何解析和填补。1. Markdown 表格Markdown 只能用空值表示合并单元格。&#xff08;只有列…

IDEA创建一个VUE项目

由于新手学习VUE&#xff0c;所以使用手动初始化项目 步骤&#xff1a; 创建项目文件夹&#xff1a;在 IDEA 中点击 File > New > Project&#xff0c;选择 Empty Project&#xff0c;指定项目路径。初始化 npm&#xff1a;在终端中&#xff1a;npm init -y安装vue&#…

Chrome插件开发实战:todoList 插件

以下是一个适合小团队自用的 Chrome TodoList 插件开发示例&#xff0c;包含基础功能&#xff08;增删改查、本地存储、统计&#xff09;和简洁的交互设计。代码结构清晰&#xff0c;适合新手学习或快速上手。 一、项目准备 创建插件项目目录 todo-list-extension&#xff0c;…

【Redis数据库开启SSL加密】【小白指南】【生产环境可用】附带Docker服务器配置和python连接Redis数据库代码(加密通讯版)

【Redis数据库开启SSL加密】【填坑指南】附带服务器配置和python连接测试代码 本教程转为小白提供设置Redis安全访问&#xff0c;自签名证书进行安全访问你的Redis数据库&#xff0c;轻松实现安全访问和保护数据库不被非法入侵。 本文原创&#xff0c;转载请注明出处&#xff0…

笔记本电脑键盘失灵【已解决】

配置环境硬件详情笔记本电脑联想拯救者y7000 2019 PG0&#xff08;已更新为win11&#xff09;外接键盘colorful ckb-p100问题今天笔记本开机后&#xff0c;进入登录页面输入密码&#xff0c;突然发现笔记本自带键盘&#xff08;我通常不用外接键盘&#xff09;的键失灵了&#…

postgresql运维问题解决:PG集群备节点状态异常告警处理

小亦平台会持续给大家科普一些运维过程中常见的问题解决案例&#xff0c;运维朋友们可以在常见问题及解决方案专栏查看更多案例 问题概述&#xff1a; 故障&#xff1a; pg数据库备节点状态异常现象&#xff1a; 一般为集群间心跳超时导致,现象为集群有fail-count失败数告警&…