Apache-druid+kafka基本搭建

302 阅读3分钟

Apcahe-druid 26.0.0下载链接

dlcdn.apache.org/druid/26.0.…

1. 上传到需要部署的服务器目录上 -》 解压

image.png

2. cd 到自己上传文件的目录进行解压

cd /home/pi/druid
tar -zxvf apache-druid-26.0.0-bin.tar.gz

3. 解压后进入到bin目录

image.png

自行安装好Java环境,并且防火墙和服务器安全组开放

Coordinator	8081	管理集群上的数据可用性

Historical	8083	存储历史查询到的数据
Broker	        8082	处理来自外部客户端的查询请求
Realtime	        8084	
Overlord	        8090	控制数据摄取工作负载的分配
MiddleManager	8091	负责摄取数据
Router	        8888	可以将请求路由到Brokers, Coordinators, and Overlord
ZooKeeper         2181     
Kafka             9092

4、 使用命令行后台启动,启动成功后用服务器ip:8888端口访问页面,查看是否正常

nohup ./start-micro-quickstart &

1694059057768.png

5、安装docker,使用docker安装kafka

可以根据这个文章来学习安装 最详细的ubuntu 安装 docker教程_ubuntu docker_软件测试大空翼的博客-CSDN博客

执行运行命令,docker没有容器会直接拉取,命令的 XXXX 改为自己的服务器公网ip

docker run -id --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -eKAFKA_ZOOKEEPER_CONNECT=XXXX:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://XXXX:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka

执行docker ps命令,检查kafka是否成功启动

image.png 执行成功后,进入docker容器内部后

docker exec -it kafka /bin/bash

cd /opt/kafka_2.13-2.8.1/bin

创建一个队列 XXXX改为自己服务器ip

./kafka-topics.sh --create --zookeeper XXXX:2181 --replication-factor 1 --partitions 1 --topic vehicleTrajectory

./kafka-topics.sh -list -zookeeper XXXX:2181 #查看是否存在刚才创建的队列

image.png

测试一下kafka的发送和接收 1.执行启动客户端接收的命令接收数据

./kafka-console-consumer.sh --bootstrap-server XXXX:9092 --topic vehicleTrajectory --from-beginning

image.png

2.新建一个窗口,连接刚才部署的服务器,进入到kafka容器内,进入到/opt/kafka_2.13-2.8.1/bin目录,执行发送端发送的命令进行发送消息

./kafka-console-producer.sh --broker-list XXXX:9092 --topic vehicleTrajectory

image.png 通过测试,发送后,客户端可以顺利接收到,证明kafka正常使用

6、druid连接Kafka配置,定时通过Kafka队列拉取数据,Java只需要连接kafka把消息发送到kafka队列上

druid连接kafka配置文件,dimensions 需要根据自身需要做调整

{
    "type": "kafka",
    "dataSchema": {
        "dataSource": "vehicleTrajectory",
        "parser": {
            "tyep": "string",
            "parseSpec": {
                "format": "json",
                "timestampSpec": {
                    "column": "createTime",
                    "format": "iso"
                },
                "dimensionsSpec": {
                    "dimensions": [
                        "hdop",
                        "alt",
                        "sog",
                        "cog",
                        "lat",
                        "lon",
                        "status",
                        "cameraId",
                        "startTime",
                        "address"
                    ]
                }
            }
        },
        "metricsSpec": [],
        "granularitySpec": {
            "type": "uniform",
            "segmentGranularity": "week",
            "queryGranularity": "minute",
            "rollup": true
        }
    },
    "tuningConfig": {
        "type": "kafka",
        "reportParseExceptions": false
    },
    "ioConfig": {
        "topic": "vehicleTrajectory",
        "replicas": 1,
        "taskDuration": "PT10M",
        "completionTimeout": "PT20M",
        "consumerProperties": {
            "bootstrap.servers": "XXXX:9092"
        }
    }
}

image.png 提交链接后,可以看到druid拉取任务配置

image.png

7、springboot链接kafka进行配置链接

kafka maven依赖

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

application.yml 配置

spring:
  kafka:
    bootstrap-servers: XXXX:9092
    listener:
      concurrency: 5
    producer:
      retries: 3
      batch-size: 10000
      buffer-memory: 33554432
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      group-id: test-consumer-group

Java 封装工具类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * 用于操作kafka
 */
@Component
public class KafkaSender {

    //kafka队列名称
    public final static String MSG_TOPIC = "vehicleTrajectory";
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;


    private static KafkaTemplate<String, String> template;

    @PostConstruct
    public void init() {
        template = kafkaTemplate;
    }

    /**
     * 向kafka队列发送消息
     */
    public static boolean send(String topic, String message) {
        try {
            template.send(topic, message);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

}

测试请求 vehicleTrajectory 根据自身创建的实体类和druid连接kafka配置文件中的dimensions 字段对应

KafkaSender.send(KafkaSender.MSG_TOPIC, JSONUtil.toJsonStr(vehicleTrajectory));
log.info("推送位置信息到kafka:{}" + JSONUtil.toJsonStr(vehicleTrajectory));

测试成功后的数据在druid上

image.png