共计 3426 个字符,预计需要花费 9 分钟才能阅读完成。
1. 导入总览介绍
Apache Doris 的数据导入性能是提供用户将数据导入到 Doris 中,导入胜利之后,用户能够通过 Mysql 客户端应用 SQL 对数据进行查问剖析。
Doris 为满足不同场景的数据数据导入需要,提供了一下几种数据导入形式,每种数据导入形式都反对不同的数据源,存在不同的应用形式:同步,异步,每种导入形式也反对不同的数据格式:CSV,JSON,Parquet、ORC 等
1.1 Broker Load 形式
这种形式须要装置一个 Doris Broker 服务,具体参照 Apache Doris 装置指南
这种形式通过 Broker 过程拜访并读取内部数据源(如 HDFS,)导入到 Doris。用户通过 Mysql 协定,通过 Doris SQL 语句的形式提交导入作业后,异步执行。通过 SHOW LOAD
命令查看导入后果。
这种形式大数据量的数据迁徙应用。
1.2 Stream Load 形式
用户通过 HTTP 协定提交申请并携带原始数据(能够是文件,也能够是内存数据)创立导入。次要用于疾速将本地文件或数据流中的数据导入到 Doris。导入命令同步返回导入后果,这种导入形式反对两种格局的数据 CVS 和 JSON,
通过 SHOW STREAM LOAD
形式来查看 Stream load 作业状况,这个要最新版本里才反对(百度发行版:0.14.13、apache 0.15 版本及当前版本)
这是一种同步的数据导入形式
1.3 Insert 形式
这种导入形式和 MySQL 中的 Insert 语句相似,Apache Doris 提供 INSERT INTO tbl SELECT ...;
的形式从 Doris 的表(或者 ODBC 形式的表面)中读取数据并导入到另一张表。或者通过 INSERT INTO tbl VALUES(...);
插入单条数据,单条插入方式不倡议在生产和测试环境中应用,只是演示应用。
INSERT INTO tbl SELECT …
这种形式个别是在 Doris 外部对数据进行加工解决,生成两头汇总表,或者在 Doris 外部对数据进行 ETL 操作应用
这种形式是一种同步的数据导入形式
1.4 Routine Load 形式
这种形式是以 Kafka 为数据源,从 Kafka 中读取数据并导入到 Doris 对应的数据表中,用户通过 Mysql 客户端提交 Routine Load 数据导入作业,Doris 会在生成一个常驻线程,不间断的从 Kafka 中读取数据并存储在对应 Doris 表中,并主动保护 Kafka Offset 地位。
通过 SHOW ROUTINE LOAD
来查看 Routine load 作业状况
这是一种同步的数据导入形式。
1.5 Spark Load 形式
Spark load 通过借助于内部的 Spark 计算资源实现对导入数据的预处理,进步 Doris 大数据量的导入性能并且节俭 Doris 集群的计算资源。次要用于首次迁徙,大数据量导入 Doris 的场景。
这种形式须要借助于 Broker 服务。
Spark load 是一种异步导入形式,用户须要通过 MySQL 协定创立 Spark 类型导入工作,并通过 SHOW LOAD
查看导入后果。
1.6 S3 协定间接导入
这种导入相似于 Broker Load,通过 S3 协定间接导入数据
2. 导入基本原理
2.1 角色介绍
- Frontend(FE):负责 Doris 元数据管理及节点调度,在导入流程中次要负责导入布局生成及导入任务调度。
- Backend(BE):次要负责 Doris 数据存储及计算,在导入流程中次要负责数据的 ETL 加工及数据存储
- Broker Load:Broker 服务为一个独立的无状态过程。封装了文件系统(例如 HDFS 等)接口,提供 Doris 读取远端存储系统中文件的能力。
- 导入作业:导入作业读取用户提交的源数据,转换或荡涤后,将数据导入到 Doris 零碎中。导入实现后,数据即可被用户查问到。
- Label:每个导入作业都有一个 Label。这个 Label 在一个数据库内惟一,可由用户指定或零碎主动生成,用于标识一个导入作业。雷同的 Label 仅可用于一个胜利的导入作业。
- MySQL 协定 /HTTP 协定:Doris 提供两种拜访协定接口。MySQL 协定和 HTTP 协定。局部导入形式应用 MySQL 协定接口提交作业,局部导入形式应用 HTTP 协定接口提交作业。
2.2 作业阶段
一个导入作业分为四个阶段:PENDING、ETL,LOADING,FINISHED,前三个阶段是非必须阶段,可选。前两个阶段在作业没有实现之前都能够勾销(CANCELLED)
- PENDING:这阶段是可选阶段,该阶段只有 Broker Load 才有。Broker Load 被用户提交后会短暂停留在这个阶段,直到被 FE 中的 Scheduler 调度。其中 Scheduler 的调度距离为 5 秒
- ETL(非必须):该阶段在版本 0.10.0(蕴含) 之前存在,次要是用于将原始数据依照用户申明的形式进行变换,并且过滤不满足条件的原始数据。在 0.10.0 后的版本,ETL 阶段不再存在,其中数据 transform 的工作被合并到 LOADING 阶段
- LOADING:该阶段在版本 0.10.0(蕴含)之前次要用于将变换后的数据推到对应的 BE 存储中。在 0.10.0 后的版本,该阶段先对数据进行荡涤和变换,而后将数据发送到 BE 存储中。当所有导入数据均实现导入后,进入期待失效过程,此时 Load job 仍旧是 LOADING。
- FINISHED:在 Load job 波及的所有数据均失效后,Load job 的状态变成 FINISHED。FINISHED 后导入的数据均可查问。
- CANCELLED:在作业 FINISHED 之前,作业都可能被勾销并进入 CANCELLED 状态。如用户手动勾销,或导入呈现谬误等。CANCELLED 也是 Load Job 的最终状态,不可被再次执行。
下面四个阶段,除了 PENDING 到 LOADING 阶段是 调度器(Scheduler)轮训调度的,其余阶段之前的转移都是回调机制实现。
3. 数据导入的原子性保障
Doris 对所有导入形式提供原子性保障。既保证同一个导入作业内的数据,原子失效。不会呈现仅导入局部数据的状况。
同时,每一个导入作业都有一个由用户指定或者零碎主动生成的 Label。Label 在一个 Database 内惟一。当一个 Label 对应的导入作业胜利后,不可再重复使用该 Label 提交导入作业。如果 Label 对应的导入作业失败,则能够重复使用。
用户能够通过 Label 机制,来保障 Label 对应的数据最多被导入一次,即 At-Most-Once 语义
4. Doris 数据导入最佳实际
咱们在应用 Doris 数据导入的时候,个别都是程序接入的形式,这样能够保证数据会定期的被加载到 Doris 中,上面给出集中最佳实际:
- 抉择适合的导入形式:依据数据源所在位置抉择导入形式。例如:如果原始数据寄存在 HDFS 上,则应用 Broker load 导入。
- 确定导入形式的协定:如果抉择了 Broker load 导入形式,则内部零碎须要能应用 MySQL 协定定期提交和查看导入作业。
- 确定导入形式的类型:导入形式为同步或异步。比方 Broker load 为异步导入形式,则内部零碎在提交创立导入后,必须调用查看导入命令,依据查看导入命令的后果来判断导入是否胜利。
- 制订 Label 生成策略:Label 生成策略需满足,每一批次数据惟一且固定的准则。这样 Doris 就能够保障 At-Most-Once。
- 程序本身保障 At-Least-Once:内部零碎须要保障本身的 At-Least-Once,这样就能够保障导入流程的 Exactly-Once。
- 如果是 ODBC 内部数据源或者 Doris 外部数据加工,这种倡议采纳
INSERT INTO tbl SELECT …
,而后能够通过内部任务调度器(比方:DolphinScheduler),定时的对导入及数据加工工作进行调度执行 - 如果你要实时的从内部 Kafka 数据源中读取数据并加载到 Doris 中,这种倡议应用 Routine Load,须要留神的是如果数据是 JSON 格局数据(JSON 数据不反对嵌套),这种你也能够应用 Stream load 形式来实现数据导入。如果数据量比拟大,能够借助以 Flink 或者 Spark 集群对数据进行做一些预处理,而后通过 Stream Load 形式导入到 Doris 中,大大提高数据导入效率。
5. 总结
以上咱们介绍了 Doris 数据导入的几种导入形式及数据导入的原子性保障机制,最初给出了 Doris 数据导入的最佳实际,前面咱们将具体介绍每种数据导入的具体应用形式及相干参数阐明。