五分钟技术趣谈 | Apache Paimon浅析及在威胁情报中的应用

大数据
Flink团队开发了一种新的数据湖架构——Apache Paimon,支持高速数据摄取、变更数据跟踪和实时分析,并为读/写操作提供灵活的架构,并与各种计算引擎集成。目前Apache Paimon已经成功在威胁情报云应用落地,并取得良好的效果。

Part 01

Apache Paimon是什么?  

Apache Paimon是一种多功能的流数据湖平台,支持高速数据摄取、变更数据跟踪和实时分析,它为读/写操作提供灵活的架构,并与各种计算引擎(如Apache Flink、Apache Hive、Apache Spark和Trino)集成。Paimon利用列式文件存储和LSM树结构进行高效的数据更新和查询。它提供连接器,用于消息队列、OLAP系统和批量存储的统一存储。Paimon的表抽象可以无缝的批处理和流处理执行模式,用于数据处理。

图片

图1 Apache Paimon架构图


Part 02

Apache Paimon的特点 

Apache Paimon作为一个数据湖平台,目前具有以下几个主要特点:(1)大规模实时更新;(2)数据表局部更新;(3)流批一体读写。

- 大规模实时更新

Paimon 是一种新颖的数据存储系统,它结合了湖存储、LSM 和列式格式(如ORC、Parquet)等多种技术,为湖存储带来了大规模实时更新能力。其中,LSM 数据结构的追加写能力是 Paimon 实现高性能的关键。Paimon 的设计使得它可以在大规模的数据输入场景中提供出色的性能表现,同时支持快速的查询和分析操作。其特点如下:

  • 高容错性:LSM 的多版本存储机制,保障数据可靠性和恢复能力
  • 可扩展性:LSM 的水平扩展能力非常强,可以支持 PB 级别的数据规模
  • 高灵活性:Paimon 支持多种列式格式,可以根据不同的业务需求选择最适合的格式
  • 高可定制性:Paimon 提供了丰富的配置选项,可以根据不同的场景进行优化和定制。

- 数据表局部更新

在数据仓库的业务场景中,宽表数据模型是非常常见的。它是指将业务主体相关的指标、维表和属性关联在一起的模型表,也可以泛指将多个事实表和多个维度表相关联到一起形成的宽表。这种模型能够帮助我们更好地理解业务数据,提高数据分析的效率。Paimon开发了一个 Partial-Update 合并引擎。它可以根据相同的主键实时合并多条流,形成 Paimon 的一张大宽表。而且,借助 它里面的LSM 树的延迟 Compaction 机制,我们可以用较低的成本完成合并,从而提高了数据处理的效率。举例来说:当收到主键为1的以下三条数据后,它最终会合并成合并的一条数据。

## 输入
<1, 23.0, 10, NULL>
<1, NULL, NULL, 'This is a book'>
<1, 25.2, NULL, NULL>
## 输出
<1, 25.2, 10, 'This is a book'>

同时,合并后的表可以提供批读和流读:

  • 批读:在批读时,读时合并仍然可以完成 Projection Pushdown,提供高性能的查询。
  • 流读:下游可以看到完整的、合并后的数据,而不是部分列。

- 流批一体读写

作为一个流批一体的数据湖存储,Paimon提供了流写流读和批写批读的功能。我们可以利用这些特性来构建Streaming Pipeline,并将数据沉淀到Paimon存储中。在使用 Paimon进行数据处理的过程中,它不仅可以实时更新Flink Streaming作业的数据,还能够支持OLAP查询各个Paimon表的历史和实时数据。此外,还可以通过Batch SQL对之前的分区进行回填,实现批读批写的功能,从而更加高效地进行数据处理。

Part 03

Apache Paimon的数据结构 

在Paimon中一张表的所有数据文件都存在一个层级的目录中。其中第一层包含3个文件夹,分别是snapshot、manifest、schema和data。snapshot文件夹主要用于存储这个表的快照,内容包括为上一次提交产生的 manifest,加上本次提交产生的 manifest 作为增量。schema文件夹主要用于存储这个表的元信息。manifest文件夹主要用于存储这个一系列manifest文件,manifest记录了每次经 checkpoint 触发而提交的数据文件变更,包含新增和删除的数据文件。Data文件夹按桶进行划分。每个桶文件夹包含一个LSM树和changelog文件。

图片

图2 Apache Paimon文件层级图

其文件的更新机制如下:在Apache Paimon中,会在Sink端维护一个Memory Table,用作数据合并,数据会写入到File Store和 Log Store当中,File Store中保存的就是经过桶分区的LSM树存储结构,Log Store则是保存了LSM中的 Write Ahead Log 信息。对于批读,只需要去读取File Store;而对于流读,则需要混合的读取,先读取File Store 中的全量数据,再通过Log Store读取变更的数据。

图片

图3 Apache Paimon读写机制

Part 04

Apache Paimon在威胁情报中的应用 

