携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
- 数据写入doris
package cn.itcast.doris
import java.util.Properties
import org.apache.spark.SparkConf
import org.apache.spark.sql.{SaveMode, SparkSession}
/**
* 需求:将数据写入到doris中
*/
object TestWriteDoris {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[*]");
val sparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
val df = sparkSession.createDataFrame(Array(
(10004, "2021-02-01", "深圳", 30, 0, "2021-02-01 10:00:15", 100, 10, 10),
(10005, "2021-02-01", "北京", 30, 0, "2021-02-01 10:00:15", 100, 10, 10)
)).toDF("user_id", "date", "city", "age", "sex", "last_visit_date", "cost", "max_dwell_time", "min_dwell_time")
val props = new Properties()
props.setProperty("user", "root")
props.setProperty("password", "123456")
df.write.mode(SaveMode.Append).jdbc("jdbc:mysql://node1:9030/test_db", "example_site_visit", props)
sparkSession.stop()
}
}
1. Doris案例篇
基于Doris的有道精品课数据中台建设实践
背景
业务背景
根据业务需求,目前有道精品课的数据层架构上可分为离线和实时两部分。
离线系统主要处理埋点相关数据,采用批处理的方式定时计算。
而实时流数据主要来源于各个业务系统实时产生的数据流以及数据库的变更日志,需要考虑数据的准确性、实时性和时序特征,处理过程非常复杂。
有道精品课数据中台团队依托于其实时计算能力在整个数据架构中主要承担了实时数据处理的角色,同时为下游离线数仓提供实时数据同步服务。
数据中台主要服务的用户角色和对应的数据需求如下:
-
运营/策略/负责人主要查看学生的整体情况,查询数据中台的一些课程维度实时聚合数据
-
销售主要关注所服务学生的各种实时明细数据
-
主要查看课程/老师/辅导各维度整体数据,通过T+1的离线报表进行查看
-
分析师对数据中台T+1同步到离线数仓的数据进行交互式分析
数据中台前期系统架构及业务痛点
如上图所示,在数据中台1.0架构中我们的实时数据存储主要依托于Elasticsearch,遇到了以下几个问题:
-
聚合查询效率不高
-
数据压缩空间低
-
不支持多索引的join,在业务设计上我们只能设置很多大宽表来解决问题
-
不支持标准SQL,查询成本较高