采用海豚调度器+Doris开发数仓保姆级教程(满满是踩坑干货细节,持续更新)

一、采用海豚调度器+Doris开发平替CDH Hdfs + Yarn + Hive + Oozie的理由。

海豚调度器+Doris离线数仓方案与CDH Hive在多个方面存在显著差异,以下是对这两种方案的对比分析:

1. 架构复杂性

  • CDH Hive:基于Hadoop生态,组件众多,配置和维护复杂,需要管理HDFS、YARN、Hive等多个服务。
  • 海豚调度器+Doris:架构简化,易于部署和维护。Doris本身是一个高性能的分布式OLAP数据库,支持在线模式变更,减少了额外的组件和复杂性。

2. 数据处理性能

  • CDH Hive:查询性能较低,尤其是在处理大规模数据时,查询速度较慢,延迟较高。
  • 海豚调度器+Doris:支持实时OLAP,查询速度大幅提升,秒级响应,适合快速查询和分析需求。对计算量不是很大的(如果计算量很大,需要用spark或flink来进行底层ETL,直接用doris进行离线数仓报表开发,开发效率高,报表查询速度快,属于开发又快,开发后效果又好)   

3. 数据同步与更新

  • CDH Hive:数据同步和更新依赖于复杂的ETL流程和调度任务,维护成本高。
  • 海豚调度器+Doris:通过Flink CDC实时接入生产库数据,支持自动化的表结构变更同步,简化了数据同步流程,降低了维护成本。Doris 2.1版本以上的,还可以用doris自带的Routine Load 导入方式持续消费 Kafka Topic 中的数据,简单方便。

4. 资源利用率与成本

  • CDH Hive:需要大量的计算和存储资源,集群扩展成本高。
  • 海豚调度器+Doris:Doris是存算一体,资源利用率高,查询效率提升,减少了集群扩容成本,节约了资源。

6. 生态系统与兼容性

  • CDH Hive:基于Hadoop生态,与众多大数据工具和平台兼容,生态系统成熟。
  • 海豚调度器+Doris:虽然生态系统相对较小,但与MySQL协议兼容,支持直接对接数据可视化应用,简化了数据服务流程。

7. 符合信创或国产化要求

  • CDH Hive:CDH是美国公司主导的,CDH6.3.2之后的不是免费版本了,不符合合信创要求。
  • 海豚调度器+Doris:海豚调度器和doris是国产之光,都是国内公司主导的,符合信创或国产化要求。

二、ODS层接入数据

接入kafka实时数据

Doris 可以通过 Routine Load 导入方式持续消费 Kafka Topic 中的数据。在提交 Routine Load 作业后,Doris 会持续运行该导入作业,实时生成导入任务不断消费 Kakfa 集群中指定 Topic 中的消息。

Routine Load 是一个流式导入作业,支持 Exactly-Once 语义,保证数据不丢不重。下面示例如何通过拉入kafka数据(json格式):

首先是创建需要导入的表:

CREATE TABLE testdb.test_routineload_tbl(
    user_id            BIGINT       NOT NULL COMMENT "user id",
    name               VARCHAR(20)           COMMENT "name",
    age                INT                   COMMENT "age"
)
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;

如果要接入的数据是主键不重复的,可以设置为Unique模型,这样可以删除或修改。

创建 Routine Load 导入作业

在 Doris 中,使用 CREATE ROUTINE LOAD 命令,创建导入作业

CREATE ROUTINE LOAD testdb.example_routine_load_json ON test_routineload_tbl
COLUMNS(user_id,name,age)
PROPERTIES(
    "format"="json",
    "max_error_number" = "999999999999",
     "strip_outer_array"="true",
    "jsonpaths"="[\"$.user_id\",\"$.name\",\"$.age\"]"
)
FROM KAFKA(
    "kafka_broker_list" = "192.168.88.62:9092",
    "kafka_topic" = "test-routine-load-json",
    "property.kafka_default_offsets" = "OFFSET_BEGINNING"
);

踩坑的问题细节 

