Doris对接消费kafka数据方案实现

本文介绍了如何将Kafka数据同步到Doris的两种方法:一是使用Doris的RoutineLoad功能,支持处理普通间隔字符串和JSON格式的数据;二是通过FlinkSQL实现数据对接,将数据写入Doris。详细步骤包括创建接收表、配置 RoutineLoad 以及FlinkSQL的相关设置,并提供了相关命令和参数解读。

         本篇主要讲述消费kafka中的数据同步到Doris中。其他olap分析型数据库中,如clickhouse中有对应的kafka引擎表消费kafka的数据而后再通过物化视图的方式将消费的数据同步到对应的物理表中。但在doris中没有对应的kafka引擎表将要如何来实现同步kafka的数据呢?

   

接下来该篇将讲述两种方案来实现同步kafka的数据到Doris中:

通过Routine Load Doris带有的数据导入的方式来实现

  • kafka中数据为普通间隔字符串,如 ‘|’

 创建接收数据表

CREATE TABLE IF NOT EXISTS sea.user
(
    siteid INT DEFAULT '10',
    citycode SMALLINT,
    username VARCHAR(32) DEFAULT '',
    pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(siteid, citycode, username)
DISTRIBUTED BY HASH(siteid) BUCKETS 10
PROPERTIES("replication_num" = "1");

对接kafka语句

 CREATE ROUTINE LOAD sea.test ON 
 user COLUMNS TERMINATED BY "|",
 COLUMNS(siteid,citycode,username,pv)
 PROPERTIES(
 "desired_concurrent_number"="1",
 "max_batch_interval"="20",
 "max_batch_rows"="300000",
 "max_batch_size"="209715200")
 FROM KAFKA(
 "kafka_broker_list"="192.168.18.129:9092",
 "kafka_topic"="doris",
 "property.group.id"="gid",
 "property.clinet.id"="cid",
 "property.kafka_default_offsets"="OFFSET_BEGINNING");


 

要注意的是:sea为库名,必须在导入test别名指定,同时user表不能在指定否则会不识别报错。

  • kafka中数据为JSON数据

    创建接收数据的表

  • create table dev_ods.ods_user_log(
        `distinct_id` String not null COMMENT '会员id',
        `time`          bigint not null COMMENT '时间戳',
        event_at      datetime comment '事件时间;年月日,时分秒',
        `_track_id` string COMMENT '追踪id',
        `login_id` string COMMENT '登录号',
        `lib`       String COMMENT 'lib',
        `anonymous_id` String COMMENT '匿名id',
        `_flush_time` bigint COMMENT '刷新时间',
        `type`      String COMMENT '类型',
        `event`     String COMMENT '事件类型',
        `properties` String COMMENT '具备的属性',
        `identities` string comment '身份信息',
        `dt`         Date COMMENT '事件时间'
    )
    primary key (distinct_id,`time`)
    distributed by hash(distinct_id);

    对接kafka的语句,解析JSON数据

CREATE ROUTINE LOAD dev_ods.user_log ON ods_user_log
COLUMNS(distinct_id,time,_track_id,login_id,lib,anonymous_id,_flush_time,type,event,properties,identities,dt = from_unixtime(time/1000, '%Y%m%d'),event_at=from_unixtime(time/1000, 'yyyy-MM-dd HH:mm:ss'))
PROPERTIES
(
    "desired_concurrent_number"="3",
    "max_batch_interval" = "20",
    "max_batch_rows" = "300000",
    "max_batch_size" = "209715200",
    "strict_mode" = "false",
    "format" = "json"
 )FROM KAFKA
(
    "kafka_broker_list"= "10.150.20.12:9092",
    "kafka_topic" = "bigDataSensorAnalyse",
    "property.group.id"="test_group_2",
    "property.kafka_default_offsets" = "OFFSET_BEGINNING",
    "property.enable.auto.commit"="false"
 );

 JSON结构:

其中properties的字段值为:JSON对象,dt,event_at不是kafka中的数据的值,为处理后写入表中。

说明:1)如果json数据是以数组开始,并且数组中每个对象是一条记录,则需要将strip_outer_array设置成true,表示展平数组。

   2)如果json数据是以数组开始,并且数组中每个对象是一条记录,在设置jsonpath时,我们的ROOT节点实际上是数组中对象。

   支持两种json数据格式:
  1){"category":"a9jadhx","author":"test","price":895}
  2)[
            {"category":"a9jadhx","author":"test","price":895},
            {"category":"axdfa1","author":"EvelynWaugh","price":1299}
     ]


 

 这也是目前Doris所支持的两种JSON数据格式的解析。

