首页 > 数据库 >使用spark-sql处理Doris大表关联

使用spark-sql处理Doris大表关联

时间:2024-06-12 18:10:42浏览次数:15  
标签:10 column 9030 Doris sql spark doris

背景

最近项目上有一个需求,需要将两张表(A表和B表)的数据进行关联并回写入其中一张表(A表),两张表都是分区表,但是关联条件不包括分区字段。

分析过程

方案一

最朴素的想法,直接关联执行,全表关联,一条SQL搞定全部逻辑。想法越简单,执行越困难。由于数据量大,服务器规模较小,尽管各台服务器内存和CPU配置都很高,关联会将数据读取到内存,内存根本放不下,而且集群配置了workload group,可使用内存更小了,方案一不可行。

方案二

可以在关联时增加分区字段对任务进行拆解,这样可以实现,但是会形成笛卡尔积,历史数据量巨大,分区较多(A表和B表都是1年),缺点也很明显。

  • 执行耗时长
  • 执行语句太多,操作不便
  • 如果按照单分区关联,A表的每一个分区将会扫描B表全表

经过评估上述方案二不可行。

方案三

通过外部计算和存储来实现,可选的有Hive、Spark、Flink。三种方案都是可行的,但是从操作复杂度来看使用spark-sql直接读取Doris进行关联并写回Doris,除DDL外,只需要一条SQL即可搞定。

详细过程

  1. 下载预编译的spark和spark-doris-connector
  1. 部署
    将上述安装文件上传至Hadoop集群的其中一台机器,放置到任意目录,比如/opt,请保证使用的用户可以向Yarn提交任务。
    解压缩spark-3.4.3-bin-hadoop3.tgz得到spark-3.4.3-bin-hadoop3目录
    将spark-doris-connector-3.4_2.12-1.3.2.jar放到spark-3.4.3-bin-hadoop3/jars/

  2. 启动spark-sql

bin/spark-sql --master yarn --num-executors 40 --executor-memory 7G --name Spark-SQL:Doris
  1. 创建映射表
-- 用于读取A表数据
CREATE
TEMPORARY VIEW spark_doris_a
USING doris
OPTIONS(
  "table.identifier"="mydb.table_a",
  "fenodes"="10.*.*.1:9030,10.*.*.2:9030,10.*.*.3:9030",
  "user"="root",
  "password"="$YOUR_DORIS_PASSWORD"
);
-- 用于读取B表数据
CREATE
TEMPORARY VIEW spark_doris_b
USING doris
OPTIONS(
  "table.identifier"="mydb.table_b",
  "fenodes"="10.*.*.1:9030,10.*.*.2:9030,10.*.*.3:9030",
  "user"="root",
  "password"="$YOUR_DORIS_PASSWORD"
);
-- 用于向A表部分列写入数据
CREATE
TEMPORARY VIEW spark_doris_a_sink
USING doris
OPTIONS(
  "table.identifier"="mydb.table_a",
  "fenodes"="10.*.*.1:9030,10.*.*.2:9030,10.*.*.3:9030",
  "user"="root",
  "password"="$YOUR_DORIS_PASSWORD",
  "sink.properties.partial_columns"="true",
  "sink.properties.column"="'column_a','column_b','column_c'"
);
  1. DML语句
set enable_unique_key_partial_update=true;
set enable_insert_strict=false;

insert into spark_doris_a_sink
(column_a,column_b,column_c)
select a.column_a,b.column_b,b.column_c from spark_doris_a a left join spark_doris_b b on a.colum_d = b.column_e;

遇到的问题

