Pulsar 数据接入Doris

第一部分:Kop架构介绍:

KoP是Kafka on Pulsar的简写,顾名思义就是如何在Pulsar上实现对Kafka数据的读写。KoP 将 Kafka 协议处理插件引入 Pulsar broker。这样一来,Apache Pulsar 就支持原生 Apache Kafka 协议。将 KoP 协议处理插件添加到现有 Pulsar 集群后,用户不用修改代码就可以将现有的 Kafka 应用程序和服务迁移到 Pulsar。其主要特点如下:

  • 利用企业级多租户特性简化运营。

  • 避免数据搬迁,简化操作。

  • 利用 Apache BookKeeper 和分层存储持久保留事件流。

  • 利用 Pulsar Functions 进行无服务器化事件处理。
    kop架构如下图,kop引入一个新的协议处理插件,该协议处理插件利用 Pulsar 的现有组件(例如 Topic 发现、分布式日志库-ManagedLedger、cursor 等)来实现 Kafka 传输协议。
    在这里插入图片描述
    第二部分:Routine Load 接收Pular思路

    Doris Routine Load支持了将Kafka数据接入Doris,并保障了数据接入过程中的事务性操作。Apache Pulsar定位一个云原生时代的企业级的消息发布和订阅系统。已经在很多线上服务使用。那么Pulsar用户如何将数据数据接入Doris呢?
    由于Kop直接在Pulsar侧提供了对Kafka的兼容,那么对于Doris来说可以像使用Kafka一样使用Plusar。整个过程对于Doris来说无需任务改变,就能将Pulsar数据接入Doris,并且可以获得Routine Load的事务性保障。
    在这里插入图片描述
    通过对比发现通过Kop方案实现将Pulsar数据接入Kafka是一个简单并且可靠的方案,下面我们对该方案进行介绍和测试。

第三部分:操作实战:

1. Pulsar Standalone部署:

  1. JDK安装:略
  2. 下载Pulsar二进制包,并解压:
#下载
wget https://archive.apache.org/dist/pulsar/pulsar-2.10.0/apache-pulsar-2.10.0-bin.tar.gz
#解压并进入安装目录
tar xvfz apache-pulsar-2.10.0-bin.tar.gz
cd apache-pulsar-2.10.0

2. Kop组件添加:

  1. 下载Kop原理
git clone https://github.com/streamnative/kop.git
cd kop
  1. 编译Kop项目:
mvn clean install -DskipTests
  1. 配置:在pulsar根目录下创建protocols文件夹并把编译好的nar包添加到protocols文件夹中
mkdir apache-pulsar-2.10.0/protocols
# mv kop/kafka-impl/target/pulsar-protocol-handler-kafka-{{protocol:version}}.nar apache-pulsar-2.10.0/protocols
cp kop/kafka-impl/target/pulsar-protocol-handler-kafka-2.11.0-SNAPSHOT.nar apache-pulsar-2.10.0/protocols
  1. 添加后的结果查看:
[root@17a5da45700b apache-pulsar-2.10.0]# ls protocols/
pulsar-protocol-handler-kafka-2.11.0-SNAPSHOT.nar

3. Kop配置添加:

  1. 在standalone.conf或者broker.conf添加如下配置
#kop适配的协议
messagingProtocols=kafka
#kop 的NAR文件路径
protocolHandlerDirectory=./protocols
#是否允许自动创建topic
allowAutoTopicCreationType=partitioned
  1. 添加如下服务监听
# Use `kafkaListeners` here for KoP 2.8.0 because `listeners` is marked as deprecated from KoP 2.8.0 
kafkaListeners=PLAINTEXT://127.0.0.1:9092# This config is not required unless you want to expose another address to the Kafka client.
# If it’s not configured, it will be the same with `kafkaListeners` config by default
kafkaAdvertisedListeners=PLAINTEXT://127.0.0.1:9092
brokerEntryMetadataInterceptors=org.apache.pulsar.common.intercept.AppendIndexMetadataInterceptor
brokerDeleteInactiveTopicsEnabled=false

当出现如下错误:

java.lang.IllegalArgumentException: Broker has disabled transaction coordinator, please enable it before using transaction.

添加如下配置,开启transactionCoordinatorEnabled

kafkaTransactionCoordinatorEnabled=true
transactionCoordinatorEnabled=true

这个错误一定要修复,不然看到的现象就是使用kafka自带的工具:bin/kafka-console-producer.sh和bin/kafka-console-consumer.sh发送和消费数据正常,但是在Doris中数据无法同步过来

  1. Pulsar启动
#前台启动
bin/pulsar standalone
#后台启动
pulsar-daemon start standalone

4. Doris建表

#进入Doris
mysql -u root  -h 127.0.0.1 -P 9030
# 创建数据库
create database pulsar_doris;
#切换数据库
use pulsar_doris;
#创建clicklog表
CREATE TABLE IF NOT EXISTS pulsar_doris.clicklog
(
    `clickTime` DATETIME NOT NULL COMMENT "点击时间",
    `type` String NOT NULL COMMENT "点击类型",
    `id`  VARCHAR(100) COMMENT "唯一id",
    `user` VARCHAR(100) COMMENT "用户名称",
    `city` VARCHAR(50) COMMENT "所在城市"
)
DUPLICATE KEY(`clickTime`, `type`)
DISTRIBUTED BY HASH(`type`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

5. 创建Routine Load任务

CREATE ROUTINE LOAD pulsar_doris.load_from_kafka_test ON clicklog
COLUMNS(clickTime,id,type,user)
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" = "127.0.0.1:9092",
    "kafka_topic" = "test",
    "property.group.id" = "doris"
 );