max_error_number采样窗口内,允许的最大错误行数。必须大于等于 0。默认是 0,即不允许有错误行。采样窗口为 max_batch_rows * 10。即如果在采样窗口内,错误行数大于 max_error_number,则会导致例行作业被暂停,需要人工介入检查数据质量问题,通过 SHOW ROUTINE LOAD 命令中 ErrorLogUrls 检查数据的质量问题。被 where 条件过滤掉的行不算错误行。
strip_outer_array当导入数据格式为 json 时,strip_outer_array 为 true 表示 JSON 数据以数组的形式展现,数据中的每一个元素将被视为一行数据。默认值是 false。通常情况下,Kafka 中的 JSON 数据可能以数组形式表示,即在最外层中包含中括号[],此时,可以指定 "strip_outer_array" = "true",以数组模式消费 Topic 中的数据。如以下数据会被解析成两行:[{"user_id":1,"name":"Emily","age":25},{"user_id":2,"name":"Benjamin","age":35}]
我公司的kafka,是需要设置"strip_outer_array"="true",根据实际来调整。

有些kafka的数据有脏数据,可以用max_error_number来过滤。或者考虑用脚本来检测:
import pymysql  #导入 pymysql
import requests,json


#打开数据库连接
db= pymysql.connect(host="host",user="user",
                    password="passwd",db="database",port=port)

# 使用cursor()方法获取操作游标
cur = db.cursor()

#1.查询操作
# 编写sql 查询语句 
sql = "show routine load"
cur.execute(sql)        #执行sql语句
results = cur.fetchall()        #获取查询的所有记录
for row in results :
    name = row[1]
    state = row[7]
    if state != 'RUNNING':
        err_log_urls = row[16]
        reason_state_changed = row[15]
        msg = "doris 数据导入任务异常:\n name=%s \n state=%s \n reason_state_changed=%s \n err_log_urls=%s \n即将自动恢复,请检查错误信息" % (name, state,
reason_state_changed, err_log_urls)
        payload_message = {
    "msg_type": "text",
    "content": {
        "text": msg
    }
}
        url = 'lark 报警url'
        s = json.dumps(payload_message)
        r = requests.post(url, data=s)
        cur.execute("resume routine load for " + name)

cur.close()
db.close()
通过 SHOW ROUTINE LOAD 来查看结果
mysql> SHOW ROUTINE LOAD FOR testdb.example_routine_load
我是没按官方文档加\G,加了\G报错。

如果导入数据有问题,可以通过上面的命令,查看下面这2个:
ErrorLogUrls被过滤的质量不合格的数据的查看地址
OtherMsg其他错误信息
具体可以参考:Routine Load - Apache Doris

三、海豚调度器调度Doris进行报表开发

创建带分区的表

离线数仓有时是需要重跑覆盖数据的,用hive开发时用

INSERT OVERWRITE TABLE your_table PARTITION(dt) ...

的方式时来覆盖每天的分区。采用doris开发离线数仓时,可以设置带时区的分区,例如下面这样:

 CREATE TABLE IF NOT EXISTS `your_table_day`  (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `sn` varchar(32)  NOT NULL COMMENT '编码', 
  `day` varchar(16)  NOT NULL COMMENT '日期,格式为:yyyy-MM-dd',
  `value` varchar(16)   NOT NULL DEFAULT '' COMMENT '值',
  `created_at` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	dt Date		
	) ENGINE=OLAP
 DUPLICATE KEY(`id`)
 PARTITION BY RANGE(dt) ()
 DISTRIBUTED BY HASH(`pid_system_code`) BUCKETS 10
 PROPERTIES (
 'replication_num' = '3',
 'dynamic_partition.enable' = 'true',
 'dynamic_partition.time_unit' = 'DAY',
 'dynamic_partition.start' = '-2147483648',
 'dynamic_partition.end' = '3',
 'dynamic_partition.prefix' = 'p',
'dynamic_partition.buckets' = '10'
 );

如果需要设置动态分区永不过期,要如下面这样设置: 'dynamic_partition.start' = '-2147483648',如果生命周期不要那么长,只需要30天,可以设置: 'dynamic_partition.start' = '30'。

在doris进行开发调试

在用hive开发时,用hue查询结果时等待好久。可以用navicat等工具,像连接mysql一样(不同的是端口默认是9030),先直接在doris进行开发调试,查询速度扛扛的,开发效率提升好多。

