如何学习Doris:糙快猛的大数据之路(从入门到专家)

Doris学习之旅.png

引言:大数据世界的新玩家

还记得我第一次听说"Doris"这个名字时的情景吗?那是在一个炎热的夏日午后,我正在办公室里为接下来的大数据项目发愁。作为一个刚刚跨行到大数据领域的新手,我感觉自己就像是被丢进了深海的小鱼—周围全是陌生的概念和技术。

就在这时,我的导师拍了拍我的肩膀,说:“嘿,你听说过Doris吗?它可能是你需要的解决方案。”

我一脸茫然地看着他,心想:“Doris?这不是我奶奶的名字吗?”

于是,我的Doris学习之旅就这样开始了。今天,我想和大家分享我是如何以"糙快猛"的方式学习Doris的,希望能给同样面临学习新技术挑战的你一些启发。

目录

    • 引言:大数据世界的新玩家
    • Doris是什么?
    • 学习Doris的糙快猛之路
      • 1. 不求甚解,先跑起来
      • 2. 从简单查询开始
      • 3. 拥抱错误,快速迭代
      • 4. 利用AI助手,事半功倍
      • 总结:在不完美中前行
    • 深入Doris:从入门到进阶
      • 5. 掌握Doris的数据模型
        • 明细模型
        • 聚合模型
      • 6. 实践Doris的高级特性
        • 创建物化视图
      • 7. 性能调优:让Doris飞起来
      • 8. 融入生态:Doris的朋友们
    • 进阶之路:Doris的更多玩法
      • 9. 掌握Doris的数据导入方式
        • 批量导入
        • 实时导入
      • 10. Doris SQL的高级用法
        • 窗口函数
        • 复杂的JOIN操作
      • 11. Doris的高可用与扩展
        • FE高可用配置
        • 动态扩容
      • 12. Doris与AI的结合:预测性分析
    • 企业级应用:Doris在实战中的征程
      • 13. 企业级性能调优
        • 分区策略优化
        • 预聚合和物化视图优化
        • 合理使用索引
      • 14. Doris与数据湖的集成
      • 15. 实时数据分析案例
        • 实时数据导入
        • 实时聚合查询
      • 16. 机器学习模型部署与服务
    • Doris的未来:云原生与更多可能
      • 17. Doris与云原生的结合
        • 使用Helm部署Doris
        • 使用Operator管理Doris
      • 18. 大规模Doris集群的管理与优化
        • 自动化运维
        • 监控与告警
      • 19. Doris的安全性考虑
        • 认证与授权
        • 数据加密
      • 20. Doris的未来发展趋势
      • 21. 实战案例:全球化电商平台的数据分析
        • 需求
        • 解决方案
        • 核心SQL示例
    • Doris的多元化应用:跨行业案例研究
      • 22. 金融行业:实时风控系统
        • 需求
        • 解决方案
        • 核心实现
      • 23. 物联网(IoT):智能工厂数据分析
        • 需求
        • 解决方案
        • 核心实现
      • 24. 新零售:全渠道数据整合
        • 需求
        • 解决方案
        • 核心实现
      • 25. Doris与新兴技术的结合
        • 5G与边缘计算
        • AI与Doris的深度集成
        • 区块链数据分析
    • Doris的进阶之路:高级优化与生态系统集成
      • 26. Doris查询优化的艺术
        • 分区剪枝
        • 物化视图优化
        • 子查询优化
        • 使用EXPLAIN分析查询计划
      • 27. Doris与Hadoop生态系统的深度集成
        • 与Hive的集成
        • 与Spark的集成
        • 与Flink的集成
      • 28. Doris在复杂数据分析场景中的应用
        • 实时OLAP分析
        • 时序数据分析
        • 图数据分析
      • 29. Doris的未来:持续优化与创新
    • 结语:在技术的海洋中乘风破浪

Doris是什么?

image.png

在开始学习之前,我们先来简单了解一下Doris。

Apache Doris是一个现代化的MPP(大规模并行处理)分析型数据库,专为快速分析而生。它支持多维分析,能够处理结构化和半结构化数据,并提供亚秒级的查询响应时间。

简单来说,Doris就像是一个超级强大的Excel,可以处理海量数据,并且能快速给出你想要的分析结果。

学习Doris的糙快猛之路

1. 不求甚解,先跑起来

记得刚开始学Doris时,我看着那厚厚的文档,心里一阵发怵。但我很快想到了我的座右铭:“糙快猛,就是干!”

image.png

于是,我决定先不管那么多,把Doris安装运行起来再说。我找到了Doris的快速入门指南,照着步骤一步步来:

# 下载Doris
wget https://downloads.apache.org/doris/1.2/apache-doris-1.2.0-bin-x64.tar.gz# 解压
tar -xzvf apache-doris-1.2.0-bin-x64.tar.gz# 启动BE (Backend)
cd apache-doris-1.2.0-bin-x64/be
./bin/start_be.sh --daemon# 启动FE (Frontend)
cd ../fe
./bin/start_fe.sh --daemon

看着Doris成功启动,我兴奋地直拍大腿:“哎呀我去,这也太简单了吧!”

2. 从简单查询开始

image.png

有了运行的Doris,下一步就是尝试一些简单的操作。我决定先创建一个表,然后插入一些数据:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS my_first_doris;-- 使用数据库
USE my_first_doris;-- 创建表
CREATE TABLE my_table
(user_id INT,username VARCHAR(50),signup_date DATE
)
UNIQUE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;-- 插入数据
INSERT INTO my_table VALUES
(1, 'alice', '2023-01-01'),
(2, 'bob', '2023-01-02'),
(3, 'charlie', '2023-01-03');-- 查询数据
SELECT * FROM my_table;

看到查询结果出现在屏幕上,我忍不住喊了一声:“芜湖,起飞!”
image.png

3. 拥抱错误,快速迭代

学习的过程中难免会遇到错误。记得有一次,我试图导入一个大文件,结果遇到了内存不足的问题。我没有气馁,而是迅速查阅文档,找到了解决方案:

-- 设置会话变量,增加内存限制
SET exec_mem_limit = 2147483648;  -- 设置为2GB-- 然后重新尝试导入操作
LOAD LABEL my_first_doris.label_1
(DATA INFILE("hdfs://your-hdfs-path/large_file.csv")INTO TABLE my_large_tableCOLUMNS TERMINATED BY ","
)

每解决一个问题,我都会感到一阵成就感。这种不断尝试、犯错、解决的过程,让我的学习速度突飞猛进。

4. 利用AI助手,事半功倍