上述命令中的解释如下:

  • pulsar_doris :Routine Load 任务所在的数据库
  • load_from_kafka_test:Routine Load 任务名称
  • clicklog:Routine Load 任务的目标表,也就是配置Routine Load 任务将数据导入到Doris哪个表中。
  • strict_mode:导入是否为严格模式,这里设置为false。
  • format:导入数据的类型,这里配置为json。
  • kafka_broker_list:kafka broker服务的地址
  • kafka_broker_list:kafka topic名称,也就是同步哪个topic上的数据。
  • property.group.id:消费组id
    6. 数据导入和测试
    6.1 数据导入
    我写了一个java程序模拟生成kafka数据并发送到kafka,该程序模拟生成5000万条数据并发送到kafka。核心代码如下:
@Component
public class ProducerThread implements CommandLineRunner {
    @Autowired
    private Producer producer;
    @Override
    public void run(String... args) throws Exception {
        System.out.println("The Runner start to initialize ...");
        String strDateFormat = "yyyy-MM-dd HH:mm:ss";
        try {
            for(int j =0 ; j<50000;j++){
              int batchSize = 1000;
                for(int i = 0 ; i<batchSize ;i++){
                    ClickLog clickLog  = new ClickLog();
                    clickLog.setId(UUID.randomUUID().toString());
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(strDateFormat);
                    clickLog.setClickTime(simpleDateFormat.format(new Date()));
                    clickLog.setType("webset");
                    clickLog.setUser("user"+ new Random().nextInt(1000) +i);
                    producer.sendMessage(Constant.topicName, JSONObject.toJSONString(clickLog));
                }
               // Thread.sleep(50L);
                Constant.msgCount += batchSize;
                System.out.println("msgCount:"+Constant.msgCount);
            }
            System.out.println("msgCount:"+Constant.msgCount);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

执行如下命令下载源码并编译执行,注意这些代码中默认的配为

  • spring.kafka.bootstrap-servers=127.0.0.1:9092
  • spring.kafka.consumer.group-id=myGroup
  • topicName = "test
#下载源码
git clone https://github.com/LOVEGISER/kafka-test
#进行项目
cd kafka-test
#编译项目
mvn install 
#运行项目
nohup java -jar target/kafka-0.0.1-SNAPSHOT.jar &

当kafka-0.0.1-SNAPSHOT.jar运行后,看日志会不断后发送的消息量msgCount打印,到发送到5000万条后数据将发送完成。

msgCount:50000000

6.2 ROUTINE LOAD任务查看
执行SHOW ALL ROUTINE LOAD FOR load_from_kafka_test \G;命令,查看导入任务的状态。

mysql>  SHOW ALL ROUTINE LOAD FOR load_from_kafka_test \G;
*************************** 1. row ***************************
                  Id: 87873
                Name: load_from_kafka_test6
          CreateTime: 2022-05-31 12:03:34
           PauseTime: NULL
             EndTime: NULL
              DbName: default_cluster:pulsar_doris
           TableName: clicklog1
               State: RUNNING
      DataSourceType: KAFKA
      CurrentTaskNum: 1
       JobProperties: {"partitions":"*","columnToColumnExpr":"clickTime,id,type,user","maxBatchIntervalS":"20","whereExpr":"*","dataFormat":"json","timezone":"Europe/London","send_batch_parallelism":"1","precedingFilter":"*","mergeType":"APPEND","format":"json","json_root":"","maxBatchSizeBytes":"209715200","exec_mem_limit":"2147483648","strict_mode":"false","jsonpaths":"","deleteCondition":"*","desireTaskConcurrentNum":"3","maxErrorNum":"0","strip_outer_array":"false","currentTaskConcurrentNum":"1","execMemLimit":"2147483648","num_as_string":"false","fuzzy_parse":"false","maxBatchRows":"300000"}
DataSourceProperties: {"topic":"test","currentKafkaPartitions":"0","brokerList":"127.0.0.1:9092"}
    CustomProperties: {"group.id":"doris","kafka_default_offsets":"OFFSET_END","client.id":"doris.client"}
           Statistic: {"receivedBytes":5739001913,"runningTxns":[],"errorRows":0,"committedTaskNum":168,"loadedRows":50000000,"loadRowsRate":23000,"abortedTaskNum":1,"errorRowsAfterResumed":0,"totalRows":50000000,"unselectedRows":0,"receivedBytesRate":2675000,"taskExecuteTimeMs":2144799}
            Progress: {"0":"51139566"}
                 Lag: {"0":0}
ReasonOfStateChanged: 
        ErrorLogUrls: 
            OtherMsg: 
1 row in set (0.00 sec)

ERROR: 
No query specified

从上面结果可以看到totalRows为50000000,errorRows为0。说明数据补充不丢的导入Doris了。
6.3 数据统计验证
执行如下命令统计表中的数据,发现统计的结果也是50000000,符合预期

mysql> select count(*) from clicklog;
+----------+
| count(*) |
+----------+
| 50000000 |
+----------+
1 row in set (3.73 sec)

mysql> 
  1. SSL方式接入Pulsar
    待完善…

最后宣传下我的书:Spark内核和应用实战,可以购买我的新书。
京东地址: https://item.jd.com/13613302.html
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值