开发海豚调度器脚本

采用mysql的命令来执行,需要在海豚调度器每一台worker都安装mysql客户端。

mysql -h${HOST_NAME} -P${PORT} -u${USER_NAME} -p${PASS_WORD} ${DB_NAME} -e"${your_sql}

不过包含多行或复杂的 SQL 语句,用上面的方式执行会有问题。可以考虑将其写入一个 .sql 文件,并使用 mysql 命令执行文件:

mysql -h${HOST_NAME} -P${PORT} -u${USER_NAME} ${DB_NAME} < your_sql_file.sql 

解决shell脚本使用 MySQL 命令行给 SQL 文件传参遇到的坑

离线数仓是有时需要重跑,用

mysql -h${HOST_NAME} -P${PORT} -u${USER_NAME} ${DB_NAME} < your_sql_file.sql 

是需要传递日期等参数的。也就是需要向SQL 文件传参。我们可以利用 sed 在执行 SQL 文件之前修改其中的占位符,将实际的参数值写入 SQL 文件中。下面是一个简单的例子:

假设有一个名为 insertstmt.sql 的 SQL 文件,其内容如下:

INSERT INTO test.demo_table VALUES(@name, @age);

这里 @name 和 @age 是我们需要从外部传递的参数。为了实现这一点,我们可以创建一个 Shell 脚本 execute.sh,它接受两个参数并用它们来替换 yoursql.sql 中的变量:

#!/bin/sh
# 设置参数作为 SQL 变量并添加到 yoursql.sql 文件的第一行
sed -i "1 i\ SET @name='$1';" yoursql.sql
sed -i "1 i\ SET @age=$2;" yoursql.sql

# 执行 SQL 脚本
mysql -u root < yoursql.sql

# 清除 SQL 脚本中的变量设置
sed -i '1,2d' yoursql.sql

在这个脚本中,$1 和 $2 分别对应于调用脚本时提供的第一个和第二个参数。当我们运行这个脚本,例如 ./execute.sh lenmom 30,它会先修改 yoursql.sql 文件,使其看起来像这样:

SET @name='lenmom';
SET @age=30; 
INSERT INTO test.demo_table VALUES(@name, @age);

然后执行该 SQL 文件,最后恢复原始状态以供下次使用。

 综合案例

让我们来看一个更复杂的实例,其中涉及到数据库连接信息以及多个参数的传递。想象一下,你有一个定期更新用户信息的任务,需要每天晚上更新一次特定用户的年龄信息。你可以创建一个名为 update_user_age.sh 的 Shell 脚本来完成这项任务

#!/bin/bash
# 数据库连接信息
DB_HOST="localhost"
DB_PORT="3306"
DB_USER="root"
DB_PASS="password"

# 日期作为参数传递
#通过全局参数complement_date来传参
yesdate=$1
yesday_date=`date -d "$yesdate - 0 day" +%Y-%m-%d`
#今天
today=`date -d "$yesdate + 1 day" +%Y%m%d`
today_date=`date -d "$yesdate + 1 day" +%Y-%m-%d`


# 更新 SQL 文件中的变量
sed -i "1 i\ set @yesdate='${yesdate}';"   db/update_user_age.sql
sed -i "1 i\ set @yesday_date='${yesday_date}';"   db/update_user_age.sql
sed -i "1 i\ set @today_date='${today_date}';"   db/update_user_age.sql

#删除日期的分区重新创建
mysql -h${HOST_NAME} -P${PORT} -u${USER_NAME}  ${DB_NAME} -e "
 ALTER TABLE db.update_user_ageSET ('dynamic_partition.enable' = 'false'); \
 ALTER TABLE db.update_user_ageDROP PARTITION IF EXISTS p${yesdate};   \
 ALTER TABLE db.update_user_age ADD PARTITION p${yesdate} VALUES [('${yesday_date}'), ('${today_date}')); "

# 执行更新
mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" < db/update_user_age.sql

# 恢复 SQL 文件
sed -i "1d" db/update_user_age.sql
sed -i "1d" db/update_user_age.sql
sed -i "1d" db/update_user_age.sql