在学习过程中,我发现ChatGPT等大模型可以成为24小时不打烊的助教。每当遇到不懂的概念或复杂的查询,我就会向AI提问:

“能帮我解释一下Doris中的’前缀索引’是什么吗?”

“当然,Doris中的前缀索引是一种用于加速查询的数据结构。它主要用于字符串类型的列,通过索引字符串的前缀来提高查询效率。例如,如果你有一个很长的URL列,你可以创建一个前缀索引来加速对URL开头的搜索…”

有了AI的帮助,我的学习效率大大提高,不再因为一些小问题卡住很长时间。

总结:在不完美中前行

回顾我的Doris学习之路,我深刻体会到"糙快猛"学习方法的威力。它让我能够:

  1. 快速上手,不被繁复的细节所困扰
  2. 在实践中学习,加深对知识的理解
  3. 勇于尝试,从错误中吸取教训
  4. 充分利用现代工具,如AI助手,辅助学习

记住,学习新技术不需要一开始就追求完美。在不完美的状态下前行,反而可能是最高效的学习姿势。就像我从一个对大数据一无所知的新手,逐渐成长为能够熟练使用Doris的开发者,这个过程虽然充满挑战,但也充满了乐趣。

最后,我想对所有正在学习新技术的朋友说:别怕犯错,别怕不完美。拥抱"糙快猛"的学习方式,你会发现,原来技术学习可以这么有趣,这么高效!

现在,轮到你了。准备好开始你的Doris学习之旅了吗?记住,糙快猛,就是干!

深入Doris:从入门到进阶

既然我们已经踏上了Doris学习之路,不如再深入一些,探索Doris的更多特性和应用场景。记住,我们依然保持"糙快猛"的学习态度,但同时也要逐步提升技术深度。

5. 掌握Doris的数据模型

在使用Doris一段时间后,我意识到理解其数据模型对于优化查询性能至关重要。Doris主要支持两种数据模型:明细模型和聚合模型。

明细模型

明细模型适合存储原始数据,每一行数据代表一个独立的事件或实体。例如:

CREATE TABLE user_actions
(user_id INT,action_time DATETIME,action_type VARCHAR(20),action_detail VARCHAR(100)
)
UNIQUE KEY(user_id, action_time)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;
聚合模型

聚合模型则适合存储预聚合的数据,可以大大提高查询效率。例如:

CREATE TABLE daily_user_actions
(date_of_action DATE,user_id INT,action_type VARCHAR(20),action_count BIGINT SUM DEFAULT "0"
)
AGGREGATE KEY(date_of_action, user_id, action_type)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;

理解这两种模型后,我可以根据实际需求选择合适的模型,这对于优化存储和查询效率都很有帮助。

6. 实践Doris的高级特性

学习过程中,我发现Doris还有许多强大的高级特性。比如说,Doris的物化视图功能就让我眼前一亮。
image.png

创建物化视图
CREATE MATERIALIZED VIEW mv_daily_actions AS
SELECT date_of_action, action_type, COUNT(DISTINCT user_id) AS unique_users
FROM daily_user_actions
GROUP BY date_of_action, action_type;

创建物化视图后,当我需要查询每日每种操作的独立用户数时,Doris会自动使用这个物化视图,大大提高了查询速度。

7. 性能调优:让Doris飞起来

image.png

随着数据量的增加,我开始关注如何提升Doris的性能。除了选择合适的数据模型和使用物化视图外,我还学会了一些其他的调优技巧:

  1. 合理设置分桶数:

    ALTER TABLE my_table 
    DISTRIBUTED BY HASH(user_id) BUCKETS 20;
    
  2. 使用分区:

    ALTER TABLE daily_user_actions 
    ADD PARTITION p202307 VALUES LESS THAN ("2023-08-01");
    
  3. 设置合适的副本数:

    ALTER TABLE my_table 
    MODIFY PARTITION p202307 
    SET ("replication_num" = "3");
    

这些优化措施让我的Doris集群性能有了显著提升,查询速度飞快,我心里那个小人儿又开始得意地喊:“看我把Doris玩儿明白了吧!”

8. 融入生态:Doris的朋友们

在深入学习Doris的过程中,我发现Doris并不是孤立存在的,它可以很好地与其他大数据工具协同工作。比如:

  1. 使用Flink CDC实时同步MySQL数据到Doris
  2. 通过Spark读写Doris数据
  3. 使用DataX进行数据迁移

我尝试写了一个简单的Spark程序来读取Doris数据:

import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("DorisSparkReader").getOrCreate()val dorisDF = spark.read.format("doris").option("doris.table.identifier", "mydatabase.mytable").option("doris.fenodes", "fe_host:8030").load()dorisDF.show()

这段代码让我感叹:原来Doris可以这么轻松地与Spark集成!

进阶之路:Doris的更多玩法

在Doris的学习旅程中,我逐渐发现这个强大的MPP数据库系统还有很多有趣的特性和应用场景。让我们一起来探索一下Doris的更多玩法,继续我们的"糙快猛"学习之旅!

9. 掌握Doris的数据导入方式

image.png

随着项目的推进,我需要处理越来越多的数据导入任务。Doris提供了多种数据导入方式,每种都有其适用场景:

批量导入

对于大批量历史数据,我常用Stream Load:

curl --location-trusted -u root: -H "label:123" -H "column_separator:," -T data.csv http://fe_host:8030/api/example_db/example_tbl/_stream_load
实时导入

对于实时数据,我会使用Routine Load配合Kafka:

CREATE ROUTINE LOAD example_db.kafka_load ON example_tbl
COLUMNS TERMINATED BY ",",
COLUMNS(k1, k2, k3, v1, v2, v3)
PROPERTIES
("desired_concurrent_number"="3","max_batch_interval" = "20","max_batch_rows" = "300000","max_batch_size" = "209715200","strict_mode" = "false"
)
FROM KAFKA
("kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092","kafka_topic" = "my_topic","property.group.id" = "doris_consume_group","property.kafka_default_offsets" = "OFFSET_BEGINNING"
);

这段配置让我能够持续从Kafka读取数据并导入Doris,实现了近实时的数据分析。

10. Doris SQL的高级用法

随着对Doris的深入了解,我发现Doris的SQL功能非常强大,支持很多高级用法:

窗口函数

例如,计算用户行为的累计值:

SELECT user_id,action_time,action_type,SUM(action_count) OVER (PARTITION BY user_id ORDER BY action_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_actions
FROM user_actions;
复杂的JOIN操作

Doris支持多种JOIN类型,包括SEMI JOIN和ANTI JOIN:

SELECT a.user_id, a.username
FROM users a
LEFT SEMI JOIN (SELECT user_idFROM ordersGROUP BY user_idHAVING SUM(order_amount) > 1000
) b ON a.user_id = b.user_id;

这个查询可以高效地找出总订单金额超过1000的用户。

11. Doris的高可用与扩展

image.png

在生产环境中使用Doris,高可用性和可扩展性是必不可少的。我学会了如何配置Doris集群以实现这些目标:

FE高可用配置

配置多个Follower FE以确保元数据的高可用:

ALTER SYSTEM ADD FOLLOWER "fe_host:9010";
动态扩容

当数据量增长时,我可以动态添加BE节点:

ALTER SYSTEM ADD BACKEND "be_host:9050";

这些操作让我能够根据业务需求灵活调整Doris集群的规模和性能。

12. Doris与AI的结合:预测性分析

随着AI技术的普及,我开始探索如何将Doris与机器学习模型结合,实现预测性分析。虽然Doris本身不直接支持机器学习,但我们可以通过以下方式实现:

  1. 使用Doris进行数据预处理和特征工程
  2. 将处理后的数据导出到支持机器学习的平台(如Spark MLlib)
  3. 训练模型并生成预测结果
  4. 将预测结果导回Doris进行存储和进一步分析

例如,我们可以使用Doris预处理用户行为数据,然后使用Spark训练一个简单的推荐模型:

from pyspark.sql import SparkSession
from pyspark.ml.recommendation import ALS# 创建SparkSession
spark = SparkSession.builder.appName("DorisMLPipeline").getOrCreate()# 从Doris读取数据
doris_df = spark.read \.format("doris") \.option("doris.table.identifier", "example_db.user_behaviors") \.option("doris.fenodes", "fe_host:8030") \.load()# 使用ALS算法训练推荐模型
als = ALS(maxIter=5, regParam=0.01, userCol="user_id", itemCol="item_id", ratingCol="rating")
model = als.fit(doris_df)# 生成推荐结果
predictions = model.transform(doris_df)# 将结果写回Doris
predictions.write \.format("doris") \.option("doris.table.identifier", "example_db.item_recommendations") \.option("doris.fenodes", "fe_host:8030") \.save()

这个例子展示了如何利用Doris的数据处理能力,结合Spark的机器学习功能,实现一个简单的推荐系统。

企业级应用:Doris在实战中的征程

随着我在Doris上的技能不断提升,我有幸参与了几个大型企业项目。这些经历让我对Doris在企业环境中的应用有了更深入的理解。让我们一起来看看Doris在企业级应用中的一些实战经验和高级技巧。

13. 企业级性能调优

在处理海量数据时,性能调优变得尤为重要。以下是一些我在实践中总结的调优技巧:

分区策略优化

根据业务特点选择合适的分区策略是提升性能的关键。例如,对于时间序列数据:

CREATE TABLE sales_records (sale_date DATE,product_id INT,sale_amount DECIMAL(10, 2)
)
PARTITION BY RANGE(sale_date) (PARTITION p2021 VALUES LESS THAN ("2022-01-01"),PARTITION p2022 VALUES LESS THAN ("2023-01-01"),PARTITION p2023 VALUES LESS THAN ("2024-01-01")
)
DISTRIBUTED BY HASH(product_id) BUCKETS 32;

这种分区策略允许我们快速定位和查询特定时间范围的数据。

预聚合和物化视图优化

对于常见的聚合查询,我们可以创建预聚合表或物化视图:

CREATE MATERIALIZED VIEW mv_daily_sales AS
SELECT sale_date, product_id, SUM(sale_amount) as total_sales
FROM sales_records
GROUP BY sale_date, product_id;

这样可以大大提高聚合查询的性能。

合理使用索引

Doris支持前缀索引,合理使用可以显著提升查询性能:

ALTER TABLE sales_records ADD INDEX idx_product (product_id) USING BITMAP;

14. Doris与数据湖的集成

在一个大型数据分析项目中,我们需要将Doris与Hudi数据湖集成。这涉及到了Doris的外部表功能:

CREATE EXTERNAL TABLE ext_hudi_table (id INT,name STRING,age INT,ts DATETIME
)
ENGINE=hudi
PROPERTIES ("hudi.database.name" = "default","hudi.table.name" = "hudi_table","hudi.table.type" = "COPY_ON_WRITE","hudi.streaming.read.enable" = "true","hudi.streaming.read.start.commit" = "20230101000000","hive.metastore.uris" = "thrift://localhost:9083"
);

这允许我们在Doris中直接查询Hudi数据,实现了数据湖和数据仓库的无缝集成。

15. 实时数据分析案例

在一个电商平台的实时数据分析项目中,我们使用Doris实现了近实时的销售数据分析。这涉及到了Doris的实时数据导入和快速聚合查询能力。

实时数据导入

我们使用Flink CDC来捕获MySQL中的实时订单数据,然后通过Doris的Stream Load API实时写入Doris:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();MySqlSource<String> mySqlSource = MySqlSource.<String>builder().hostname("mysql_host").port(3306).databaseList("retail_db").tableList("retail_db.orders").username("username").password("password").deserializer(new JsonDebeziumDeserializationSchema()).build();env.fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source").addSink(new DorisStreamLoad<>("fe_host", 8030, "retail_db", "realtime_orders"));env.execute("MySQL to Doris CDC");
实时聚合查询

然后,我们可以在Doris中进行实时的聚合查询:

SELECT DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00') AS hour,SUM(order_amount) AS total_sales,COUNT(DISTINCT user_id) AS unique_customers
FROM realtime_orders
WHERE order_time >= DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00')
ORDER BY hour DESC;

这个查询可以实时显示过去24小时内每小时的销售额和独立客户数。

16. 机器学习模型部署与服务

在之前的内容中,我们讨论了如何使用Spark MLlib与Doris结合进行机器学习。现在,让我们更进一步,看看如何将训练好的模型部署到生产环境中,并与Doris集成以提供实时预测服务。

我们可以使用Flask创建一个简单的预测服务,然后通过Doris的自定义函数(UDF)来调用这个服务:

  1. 首先,创建一个Flask应用来提供预测服务:
from flask import Flask, request, jsonify
import joblibapp = Flask(__name__)
model = joblib.load('recommendation_model.pkl')@app.route('/predict', methods=['POST'])
def predict():data = request.jsonprediction = model.predict(data['user_id'], data['item_id'])return jsonify({'prediction': float(prediction)})if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
  1. 然后,在Doris中创建一个UDF来调用这个预测服务:
CREATE FUNCTION predict_rating(user_id INT, item_id INT) RETURNS DOUBLE PROPERTIES ("type" = "JAVA_UDF","file" = "file:///path/to/predict_udf.jar","class" = "com.example.doris.udf.PredictRating","method" = "evaluate"
);
  1. 在Java UDF中实现对预测服务的调用:
public class PredictRating extends ScalarFunction {public Double evaluate(Integer userId, Integer itemId) {// 调用预测服务的逻辑// 返回预测结果}
}
  1. 现在我们可以在Doris中直接使用这个UDF进行预测:
SELECT user_id, item_id, predict_rating(user_id, item_id) AS predicted_rating
FROM user_item_interactions
WHERE predict_rating(user_id, item_id) > 4.0;

这个查询可以找出模型预测评分高于4.0的所有用户-物品对,可以用于推荐系统。

Doris的未来:云原生与更多可能

随着我在Doris领域的不断深入,我开始关注更多前沿的应用场景和技术趋势。在这个快速发展的大数据时代,Doris也在不断进化,适应新的技术生态。让我们一起探索Doris在云原生环境中的应用,以及它的未来发展方向。

17. Doris与云原生的结合

image.png

随着云计算的普及,将Doris部署在云环境中变得越来越常见。我们来看看如何在Kubernetes (K8s)环境中部署和管理Doris。

使用Helm部署Doris

Helm是Kubernetes的包管理工具,我们可以使用它来简化Doris的部署过程。

  1. 首先,创建一个Doris的Helm Chart:
# Chart.yaml
apiVersion: v2
name: doris
description: A Helm chart for Apache Doris on Kubernetes
version: 0.1.0
appVersion: "1.0.0"# values.yaml
fe:replicaCount: 3image:repository: apache/doristag: "1.0.0-fe"
be:replicaCount: 5image:repository: apache/doristag: "1.0.0-be"
  1. 使用Helm部署Doris:
helm install my-doris ./doris

这种方式让我们可以更灵活地管理Doris集群,轻松实现扩缩容和版本升级。

使用Operator管理Doris

为了更好地在K8s中管理Doris,社区正在开发Doris Operator。这让我们可以用Kubernetes原生的方式来管理Doris集群。

apiVersion: doris.apache.org/v1
kind: DorisCluster
metadata:name: example-doris-cluster
spec:fe:replicas: 3resources:requests:cpu: "2"memory: "4Gi"be:replicas: 5resources:requests:cpu: "4"memory: "16Gi"

使用Operator,我们可以更方便地管理Doris的生命周期,包括升级、扩缩容、备份恢复等操作。

18. 大规模Doris集群的管理与优化

随着数据量的增长,我们可能需要管理包含数百个节点的大规模Doris集群。这里有一些我学到的管理技巧:

自动化运维

使用Ansible或Terraform等工具来自动化集群的部署和管理:

- name: Deploy Doris Clusterhosts: alltasks:- name: Install Dorisansible.builtin.yum:name: dorisstate: present- name: Start Doris serviceansible.builtin.service:name: dorisstate: started
监控与告警

使用Prometheus和Grafana来监控Doris集群的健康状态:

global:scrape_interval: 15sscrape_configs:- job_name: 'doris'static_configs:- targets: ['doris-fe:8030', 'doris-be:8040']

19. Doris的安全性考虑

在企业环境中,数据安全至关重要。Doris提供了多层次的安全机制:
image.png

认证与授权

使用LDAP集成实现统一的用户认证:

ADMIN SET FRONTEND CONFIG ("authentication_ldap_simple_server_host" = "ldap://ldap.example.com","authentication_ldap_simple_bind_root_dn" = "cn=admin,dc=example,dc=com","authentication_ldap_simple_bind_root_pwd" = "admin_password"
);
数据加密

启用数据传输加密和存储加密:

ADMIN SET FRONTEND CONFIG ("enable_ssl" = "true","ssl_certificate_path" = "/path/to/server.crt","ssl_private_key_path" = "/path/to/server.key"
);

20. Doris的未来发展趋势

作为一个快速发展的开源项目,Doris正在向着更强大、更灵活的方向发展。以下是一些值得关注的趋势:

  1. 云原生支持的增强:更好地支持容器化部署和云环境。
  2. AI集成:深度集成机器学习和人工智能能力。
  3. 实时分析能力的提升:支持更低延迟的实时数据分析。
  4. 多模态数据支持:除结构化数据外,支持半结构化和非结构化数据的分析。
  5. 生态系统的扩展:与更多大数据和AI工具的集成。

21. 实战案例:全球化电商平台的数据分析

让我们通过一个具体的案例来看看Doris如何在一个全球化电商平台中发挥作用:

需求
  • 实时监控全球销售数据
  • 支持跨地域的数据分析
  • 处理高并发的用户查询请求
解决方案
  1. 多地域部署
    在主要市场部署Doris集群,使用Doris的跨集群复制功能同步数据。

  2. 实时数据接入
    使用Kafka + Flink CDC捕获订单数据,实时写入Doris。

  3. 查询性能优化

    • 使用分区 + 分桶策略优化数据分布
    • 创建适当的物化视图加速常用查询
  4. 可视化
    集成Superset作为BI工具,提供直观的数据可视化界面。

核心SQL示例
-- 创建跨地域销售分析表
CREATE TABLE global_sales (order_id BIGINT,user_id BIGINT,product_id BIGINT,order_time DATETIME,amount DECIMAL(10, 2),region VARCHAR(20)
)
PARTITION BY RANGE(order_time) (PARTITION p2023_Q1 VALUES LESS THAN ('2023-04-01'),PARTITION p2023_Q2 VALUES LESS THAN ('2023-07-01'),PARTITION p2023_Q3 VALUES LESS THAN ('2023-10-01'),PARTITION p2023_Q4 VALUES LESS THAN ('2024-01-01')
)
DISTRIBUTED BY HASH(order_id) BUCKETS 48;-- 创建实时销售趋势物化视图
CREATE MATERIALIZED VIEW mv_hourly_sales AS
SELECT DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00') AS hour,region,SUM(amount) AS total_sales,COUNT(DISTINCT user_id) AS unique_users
FROM global_sales
GROUP BY DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00'), region;-- 查询最近24小时各地区销售趋势
SELECT hour, region, total_sales, unique_users
FROM mv_hourly_sales
WHERE hour >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
ORDER BY hour DESC, total_sales DESC;

这个案例展示了Doris如何在复杂的全球化业务场景中提供高性能、实时的数据分析能力。

Doris的多元化应用:跨行业案例研究

在我们的Doris学习之旅中,我们已经探讨了很多技术细节和通用应用场景。现在,让我们深入到几个具体的行业,看看Doris如何在这些领域发挥其强大的分析能力。同时,我们也将探讨Doris如何与新兴技术结合,开创更多可能性。

22. 金融行业:实时风控系统

image.png

在金融行业,实时风险控制是一个关键的应用场景。让我们看看如何使用Doris构建一个高效的实时风控系统。

需求
  • 实时处理交易数据
  • 快速识别潜在的欺诈交易
  • 支持复杂的多维度分析
解决方案
  1. 数据接入:使用Kafka实时接入交易数据
  2. 实时计算:利用Doris的流式导入功能实时处理数据
  3. 风险评分:使用Doris的UDF功能实现复杂的风险评分算法
  4. 实时告警:基于评分结果触发实时告警
核心实现
-- 创建实时交易表
CREATE TABLE realtime_transactions (transaction_id BIGINT,user_id BIGINT,amount DECIMAL(15, 2),transaction_time DATETIME,location VARCHAR(50),device_id VARCHAR(50),risk_score DOUBLE DEFAULT "0"
)
PARTITION BY RANGE(transaction_time) (PARTITION p2023_1 VALUES LESS THAN ("2023-07-01"),PARTITION p2023_2 VALUES LESS THAN ("2024-01-01")
)
DISTRIBUTED BY HASH(transaction_id) BUCKETS 32;-- 创建风险评分UDF
CREATE FUNCTION calculate_risk_score(amount DOUBLE, location STRING, device_id STRING) 
RETURNS DOUBLE PROPERTIES ("file"="hdfs://path/to/risk_score_udf.jar","symbol"="com.example.RiskScoreUDF","type"="JAVA_UDF"
);-- 创建实时风险评估视图
CREATE MATERIALIZED VIEW mv_risk_assessment AS
SELECT transaction_id,user_id,amount,transaction_time,calculate_risk_score(amount, location, device_id) AS risk_score
FROM realtime_transactions;-- 查询高风险交易
SELECT * FROM mv_risk_assessment
WHERE risk_score > 0.8
ORDER BY transaction_time DESC
LIMIT 100;

这个方案允许我们实时计算每笔交易的风险分数,并快速识别高风险交易。

23. 物联网(IoT):智能工厂数据分析

image.png

随着工业4.0的推进,智能工厂成为了一个热门话题。Doris如何在这样的场景中发挥作用呢?

需求
  • 实时收集和分析海量传感器数据
  • 预测设备故障
  • 优化生产流程
解决方案
  1. 边缘计算:在工厂本地部署Doris边缘节点,实现数据的初步处理
  2. 数据同步:将汇总后的数据同步到云端Doris集群
  3. 实时监控:创建仪表板实时监控生产状态
  4. 预测性维护:利用Doris对接机器学习模型,预测设备故障
核心实现
-- 创建边缘节点的传感器数据表
CREATE TABLE edge_sensor_data (sensor_id INT,timestamp DATETIME,temperature DOUBLE,pressure DOUBLE,vibration DOUBLE
)
PARTITION BY RANGE(timestamp) (PARTITION p2023_Q3 VALUES LESS THAN ("2023-10-01"),PARTITION p2023_Q4 VALUES LESS THAN ("2024-01-01")
)
DISTRIBUTED BY HASH(sensor_id) BUCKETS 16;-- 创建云端汇总表
CREATE TABLE cloud_sensor_summary (sensor_id INT,hour DATETIME,avg_temperature DOUBLE,avg_pressure DOUBLE,avg_vibration DOUBLE,anomaly_score DOUBLE DEFAULT "0"
)
PARTITION BY RANGE(hour) (PARTITION p2023_Q3 VALUES LESS THAN ("2023-10-01"),PARTITION p2023_Q4 VALUES LESS THAN ("2024-01-01")
)
DISTRIBUTED BY HASH(sensor_id) BUCKETS 32;-- 在边缘节点创建汇总任务
INSERT INTO cloud_sensor_summary
SELECT sensor_id,DATE_TRUNC('HOUR', timestamp) AS hour,AVG(temperature) AS avg_temperature,AVG(pressure) AS avg_pressure,AVG(vibration) AS avg_vibration
FROM edge_sensor_data
GROUP BY sensor_id, DATE_TRUNC('HOUR', timestamp);-- 在云端创建异常检测视图
CREATE MATERIALIZED VIEW mv_anomaly_detection AS
SELECT *,detect_anomaly(avg_temperature, avg_pressure, avg_vibration) AS anomaly_score
FROM cloud_sensor_summary;-- 查询可能的异常
SELECT * FROM mv_anomaly_detection
WHERE anomaly_score > 0.7
ORDER BY hour DESC, anomaly_score DESC
LIMIT 50;

这个方案实现了从边缘到云端的数据处理流程,并能够实时检测潜在的设备异常。

24. 新零售:全渠道数据整合

新零售模式要求将线上和线下渠道的数据进行无缝整合。Doris如何助力这一过程呢?
image.png

需求
  • 整合线上和线下销售数据
  • 实时库存管理
  • 个性化推荐
解决方案
  1. 数据整合:使用Doris的外部表功能连接不同数据源
  2. 实时同步:利用Flink CDC实时捕获变更数据
  3. 统一分析:创建跨渠道的统一分析视图
  4. 个性化推荐:结合机器学习模型,实现实时个性化推荐
核心实现
-- 创建线上销售外部表
CREATE EXTERNAL TABLE online_sales (order_id BIGINT,user_id BIGINT,product_id BIGINT,quantity INT,price DECIMAL(10, 2),order_time DATETIME
)
ENGINE=MYSQL
PROPERTIES ("host" = "mysql_host","port" = "3306","user" = "username","password" = "password","database" = "online_db","table" = "sales"
);-- 创建线下销售表
CREATE TABLE offline_sales (transaction_id BIGINT,store_id INT,product_id BIGINT,quantity INT,price DECIMAL(10, 2),transaction_time DATETIME
)
PARTITION BY RANGE(transaction_time) (PARTITION p2023_Q3 VALUES LESS THAN ("2023-10-01"),PARTITION p2023_Q4 VALUES LESS THAN ("2024-01-01")
)
DISTRIBUTED BY HASH(transaction_id) BUCKETS 32;-- 创建统一销售视图
CREATE MATERIALIZED VIEW mv_unified_sales AS
SELECT 'online' AS channel,product_id,SUM(quantity) AS total_quantity,SUM(quantity * price) AS total_revenue,COUNT(DISTINCT user_id) AS unique_customers
FROM online_sales
GROUP BY product_idUNION ALLSELECT 'offline' AS channel,product_id,SUM(quantity) AS total_quantity,SUM(quantity * price) AS total_revenue,COUNT(DISTINCT transaction_id) AS unique_transactions
FROM offline_sales
GROUP BY product_id;-- 查询跨渠道销售表现
SELECT product_id,SUM(CASE WHEN channel = 'online' THEN total_revenue ELSE 0 END) AS online_revenue,SUM(CASE WHEN channel = 'offline' THEN total_revenue ELSE 0 END) AS offline_revenue,SUM(total_revenue) AS total_revenue
FROM mv_unified_sales
GROUP BY product_id
ORDER BY total_revenue DESC
LIMIT 20;

这个方案实现了线上线下数据的无缝整合,为全渠道分析提供了基础。

25. Doris与新兴技术的结合

随着技术的不断发展,Doris也在与新兴技术不断融合,开创新的应用场景。

5G与边缘计算

5G的低延迟特性与边缘计算相结合,可以实现更接近数据源的实时分析。我们可以在边缘节点部署轻量级的Doris集群,处理本地数据,然后将汇总结果传输到中心Doris集群。

# 在边缘节点部署Doris
docker run -d --name doris-edge \-p 8030:8030 -p 9020:9020 -p 9030:9030 \-v /path/to/doris/config:/opt/apache-doris/conf \apache/doris:1.2.0
AI与Doris的深度集成

image.png

随着AI技术的发展,我们可以考虑将更多的AI能力直接集成到Doris中:

  1. 向量检索:支持高效的向量相似度查询,用于推荐系统或图像检索。
  2. 自然语言处理:集成NLP模型,支持文本数据的语义分析。
  3. 时间序列预测:内置时间序列预测算法,用于销售预测、设备监控等场景。
-- 假设未来Doris支持向量检索
CREATE TABLE product_embeddings (product_id BIGINT,embedding VECTOR(128)  -- 128维的产品向量表示
)
ENGINE=VECTORINDEX
PROPERTIES ("index_type" = "HNSW","metric_type" = "L2"
);-- 查询相似产品
SELECT product_id, L2_distance(embedding, [0.1, 0.2, ...]) AS distance
FROM product_embeddings
ORDER BY distance ASC
LIMIT 10;
区块链数据分析

随着区块链技术的成熟,分析区块链数据成为一个新的需求。Doris可以作为区块链数据的分析引擎:

CREATE TABLE blockchain_transactions (block_number BIGINT,transaction_hash VARCHAR(66),from_address VARCHAR(42),to_address VARCHAR(42),value DECIMAL(38, 18),gas_price BIGINT,timestamp DATETIME
)
PARTITION BY RANGE(block_number) (PARTITION p0 VALUES LESS THAN (10000000),PARTITION p1 VALUES LESS THAN (20000000)
)
DISTRIBUTED BY HASH(transaction_hash) BUCKETS 64;-- 分析大额交易
SELECT DATE_TRUNC('DAY', timestamp) AS date,COUNT(*) AS large_tx_count,SUM(value) AS total_value
FROM blockchain_transactions
WHERE value > 100  -- 假设单位是ETH
GROUP BY DATE_TRUNC('DAY', timestamp)
ORDER BY date DESC;

Doris的进阶之路:高级优化与生态系统集成

在我们的Doris学习旅程中,我们已经探讨了许多基础概念、应用场景和行业案例。现在,让我们深入到一些更高级的主题,包括性能优化技巧、与其他大数据技术的深度集成,以及在复杂数据分析场景中的应用。这些知识将帮助我们在实际项目中更好地发挥Doris的潜力。

26. Doris查询优化的艺术

随着数据量的增长和查询复杂度的提高,查询优化成为了一个关键话题。让我们探讨一些高级的查询优化技巧。

分区剪枝

合理的分区设计可以大大提高查询效率:

-- 优化前
CREATE TABLE sales_data (sale_date DATE,product_id INT,amount DECIMAL(10, 2)
)
DISTRIBUTED BY HASH(product_id) BUCKETS 32;-- 优化后
CREATE TABLE sales_data (sale_date DATE,product_id INT,amount DECIMAL(10, 2)
)
PARTITION BY RANGE(sale_date) (PARTITION p2023_01 VALUES LESS THAN ('2023-02-01'),PARTITION p2023_02 VALUES LESS THAN ('2023-03-01'),...
)
DISTRIBUTED BY HASH(product_id) BUCKETS 32;-- 优化后的查询可以利用分区剪枝
SELECT SUM(amount)
FROM sales_data
WHERE sale_date BETWEEN '2023-01-01' AND '2023-01-31';
物化视图优化

为常用的聚合查询创建物化视图:

-- 创建物化视图
CREATE MATERIALIZED VIEW mv_daily_sales AS
SELECT sale_date,product_id,SUM(amount) AS total_amount,COUNT(DISTINCT product_id) AS product_count
FROM sales_data
GROUP BY sale_date, product_id;-- 查询将自动使用物化视图
SELECT sale_date, SUM(total_amount)
FROM sales_data
GROUP BY sale_date;
子查询优化

将复杂的子查询改写为JOIN,可能会提高性能:

-- 优化前
SELECT *
FROM orders
WHERE customer_id IN (SELECT idFROM customersWHERE region = 'North'
);-- 优化后
SELECT o.*
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE c.region = 'North';
使用EXPLAIN分析查询计划
EXPLAIN SELECT * FROM sales_data WHERE sale_date > '2023-01-01';

通过分析执行计划,我们可以找出潜在的性能瓶颈,如全表扫描、低效的JOIN等。

27. Doris与Hadoop生态系统的深度集成

image.png

Doris作为一个开放的系统,可以与Hadoop生态系统的多个组件进行深度集成,从而构建更强大的数据分析平台。

与Hive的集成

通过创建外部表,我们可以在Doris中查询Hive的数据:

CREATE EXTERNAL TABLE ext_hive_table (id INT,name STRING,age INT
)
ENGINE=HIVE
PROPERTIES ("hive.metastore.uris" = "thrift://metastore_host:9083","database" = "default","table" = "hive_table"
);-- 现在可以直接查询Hive的数据了
SELECT * FROM ext_hive_table WHERE age > 30;
与Spark的集成

使用Spark-Doris-Connector,我们可以在Spark中高效地读写Doris数据:

import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("DorisSparkExample").getOrCreate()// 读取Doris数据
val dorisDf = spark.read.format("doris").option("doris.table.identifier", "example_db.table_name").option("doris.fenodes", "fe_host:8030").load()// 处理数据
val resultDf = dorisDf.groupBy("column_name").count()// 写回Doris
resultDf.write.format("doris").option("doris.table.identifier", "example_db.result_table").option("doris.fenodes", "fe_host:8030").save()
与Flink的集成

使用Flink-Doris-Connector,我们可以实现实时数据处理和分析:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);// 创建Doris表
tEnv.executeSql("CREATE TABLE doris_table (" +"    id INT," +"    name STRING," +"    age INT" +") WITH (" +"    'connector' = 'doris'," +"    'fenodes' = 'fe_host:8030'," +"    'table.identifier' = 'example_db.table_name'," +"    'username' = 'root'," +"    'password' = ''" +")");// 执行查询
tEnv.executeSql("SELECT age, COUNT(*) as count FROM doris_table GROUP BY age").print();env.execute();

28. Doris在复杂数据分析场景中的应用

随着数据分析需求的日益复杂,Doris也在不断进化以满足这些需求。让我们看看Doris如何应对一些复杂的数据分析场景。

实时OLAP分析

假设我们需要构建一个实时的用户行为分析系统:

-- 创建实时用户行为表
CREATE TABLE user_behaviors (user_id BIGINT,event_time DATETIME,event_type VARCHAR(20),page_id VARCHAR(50),session_id VARCHAR(50)
)
PARTITION BY RANGE(event_time) (PARTITION p2023_07 VALUES LESS THAN ('2023-08-01'),PARTITION p2023_08 VALUES LESS THAN ('2023-09-01')
)
DISTRIBUTED BY HASH(user_id) BUCKETS 32;-- 创建实时会话分析视图
CREATE MATERIALIZED VIEW mv_session_analysis AS
SELECT session_id,MIN(event_time) AS session_start,MAX(event_time) AS session_end,COUNT(*) AS event_count,COUNT(DISTINCT page_id) AS unique_pages
FROM user_behaviors
GROUP BY session_id;-- 实时查询长会话
SELECT *
FROM mv_session_analysis
WHERE TIMESTAMPDIFF(MINUTE, session_start, session_end) > 30
ORDER BY event_count DESC
LIMIT 100;

这个例子展示了如何使用Doris进行实时的会话分析,可以快速识别长时间和高互动的用户会话。

时序数据分析

对于IoT或金融等领域的时序数据分析,Doris也能够胜任:

-- 创建时序数据表
CREATE TABLE sensor_data (sensor_id INT,timestamp DATETIME,temperature DOUBLE,humidity DOUBLE,pressure DOUBLE
)
PARTITION BY RANGE(timestamp) (PARTITION p2023_Q3 VALUES LESS THAN ('2023-10-01'),PARTITION p2023_Q4 VALUES LESS THAN ('2024-01-01')
)
DISTRIBUTED BY HASH(sensor_id) BUCKETS 32;-- 时序聚合分析
SELECT sensor_id,DATE_TRUNC('hour', timestamp) AS hour,AVG(temperature) AS avg_temp,MAX(temperature) AS max_temp,MIN(temperature) AS min_temp,AVG(humidity) AS avg_humidity,AVG(pressure) AS avg_pressure
FROM sensor_data
WHERE timestamp BETWEEN '2023-07-01' AND '2023-07-31'
GROUP BY sensor_id, DATE_TRUNC('hour', timestamp)
ORDER BY sensor_id, hour;-- 使用窗口函数进行滑动平均分析
SELECT sensor_id,timestamp,temperature,AVG(temperature) OVER (PARTITION BY sensor_idORDER BY timestampROWS BETWEEN 5 PRECEDING AND CURRENT ROW) AS moving_avg_temp
FROM sensor_data
WHERE sensor_id = 1
ORDER BY timestamp;

这个例子展示了如何使用Doris进行时序数据的聚合分析和滑动窗口分析。

图数据分析

尽管Doris不是专门的图数据库,但我们可以使用它来进行一些基本的图分析:

-- 创建边表
CREATE TABLE edges (source_id BIGINT,target_id BIGINT,weight DOUBLE
)
DISTRIBUTED BY HASH(source_id) BUCKETS 32;-- 查找两跳邻居
WITH one_hop AS (SELECT DISTINCT target_idFROM edgesWHERE source_id = 1
),
two_hop AS (SELECT DISTINCT e.target_idFROM one_hop ohJOIN edges e ON oh.target_id = e.source_idWHERE e.target_id != 1
)
SELECT * FROM two_hop;-- 计算页面排名(简化版)
CREATE TABLE page_rank (node_id BIGINT,rank DOUBLE
)
DISTRIBUTED BY HASH(node_id) BUCKETS 32;-- 迭代计算页面排名(这里只展示一次迭代)
INSERT INTO page_rank
SELECT e.target_id AS node_id,SUM(pr.rank / out_degree.cnt) AS rank
FROM edges e
JOIN page_rank pr ON e.source_id = pr.node_id
JOIN (SELECT source_id, COUNT(*) AS cntFROM edgesGROUP BY source_id
) out_degree ON e.source_id = out_degree.source_id
GROUP BY e.target_id;

这个例子展示了如何使用Doris进行简单的图分析,包括查找两跳邻居和简化版的PageRank计算。

29. Doris的未来:持续优化与创新

作为一个快速发展的开源项目,Doris正在不断优化和创新。以下是一些值得期待的方向:
image.png

  1. 查询优化器的持续改进:更智能的CBO(基于代价的优化器)和RBO(基于规则的优化器)。
  2. 更好的存储引擎:支持列存和行存的混合存储,以适应不同的查询模式。
  3. 增强的AI集成:内置更多机器学习算法,支持更复杂的预测和分类任务。
  4. 更强大的实时分析能力:优化流式数据处理,支持更低延迟的实时分析。
  5. 云原生支持的加强:更好地支持K8s等云原生环境,简化部署和运维。

image.png

结语:在技术的海洋中乘风破浪

回顾我们的Doris学习之旅,从最初的基础概念到现在探讨高级优化技巧和复杂分析场景,我们见证了Doris的强大、灵活和不断进化的特性。这个旅程不仅是对Doris的深入探索,更是对整个大数据生态系统和分析技术的全面认识。

在这个技术快速迭代的时代,"糙快猛"的学习方法让我们能够快速适应新技术,在实践中学习和成长。但同时,我们也要记住,真正的技术精进来自于在"糙快猛"的基础上的不断思考、实践和创新。

对于所有正在或即将开始Doris学习之旅的朋友,我想说:

  1. 保持好奇心:技术世界永远充满新知识,保持对新事物的好奇和学习的热情。
  2. 深入原理:不要满足于表面的应用,要深入理解Doris的内部原理,这将帮助你更好地优化和排障。
  3. 跨界思考:将Doris与其他技术结合,思考如何在更广阔的场景中应用它。
  4. 实践为王:纸上得来终觉浅,绝知此事要躬行。不断在实际项目中应用所学,才能真正掌握。
  5. 回馈社区:将你的经验、发现甚至代码贡献给社区,推动Doris的发展,也提升

image.png

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

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

相关文章

嵌入式Python、ROS、SLAM、WebSocket和Node.js:智能巡逻监控安防机器人设计流程(代码示例)

项目概述 随着智能技术的发展&#xff0c;智能巡逻机器人在安防、监控和巡逻等领域的应用越来越广泛。本文将介绍一个结合嵌入式系统、机器人技术和后端开发的智能巡逻机器人。该机器人能够自主导航&#xff0c;实时检测异常情况&#xff08;如火灾或入侵者&#xff09;&#…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十七章 Linux中断实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

AI绘画:艺术与科技融合的新篇章

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI绘画作为一种新兴的艺术形式&#xff0c;正逐步改变着传统艺术创作的格局。从早期的简单模仿到如今的个性化创作&#xff0c;AI绘画不仅提升了艺术创作的效率和质量&#xff0c;还开辟了全新的应用场景和商…

C++模板——泛型编程

目录 1. 什么是泛型编程 2. 函数模板 2.1 定义格式 2.2 实例化及原理 2.3 参数匹配原则 3. 类模板 3.1 定义格式 3.2 实例化 4. 非类型模板参数 5. 模板的特化 5.1 概念 5.2 函数模板和类模板特化 6. 模板的分离编译 1. 什么是泛型编程 如何实现一个通用的加…

【Java算法专场】二分查找(下)

目录 山脉数组的峰顶索引 算法分析 算法步骤 算法代码 算法示例 寻找峰值 算法分析 算法步骤 算法代码 算法示例 寻找旋转排序数组中的最小值 算法分析 算法步骤 算法代码 算法示例 点名 算法分析 算法步骤 算法代码 算法示例 山脉数组的峰顶索引 …

TCP/IP协议(全的一b)应用层,数据链层,传输层,网络层,以及面试题

目录 TCP/IP协议介绍 协议是什么,有什么作用? 网络协议为什么要分层 TCP/IP五层网络协议每层的作用 应⽤层 DNS的作用及原理 DNS工作流程 数据链路层 以太⽹帧格式 MAC地址的作用 ARP协议的作⽤ ARP协议的工作流程 MTU以及MTU对 IP / UD / TCP 协议的影响 传输层…

数据结构之判断二叉树是否为搜索树(C/C++实现)

文章目录 判断二叉树是否为搜索树方法一&#xff1a;递归法方法二&#xff1a;中序遍历法总结 二叉树是一种非常常见的数据结构&#xff0c;它在计算机科学中有着广泛的应用。二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是二叉树的一种特殊形式&…

自动化测试--WebDriver API

1. 元素定位方法 通过 ID 定位&#xff1a;如果元素具有唯一的 ID 属性&#xff0c;可以使用 findElement(By.id("elementId")) 方法来定位元素。通过 Name 定位&#xff1a;使用 findElement(By.name("elementName")) 来查找具有指定名称的元素。通过 Cl…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 5键键盘(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

Linux常用操作

软件安装 CentOS 系统使用&#xff1a; yum [install remove search] [-y] 软件名称 install 安装 remove 卸载 search 搜索 -y &#xff0c;自动确认 Ubuntu 系统使用 apt [install remove search] [-y] 软件名称 install 安装 remove 卸载 search 搜索 -y…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十六章 自动创建设备节点

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

前端播放rtsp视频流(最后使用WebRtc)

前端播放rtsp视频流&#xff08;最后使用WebRtc&#xff09; 前言&#xff1a; ​ 项目需要将实验室里的摄像头画面引入到前端页面中&#xff0c;故对目前常见的几种方法进行了尝试&#xff0c;虽然过程坎坷但结局是好的。 一些尝试&#xff1a; RTSPtoWebRtc工具 由于RTSPt…

opengl 写一个3D立方体——计算机图形学编程 第4章 管理3D图形数据 笔记

计算机图形学编程&#xff08;使用OpenGL和C&#xff09; 第4章 管理3D图形数据 笔记 数据处理 想要绘制一个对象&#xff0c;它的顶点数据需要发送给顶点着色器。通常会把顶点数据在C端放入 一个缓冲区&#xff0c;并把这个缓冲区和着色器中声明的顶点属性相关联。 初始化立…

力扣 二分查找

二分查找基础篇。 题目 class Solution {public int searchInsert(int[] nums, int target) {int l 0, r nums.length - 1;while(l < r) {int mid l((r-l)>>1);//(lr)/2if(nums[mid]<target)lmid1;else rmid-1;}return l;//处理边界&#xff0c;设定数组的左半…

21 Python常用内置函数——zip()

zip() 函数用来把多个可迭代对象中的元素压缩到一起&#xff0c;返回一个可迭代的 zip 对象&#xff0c;其中每个元素都是包含原来的多个可迭代对象对应位置上元素的元组&#xff0c;最终结果中包含的元素个数取决于所有参数序列或可迭代对象中最短的那个。 可以这样理解这个函…

论文阅读——Design of Environmental backscatter tag antenna for 5G Internet of things

文章目录 摘要一、背景二、系统模型三、天线设计A. 指标B. 天线结构描述C. 天线结构优化D. 天线结构确定 四、仿真结果总结 论文来源&#xff1a;https://ieeexplore.ieee.org/document/9379395 摘要 文章针对传统设备识别在电力物联网场景中存在的可靠性低和读取距离不足的问…

Java智慧养老养老护理帮忙代办陪诊陪护小程序系统源码

&#x1f31f;智慧养老新风尚&#xff0c;护理代办陪诊小程序来帮忙✨ &#x1f3e1;【开篇&#xff1a;关爱老人&#xff0c;从智慧养老开始】&#x1f3e1; 随着社会的进步&#xff0c;智慧养老已成为新时代孝心的体现。面对忙碌的生活节奏&#xff0c;如何更好地照顾家中长…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十九章 等待队列

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

电力系统 | 发电、输电、变电、配电、用电介绍 | 一度电从电厂发出来到用户终端需要经历哪些环节 | 变电站建在哪里

文章目录 一、一度电从电厂发出来到用户终端需要经历哪些环节&#xff1f;二、发电、变电、输电、配售电和用电过程介绍三、变电站建在哪里&#xff1f; 一、一度电从电厂发出来到用户终端需要经历哪些环节&#xff1f; 电力系统是由发电、变电、输电、配售电和用电等环节组成的…

leetcode106. 从中序与后序遍历序列构造二叉树,力扣105姊妹题

leetcode106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…