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

news2024/11/24 22:50:33

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_table
    COLUMNS 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.SparkSession

val 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_id
    FROM orders
    GROUP BY user_id
    HAVING 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 joblib

app = Flask(__name__)
model = joblib.load('recommendation_model.pkl')

@app.route('/predict', methods=['POST'])
def predict():
    data = request.json
    prediction = 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: 3
  image:
    repository: apache/doris
    tag: "1.0.0-fe"
be:
  replicaCount: 5
  image:
    repository: apache/doris
    tag: "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: 3
    resources:
      requests:
        cpu: "2"
        memory: "4Gi"
  be:
    replicas: 5
    resources:
      requests:
        cpu: "4"
        memory: "16Gi"

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

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

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

自动化运维

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

- name: Deploy Doris Cluster
  hosts: all
  tasks:
    - name: Install Doris
      ansible.builtin.yum:
        name: doris
        state: present

    - name: Start Doris service
      ansible.builtin.service:
        name: doris
        state: started
监控与告警

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

global:
  scrape_interval: 15s

scrape_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_id

UNION ALL

SELECT 
    '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 id
    FROM customers
    WHERE 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.SparkSession

val 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_id
        ORDER BY timestamp
        ROWS 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_id
    FROM edges
    WHERE source_id = 1
),
two_hop AS (
    SELECT DISTINCT e.target_id
    FROM one_hop oh
    JOIN edges e ON oh.target_id = e.source_id
    WHERE 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 cnt
    FROM edges
    GROUP 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.coloradmin.cn/o/1951113.html

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

相关文章

江苏科技大学24计算机考研数据速览,有专硕复试线大幅下降67分!

江苏科技大学&#xff08;Jiangsu University of Science and Technology&#xff09;&#xff0c;坐落在江苏省镇江市&#xff0c;是江苏省重点建设高校&#xff0c;江苏省人民政府与中国船舶集团有限公司共建高校&#xff0c;国家国防科技工业局与江苏省人民政府共建高校 &am…

pyqt designer使用spliter

1、在designer界面需要使用spliter需要父界面不使用布局&#xff0c;减需要分割两个模块选中&#xff0c;再点击spliter分割 2、在分割后&#xff0c;再对父界面进行布局设置 3、对于两边需要不等比列放置的&#xff0c;需要套一层 group box在最外层进行分割

Linux系统:date命令

1、命令详解&#xff1a; date 命令可以用来显示或设定系统的日期与时间。 2、官方参数&#xff1a; -d, --dateSTRING 通过字符串显示时间格式&#xff0c;字符串不能是now。-f, --fileDATEFILE 类似 --date 在 DATEFILE 的每一行生效-I[FMT], --iso-8601[FMT…

Redis的使用场景、持久化方式和集群模式

1. Redis的使用场景 热点数据的缓存 热点数据&#xff1a;频繁读取的数据 限时任务的操作。比如短信验证码 完成session共享的问题。因为前后端分离 完成分布式锁 商品的销售量 2. Redis的持久化方式 2.1 什么是持久化 把内存中的数据存储到磁盘的过程。同时也可以把磁盘中…

Python中的Numpy库使用方法

numpy Ndarry和创建数组的方式 NumPy数组&#xff08;ndarray&#xff09;是NumPy库的核心数据结构&#xff0c;它是一系列同类型数据的集合&#xff0c;以 0 下标为开始进行集合中元素的索引。 ndarray本质上是一个存放同类型元素的多维数组&#xff0c;其中的每个元素在内存…

TransformerEngine

文章目录 一、关于 TransformerEngine &#xff1f;亮点 二、使用示例PyTorchJAXFlax 三、安装先决条件Dockerpip从源码使用 FlashAttention-2 编译 四、突破性的变化v1.7: Padding mask definition for PyTorch 五、FP8 收敛六、集成七、其它贡献论文视频最新消息 一、关于 Tr…

美团大众点评字符验证码

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(…

为什么优秀员工往往最先离职?

在企业管理中有很多误区&#xff0c;令企业流失优秀员工和人才&#xff0c;根据优思学院过往的经验&#xff0c;大致可以分为以下几个情况。 1. 忽视帕累托法则&#xff08;80/20法则&#xff09; 帕累托法则&#xff08;80/20法则&#xff09;是六西格玛管理的基本原则&…

好的STEM编程语言有哪些?

STEM是科学&#xff08;Science&#xff09;&#xff0c;技术&#xff08;Technology&#xff09;&#xff0c;工程&#xff08;Engineering&#xff09;&#xff0c;数学&#xff08;Mathematics&#xff09;四门学科英文首字母的缩写&#xff0c;STEM教育简单来说就是在通过在…

django_创建菜单(实现整个项目的框架,调包)

文章目录 前言代码仓库地址在线演示网址启动网站的时候出现错误渲染路径的一些说明文件结构网页显示一条错误路由顺序js打包出现问题的代码函数没有起作用关于进度开发细节显示不了图片梳理一下函数调用的流程修改一些宽度参数classjs 里面的一些细节让三个按钮可以点击设置按钮…

前端JS特效第56集:基于canvas的粒子文字动画特效

基于canvas的粒子文字动画特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compat…

GPT-4O 的实时语音对话功能在处理多语言客户时有哪些优势?

最强AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量 我瞄了一眼OpenAI春季发布会&#xff0c;这个发布会只有26分钟&#xff0c;你可以说它是一部科幻短片&#xff0c;也可以说它过于“夸夸其谈”&#xff01;关于…

5个工具帮助你轻松将PDF转换成WORD

有时候编辑PDF文件确实不如编辑word文档方便&#xff0c;很多人便会选择先转换再编辑。但是如果还有人不知道要怎么将PDF文件转换成word文档的话&#xff0c;可以看一下这5款工具&#xff0c;各种类型的都有&#xff0c;总有一款可以帮助到你。 &#xff11;、福昕PDF转换软件 …

socket实现全双工通信,多个客户端接入服务器端

socket实现全双工通信 客户端&#xff1a; #define IP "192.168.127.80" //服务器IP地址 #define PORT 7266 // 服务器端口号int main(int argc, const char *argv[]) {//1.创建套接字&#xff1a;用于接收客户端链接请求int sockf…

MSQP Mysql数据库权限提升工具,UDF自动检测+快速反向SHELL

项目地址:https://github.com/MartinxMax/MSQP MSQP 这是一个关于Mysql的权限提升工具 安装依赖 $ python3 -m pip install mysql-connector-python 使用方法 $ python3 msqp.py -h 权限提升:建立反向Shell 在建立反向连接前,该工具会自动检测是否具有提权条件&#xff0…

4-4 数值稳定性 + 模型初始化和激活函数

数值稳定性 这里的 t t t表示层&#xff0c;假设 h t − 1 h^{t-1} ht−1是第 t − 1 t-1 t−1层隐藏层的输出&#xff0c;经过一个 f t f_{t} ft​得到第 t t t层隐藏层的输出 h t h^{t} ht。 y y y表示 x x x进来&#xff0c;第一层一直到第 d d d层&#xff0c;最后到一个损…

2024最新网络安全自学路线,内容涵盖3-5年技能提升

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

NC 二叉树的最大深度

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 求给定二叉树…

图像数据增强方法概述

图像数据增强方法概述 1. 什么是图像数据增强技术?2. 图像数据增强技术分类2.1 几何变换Python 示例代码 2.2 颜色变换2.3 噪声添加 3. 参考文献 1. 什么是图像数据增强技术? 基础概念&#xff1a;图像增强技术是计算机视觉和图像处理领域中的一个关键技术&#xff0c;主要用…

数据库安全综合治理方案(可编辑54页PPT)

引言&#xff1a;数据库安全综合治理方案是一个系统性的工作&#xff0c;需要从多个方面入手&#xff0c;综合运用各种技术和管理手段&#xff0c;确保数据库系统的安全稳定运行。 方案介绍&#xff1a; 数据库安全综合治理方案是一个综合性的策略&#xff0c;旨在确保数据库系…