中国移动智慧家庭运营中心威胁情报云平台是基于中国移动网络和数据资源优势构建的。通过应用威胁情报挖掘技术和运营,该平台为安全产品和安全分析人员提供丰富的恶意IP/域名/样本IOC、whois、PDNS等情报查询服务,帮助企业以较低的成本享受专业的威胁情报服务,更好地了解和应对网络威胁,加强企业的安全防护能力。

在该平台上,业务分析人员需要仔细分析表中的数据完成每周的报表统计。然而,原始业务数据存储在mongoDB上,因此在大数据量的情况直接对mongoDB进行分析操作必定会对业务产生影响。为了减少对业务的影响,业务需要将mongoDB表导入到大数据平台进行分析。考虑到情报数据的规模达到亿级别,并且每天都会发生情报老化以及频繁更新的情况,如果每天都定时进行全量更新,那将会耗费大量资源且效率低下。

因此,为了解决这个问题,我们采用了Flink CDC技术和Apache Paimon数据湖。通过Flink CDC采集mongoDB的oplog,我们能够实现数据的增量更新到Apache Paimon中,从而提高了同步效率并降低了资源消耗。这种方法使得数据更新更加高效且无需大量的资源投入。

下面是一个Flink SQL通过CDC同步mongoDB情报表到paimon的例子。首先创建一张dim_mongo_threaten_score的mongodb-cdc表,接着创建一张dim_fts_threaten_score的paimon表,最后把dim_mongo_threaten_score导入到dim_fts_threaten_score。

CREATE TABLE IF NOT EXISTS dim_mongo_threaten_score (
    _id STRING,
    threaten_type  STRING,
    credit_level STRING,
    threaten_score STRING,
    threaten_source STRING,
    created_time TIMESTAMP(3),
    updated_time TIMESTAMP(3),
    attack_time STRING,
    source STRING,
    ip STRING,
    domain STRING,
    device STRING,
    iphone STRING,
    PRIMARY KEY(_id) NOT ENFORCED
) WITH (
    'connector' = 'mongodb-cdc',
    'hosts' = '......',
    'username' = '......',
    'password' = '.....',
    'database' = '......',
    'collection' = '......',
    'heartbeat.interval.ms' = '......',
    'poll.max.batch.size' = '......'
);
CREATE CATALOG fts_catalog WITH (
    'type'='table-store',
    'warehouse'='hdfs:///......'
);
USE CATALOG fts_catalog;
CREATE TABLE IF NOT EXISTS dim_fts_threaten_score (
    _id STRING,
    threaten_type  STRING,
    credit_level STRING,
    threaten_score STRING,
    threaten_source STRING,
    created_time TIMESTAMP(3),
    updated_time TIMESTAMP(3),
    attack_time STRING,
    source STRING,
    ip STRING,
    domain STRING,
    device STRING,
    iphone STRING,
    PRIMARY KEY(_id) NOT ENFORCED
) with (
    'bucket' = '......',
    'snapshot.time-retained' = '......'
);
insert into fts_catalog.`default`.dim_fts_threaten_score 
select * from default_catalog.default_database.dim_mongo_threaten_score;

从上面的脚本可以看出,我们采用了非常简洁高效的方法来实现从mongoDB到Apache Paimon的数据增量同步。只需要建立两张表并添加一个简单的insert语句,就可以完成整个同步过程。最后,从同步效率上来看,从原先的天级延迟到现在的秒级延迟,其提升显著;从资源消耗上来看,CPU从原先的8核减少到现有的4核,其提升也非常明显。

Part 05

总结展望  

Apache Paimon做为新一代数据湖,其支持高速数据摄取、变更数据跟踪和实时分析,并为读/写操作提供灵活的架构,并与各种计算引擎集成。由于其强大的性能,目前已完成了CDC同步业务数据库数据到数据湖的场景,实现了自动化数据集成。在未来,也可以基于PartialUpdate机制实现准实时宽表,解决大宽表延迟高和资源浪费的情况。同时,也可以基于AppendOnly机制来替换消息队列,达到解耦和降本增效的效果。

责任编辑:庞桂玉 来源: 移动Labs
相关推荐

2023-08-23 07:21:44

JsonSchema测试

2023-09-12 07:10:13

Nacos架构

2023-09-03 19:06:42

2023-09-17 17:51:43

Android 14

2023-07-23 18:47:59

Docker开源

2023-09-18 07:10:48

限流算法

2023-07-12 15:56:08

2023-09-02 20:15:46

VXLAN云网关

2023-08-29 07:02:09

3D

2021-07-07 13:47:38

OCR游戏运行图像

2023-04-15 20:25:23

微前端

2023-08-06 06:55:29

数字可视化物联网

2023-08-06 07:05:25

Android优化

2023-08-15 14:46:03

2023-07-16 18:49:42

HTTP网络

2023-06-03 21:06:05

2021-05-17 15:17:42

Thread物联网IOT路由器

2021-06-04 15:55:57

GPU云桌面5G+AI

2023-08-06 07:00:59

Openstack网络

2023-07-12 16:03:37

Android开发架构
点赞
收藏

51CTO技术栈公众号