然后在海豚调度器配置上面的shell脚本和sql脚本,就可以通过海豚调度器调用doris来进行离线数仓开发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

50.【8】BUUCTF WEB HardSql

进入靶场 随便输输 上order by ????????&#xff0c;被过滤了,继续找其他也被过滤的关键字 #&#xff0c;-- -&#xff0c;-- 都不行&#xff0c;尝试其他特殊字符后发现and&#xff0c;union&#xff0c;select&#xff0c;空格&#xff0c;都被过滤了 如下 我就不知…

Redis 3.2.1在Win10系统上的安装教程

诸神缄默不语-个人CSDN博文目录 这个文件可以跟我要&#xff0c;也可以从官网下载&#xff1a;https://github.com/MicrosoftArchive/redis/releases 这个是微软以前维护的Windows版Redis安装包&#xff0c;如果想要比较新的版本可以从别人维护的项目里下&#xff08;https://…

mac配置 iTerm2 使用lrzsz与服务器传输文件

mac配置 1. 安装支持rz和sz命令的lrzsz brew install lrzsz2. 下载iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh两个脚本 # 克隆仓库 git clone https://github.com/aikuyun/iterm2-zmodem ~/iterm2-zmodem# 进入到仓库目录 cd ~/iterm2-zmodem# 设置脚本文件可执行权限 c…

9.7 visual studio 搭建yolov10的onnx的预测(c++)

1.环境配置 在进行onnx预测前&#xff0c;需要搭建的环境如下: 1.opencv环境的配置&#xff0c;可参考博客:9.2 c搭建opencv环境-CSDN博客 2.libtorch环境的配置&#xff0c;可参考博客&#xff1a;9.4 visualStudio 2022 配置 cuda 和 torch (c)-CSDN博客 3.cuda环境的配置…

YOLOv8从菜鸟到精通(二):YOLOv8数据标注以及模型训练

数据标注 前期准备 先打开Anaconda Navigator&#xff0c;点击Environment&#xff0c;再点击new(new是我下载anaconda的文件夹名称)&#xff0c;然后点击创建 点击绿色按钮&#xff0c;并点击Open Terminal 输入labelimg便可打开它,labelimg是图像标注工具&#xff0c;在上篇…

STM32-keil安装时遇到的一些问题以及解决方案

前言&#xff1a; 本人项目需要使用到STM32,故需配置keil 5&#xff0c;在配置时遇到了以下问题&#xff0c;并找到相应的解决方案&#xff0c;希望能够为遇到相同问题的道友提供一些解决思路 1、提示缺少&#xff08;missing&#xff09;version 5编译器 step1&#xff1a;找…

C语言结构体漫谈:从平凡中见不平凡

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文《1》 结构体的两种声明一、结构…

LabVIEW与WPS文件格式的兼容性

LabVIEW 本身并不原生支持将文件直接保存为 WPS 格式&#xff08;如 WPS 文档或表格&#xff09;。然而&#xff0c;可以通过几种间接的方式实现这一目标&#xff0c;确保您能将 LabVIEW 中的数据或报告转换为 WPS 可兼容的格式。以下是几种常见的解决方案&#xff1a; ​ 导出…

LeetCode | 栈与队列:算法入门到进阶的全解析

栈和队列作为最基础的数据结构&#xff0c;不仅简单直观&#xff0c;还在算法世界中扮演着举足轻重的角色。无论是处理括号匹配问题、滑动窗口、还是实现先进先出的任务调度&#xff0c;栈与队列都是核心工具。 在本篇文章中&#xff0c;我们将以 LeetCode 中的经典题目为例&am…

得物App再迎开放日,全流程体验正品查验鉴别

近日&#xff0c;得物App超级品质保障中心再度迎来了开放日活动。近60位得物App的用户与粉丝齐聚超级品质保障中心&#xff0c;全流程体验正品查验鉴别。开放日当天&#xff0c;参与者有机会近距离观察得物App的商品质检区、鉴别区、收发流转区、实验室和正品库等关键功能区&am…

docker 部署 MantisBT

