【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
英文地址,請注明出處:http://en.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失敗數告警&…