JSON格式为如下数组结构时:

{  "RECORDS": [    {      "category": "11",      "title": "SayingsoftheCentury",      "price": 895,      "timestamp": 1589191587    },    {      "category": "22",      "author": "2avc",      "price": 895,      "timestamp": 1589191487    },    {      "category": "33",      "author": "3avc",      "title": "SayingsoftheCentury",      "timestamp": 1589191387    }  ]}

对应解析SQL语句为:

6. 用户指定根节点json_root
    CREATE ROUTINE LOAD example_db.test1 ON example_tbl
    COLUMNS(category, author, price, timestamp, dt=from_unixtime(timestamp, '%Y%m%d'))
    PROPERTIES
    (
        "desired_concurrent_number"="3",
        "max_batch_interval" = "20",
        "max_batch_rows" = "300000",
        "max_batch_size" = "209715200",
        "strict_mode" = "false",
        "format" = "json",
        "jsonpaths" = "[\"$.category\",\"$.author\",\"$.price\",\"$.timestamp\"]",
        "strip_outer_array" = "true",
        "json_root" = "$.RECORDS"
    )
    FROM KAFKA
    (
        "kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092",
        "kafka_topic" = "my_topic",
        "kafka_partitions" = "0,1,2",
        "kafka_offsets" = "0,0,0"
    );


 

查看对应的查看routine load状态​​​​​​​

显示所有的example_db库下的状态
use example_db;
SHOW ALL ROUTINE LOAD;
 
Ⅴ).查看routine load状态
SHOW ALL ROUTINE LOAD FOR datasource_name.kafka_load;
Ⅵ).常用routine load命令
a).暂停routine load
PAUSE ROUTINE LOAD FOR datasource_name.kafka_load;
b).恢复routine load
RESUME ROUTINE LOAD FOR datasource_name.kafka_load;
c).停止routine load
STOP ROUTINE LOAD FOR datasource_name.kafka_load;
d).查看所有routine load
SHOW [ALL] ROUTINE LOAD FOR datasource_name.kafka_load;
e).查看routine load任务
SHOW ROUTINE LOAD TASK datasource_name.kafka_load;
Ⅶ).查看数据
SELECT * FROM datasource_name.table_name LIMIT 10;

参数解读​​​​​​​

1) OFFSET_BEGINNING: 从有数据的位置开始订阅。
2) OFFSET_END: 从末尾开始订阅

​​​​​​​

注:上述对接kafka为无认证的kafka对接方式,更多可以参看文章底部官网链接查看。

2.通过FlinkSQL的方式对接kafka写入Doris​​​​​​​

create table flink_test_1 ( 
    id BIGINT,
    day_time VARCHAR,
    amnount BIGINT,
    proctime AS PROCTIME ()
)
with ( 
    'connector' = 'kafka',
    'topic' = 'flink_test',
    'properties.bootstrap.servers' = '10.150.60.5:9092', 
    'properties.group.id' = 'flink_gp_test1',
    'scan.startup.mode' = 'earliest-offset',
    'format' = 'json',
    'json.fail-on-missing-field' = 'false',
    'json.ignore-parse-errors' = 'true' 
);
CREATE TABLE sync_test_1( 
        day_time string,
        total_gmv bigint,
    PRIMARY KEY (day_time) NOT ENFORCED
    ) WITH (  
        'connector' = 'starrocks', 
        'jdbc-url'='jdbc:mysql://10.150.60.2:9030', 
        'load-url'='10.150.60.2:8040;10.150.60.11:8040;10.150.60.17:8040', 
        'database-name' = 'test', 
        'table-name' = 'sync_test_1', 
        'username' = 'root', 
        'password' = 'bigdata1234', 
        'sink.buffer-flush.max-rows' = '1000000', 
        'sink.buffer-flush.max-bytes' = '300000000', 
        'sink.buffer-flush.interval-ms' = '5000',
        'sink.max-retries' = '3'
    
);