1. docker 安装MantisBT docker pull vimagick/mantisbt:latest 2.先运行实例&#xff0c;复制配置文件 docker run -p 8084:80 --name mantisbt -d vimagick/mantisbt:latest 3. 复制所需要配置文件到本地路径 docker cp mantisbt:/var/www/html/config/config_inc.php.…

【大语言模型】ACL2024论文-38 从信息瓶颈视角有效过滤检索增强生成中的噪声

【大语言模型】ACL2024论文-38 从信息瓶颈视角有效过滤检索增强生成中的噪声 目录 文章目录 【大语言模型】ACL2024论文-38 从信息瓶颈视角有效过滤检索增强生成中的噪声目录后记 《An Information Bottleneck Perspective for Effective Noise Filtering on Retrieval-Augment…

《火焰烟雾检测开源神经网络模型:智能防火的科技护盾》

一、火灾威胁与检测需求 火灾&#xff0c;始终是高悬在人类社会头顶的 “达摩克利斯之剑”&#xff0c;其带来的灾难后果触目惊心。根据国家消防救援局发布的数据&#xff0c;仅在 2024 年上半年&#xff0c;全国就接报火灾达 31.7 万起 &#xff0c;造成了 1173 人不幸遇难&am…

深入探究Linux树状目录结构

Linux 作为一款广泛使用的开源操作系统&#xff0c;其目录结构采用了树状设计&#xff0c;这种结构清晰、有条理&#xff0c;便于用户和系统进行文件管理与操作。 一、根目录&#xff08;/&#xff09; 根目录是整个 Linux 文件系统的起始点&#xff0c;就像一棵大树的根部&…

【C语言4】数组:一维数组、二维数组、变长数组及数组的练习题

文章目录 前言一、数组的概念二、一维数组2.1. 数组的创建和初始化2.2. 数组的类型2.3. 一维数组的下标2.4. 数组元素的打印和输入2.5. 一维数组在内存中的存储2.6. sizeof 计算数组元素个数 三、二维数组3.1. 二维数组的概念3.1. 二维数组的创建与初始化3.2. 二维数组的下标3.…

图论1-问题 C: 算法7-6:图的遍历——广度优先搜索

题目描述 广度优先搜索遍历类似于树的按层次遍历的过程。其过程为&#xff1a;假设从图中的某顶点v出发&#xff0c;在访问了v之后依次访问v的各个未曾被访问过的邻接点&#xff0c;然后分别从这些邻接点出发依次访问它们的邻接点&#xff0c;并使“先被访问的顶点的邻接点”先…

【今日分享】人工智能加速发现能源新材料的结构与性能

人工智能与材料国际学术会议(ICAIM)workshop9是由来自宁夏大学材料与新能源学院副院长王海龙教授及马薇副教授、杜鑫老师组成&#xff0c;他们将以“人工智能加速发现新能源新材料的结构与性能”为主题开展研讨工作&#xff0c;欢迎对该主题感兴趣的专家学者携稿加入。 loadin…

Docker拉取hello-world失败超时解决方法(配置多个镜源)

问题图片 解决方案 //创建目录 sudo mkdir -p /etc/docker //写入加速器配置 sudo tee /etc/docker/daemon.json <<-EOF "registry-mirrors": "https://do.nark.eu.org", "https://dc.j8.work", "https://docker.m.daocloud.io"…

[操作系统] 深入理解操作系统的概念及定位

概念 任何计算机系统都包含⼀个基本的程序集合&#xff0c;称为操作系统(OS)。 其核心功能如图片所示&#xff0c;包括&#xff1a; 内核 (Kernel)&#xff1a; 内核是操作系统的核心部分&#xff0c;被认为是狭义上的操作系统&#xff0c;直接与硬件打交道。负责进程管理、内…

某政务行业基于 SeaTunnel 探索数据集成平台的架构实践

分享嘉宾&#xff1a;某政务公司大数据技术经理 孟小鹏 编辑整理&#xff1a;白鲸开源 曾辉 导读&#xff1a;本篇文章将从数据集成的基础概念入手&#xff0c;解析数据割裂给企业带来的挑战&#xff0c;阐述数据集成的重要性&#xff0c;并对常见的集成场景与工具进行阐述&…