处理过程很简单,但是实际也是遇到了很多问题

  1. DML语句中不能使用分区字段进行过滤,因为Doris 2.0版本在提供的获取执行计划的API中对于引号的处理存在问题,如果传递的是"2024-06-12",则会得到数值2006,该数值无法转换为日期,如果传递"20240612"也无法得到Date("20240612")。理论上,如果调整此处的写法增加嵌套的引号配合转义字符也能实现功能,Java程序员都懂的,有兴趣可以自行验证。
  2. spark executor 内存和并行度设置,这个需要不断调整,我也是尝试了多次,才得到这个可以运行的结果。并行度设置太高了,将会对Doris形成较大的网络和IO冲击,一定要慎重。并行度低了,内存就要高一点,不然数据都已经从Doris读取出来了,关联的时候会内存溢出。
  3. 读取Doris的速率还是很快的,而且spark在读取doris前获取了执行计划,对数据进行了行和列的裁剪,不会将整表数据都读出来。

标签:10,column,9030,Doris,sql,spark,doris
From: https://www.cnblogs.com/aaronking/p/18243535

相关文章

  • mysql数据库修改配置文件后无法启动服务问题排查
    windowsserver 报错现象:本地计算机上的MySQL8.0服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止。 MySQL服务无法启动。服务没有报告任何错误。 故障原因:经多方排查最终确认是配置文件存储编码错误导致服务无法初始化。处理过程:1、   本地环境检......
  • Unix socket lock file is empty /var/run/mysqld/mysqld.sock.lock
    介绍当使用MySQL数据库时,有时候会遇到一个错误信息,提示“Unixsocketlockfileisempty:/var/run/mysqld/mysqld.sock.lock.”这个错误一般是由于MySQL服务器无法启动造成的。在本文中,我们将探讨这个错误的原因和解决方案。错误原因/var/run/mysqld/mysqld.sock.lock......
  • mybatis的mapper中的sql涉及嵌套且外部引用导致的问题:XML fragments parsed from prev
    假设xxx.xml中有类似下方的sql嵌套:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.xx......
  • MySQL
    MySQL一、MySQL简介1.1MySQL组成和常用工具1.1.1客户端程序mysql:交互式或非交互式的CLI工具mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保存文本文件中mysqladmin:基于mysql协议管理mysqldmysqlimport:数据导入工......
  • MySQL 8.3.0 主从热备
    IP角色版本192.168.140.153主8.3.0192.168.140.159从8.3.0一、准备环境1、卸载mariadbrpm-qa|grepmariadbrpm-emariadb-libs--nodeps2、安装依赖yum-yinstallperl二、安装MySQL1、下载安装包wgethttps://downloads.mysql.com/archives/get/p/23/file/mysq......
  • sql字段对应批量数据处理工具
    <htmllang="zh-CN"><head> <metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=device-width,initial-scal......
  • Mariadb版本的JDBC驱动,连接云上Mysql出现连接超时
    记录一下一个小问题的解决,Mariadb驱动连接云上Mysql的时候,如果频繁连接偶尔出现读取超时的现象。通过分析报错的堆栈发现,在 org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol#postConnectionQueries这个方法里面有一个判断,usePipelineAuth默认为true,导致设置sock......
  • 【MySQL随缘更】存储过程
    文章目录一、存储过程概述1.1、什么是存储过程1.2、存储过程特点1.3、存储过程优缺点二、存储过程创建2.1、创建格式2.2、变量2.3、变量作用域三、存储过程参数3.1、in3.2、out3.3、inout四、存储过程条件4.1、if…else…endif4.2、if…elseif…else…endif4.3、cas......
  • mysql常用的聚合函数---汇总数据
    此篇文章内容均来自与mysql必知必会教材,后期有衍生会继续更新、补充知识体系结构文章目录AGV()count()根据需求可以进行组合处理max()min()max()、min()、avg()组合使用汇总数据AGV()AVG():1、单列使用AVG();2、多列求平均值的情况下必须使用多个agv()语法:selectav......
  • 深入探究MySQL游标(Cursor)
    前言MySQL游标(Cursor)是MySQL中用于处理查询结果的一种机制。游标允许我们在查询结果集中逐行处理数据,而不是一次性获取所有数据。这对于处理大量数据非常有用,因为它可以减少内存消耗并提高性能。在MySQL中,游标主要用于存储过程和函数。一、游标的概念游标是一个数据库对......