当前位置:   article > 正文

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

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

Doris学习之旅.png

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

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

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

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

于是,我的Doris学习之旅就这样开始了。今天,我想和大家分享我是如何以"糙快猛"的方式学习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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

看着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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

看到查询结果出现在屏幕上,我忍不住喊了一声:“芜湖,起飞!”
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 ","
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
聚合模型

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

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

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;
  • 1
  • 2
  • 3
  • 4

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

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

image.png

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

  1. 合理设置分桶数:

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

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

    ALTER TABLE my_table 
    MODIFY PARTITION p202307 
    SET ("replication_num" = "3");
    
    • 1
    • 2
    • 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这段代码让我感叹:原来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
  • 1
实时导入

对于实时数据,我会使用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"
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这段配置让我能够持续从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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
复杂的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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

11. Doris的高可用与扩展

image.png

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

FE高可用配置

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

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

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

ALTER SYSTEM ADD BACKEND "be_host:9050";
  • 1

这些操作让我能够根据业务需求灵活调整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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这个例子展示了如何利用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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

预聚合和物化视图优化

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

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;
  • 1
  • 2
  • 3
  • 4

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

合理使用索引

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

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

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"
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这允许我们在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");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
实时聚合查询

然后,我们可以在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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这个查询可以实时显示过去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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 在Java UDF中实现对预测服务的调用:
public class PredictRating extends ScalarFunction {
    public Double evaluate(Integer userId, Integer itemId) {
        // 调用预测服务的逻辑
        // 返回预测结果
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这个查询可以找出模型预测评分高于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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  1. 使用Helm部署Doris:
helm install my-doris ./doris
  • 1

这种方式让我们可以更灵活地管理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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

使用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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
监控与告警

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

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'doris'
    static_configs:
      - targets: ['doris-fe:8030', 'doris-be:8040']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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"
);
  • 1
  • 2
  • 3
  • 4
  • 5
数据加密

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

ADMIN SET FRONTEND CONFIG (
    "enable_ssl" = "true",
    "ssl_certificate_path" = "/path/to/server.crt",
    "ssl_private_key_path" = "/path/to/server.key"
);
  • 1
  • 2
  • 3
  • 4
  • 5

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

这个案例展示了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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

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

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

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

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

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

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
  • 1
  • 2
  • 3
  • 4
  • 5
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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
区块链数据分析

随着区块链技术的成熟,分析区块链数据成为一个新的需求。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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
物化视图优化

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

-- 创建物化视图
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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
子查询优化

将复杂的子查询改写为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';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
使用EXPLAIN分析查询计划
EXPLAIN SELECT * FROM sales_data WHERE sale_date > '2023-01-01';
  • 1

通过分析执行计划,我们可以找出潜在的性能瓶颈,如全表扫描、低效的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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
与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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
与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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

这个例子展示了如何使用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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

这个例子展示了如何使用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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

这个例子展示了如何使用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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/892224
推荐阅读
相关标签
  

闽ICP备14008679号