INSERT INTO sync_test_1 
SELECT day_time,SUM(amnount) AS total_gmv FROM flink_test_1 GROUP BY day_time;

​​​​​​​

    以上FlinkSQL同步数据方式提供参考,更多Flink sql相关内容会在后期文章中逐步讲解。

Doris官网链接

参考文章

 kafka 导入数据到 doris​​​​​​​

上层应用业务对实时数据的需求,主要包含两部分内容:1、 整体数据实时分析。2、 AB实验效果的实时监控。这几部分数据需求,都需要进行的下钻分析支持,我们希望能够建立统一的实时OLAP数据仓库,并提供一套安全、可靠的、灵活的实时数据服务。目前每日新增的曝光日志达到几亿条记录,再细拆到AB实验更细维度时,数据量则多达上百亿记录,多维数据组合下的聚合查询要求秒级响应时间,这样的数据量也给团队带来了不小的挑战。OLAP层的技术选型,需要满足以下几点:1:数据延迟在分钟级,查询响应时间在秒级2:标准SQL交互引擎,降低使用成本3:支持join操作,方便维度增加属性信息4:流量数据可以近似去重,但订单行要精准去重5:高吞吐,每分钟数据量在千W级记录,每天数百亿条新增记录6:前端业务较多,查询并发度不能太低通过对比开源的几款实时OLAP引擎,可以发现Doris和ClickHouse能够满足上面的需求,但是ClickHouse的并发度太低是个潜在的风险,而且ClickHouse的数据导入没有事务支持,无法实现exactly once语义,对标准SQL的支持也是有限的。所以针对以上需求Doris完全能解决我们的问题,DorisDB是一个性能非常高的分布式、面向交互式查询的分布式数据库,非常的强大,随着互联网发展,数据量会越来越大,实时查询需求也会要求越来越高,DorisDB人才需求也会越来越大,越早掌握DorisDB,以后就会有更大的机遇。本课程基于真实热门的互联网电商业务场景为案例讲解,具体分析指标包含:AB版本分析,下砖分析,营销分析,订单分析,终端分析等,能承载海量数据实时分析,数据分析涵盖全端(PC、移动、小程序)应用。整个课程,会带大家实践一个完整系统,大家可以根据自己的公司业务修改,既可以用到项目中去,价值是非常高的。本课程包含的技术:开发工具为:IDEA、WebStormFlink1.9.0DorisDBHadoop2.7.5Hbase2.2.6Kafka2.1.0Hive2.2.0HDFS、MapReduceFlume、ZookeeperBinlog、Canal、MySQLSpringBoot2.0.8.RELEASESpringCloud Finchley.SR2Vue.js、Nodejs、Highcharts、ElementUILinux Shell编程等课程亮点:1.与企业接轨、真实工业界产品2.DorisDB高性能分布式数据库3.大数据热门技术Flink4.支持ABtest版本实时监控分析5.支持下砖分析6.数据分析涵盖全端(PC、移动、小程序)应用7.主流微服务后端系统8.天级别与小时级别多时间方位分析9.数据实时同步解决方案10.涵盖主流前端技术VUE+jQuery+Ajax+NodeJS+ElementUI11.集成SpringCloud实现统一整合方案12.互联网大数据企业热门技术栈13.支持海量数据实时分析14.支持全端实时数据分析15.全程代码实操,提供全部代码和资料16.提供答疑和提供企业技术方案咨询企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值