需求背景:类似Excel的文件进行解析,将数据全部存储到StarRocks当中。StarRocks是一个用于大数据分析的高性能仓库,兼容mysql协议,具体的大家可以去官网了解。官网上面有中文文档,这个让我觉得十分友好。这边选择的是文件解析成json格式,将数据投递kafka,StarRocks支持任务(导入作业),可以开起一个任务时刻去消费kafka里面的数据。环境是在docker中搭建的,我十分喜欢docker这个工具,虽然每次搭建环境都会遇到问题,但是这个工具是真的很好用。
首先先贴出一个错误,这个是StarRocks创建导入作业的提示,导入作业已经创建好了的,但是在运行的时候,出现的错误
ErrorReason{errCode = 2, msg='Failed to send get kafka partition info request to BE TNetworkAddress(hostname:127.0.0.1, port:8060), err: Ocurrs time out with specfied time 12 SECONDS'}
这个问题就是StarRocks所在的容器访问不到kafka所在的容器,容器之间网络不互通,我在本地搭建环境都是使用的docker-compose,没有直接在命令行使用过,出现这个问题大概率就是docker中桥接网络模式出现的网络隔离问题,可以先看一下容器内的网络ip是不是在同一网段,如果不是的话可以先解决这个问题,而且docker的容器是可以在多个docker内部网络的,这个之前的文档有说过这个问题。
第二个错误
org.apache.kafka.clients.NetworkClient -- [Producer clientId=producer-1] Error connecting to node 2f7fa93142a9:9092 (id: 0 rack: null)
java.net.UnknownHostException: 不知道这样的主机。 (2f7fa93142a9)
创建的容器的时候,一起创建了一个可视化工具,也是用docker创建的,这里出现的问题是,在连接docker内的kafka的时候,topic是可以正常创建的,但是当生产者在投递消息的时候会出现这个问题。当时觉得很离谱的就是明明和kafka可以进行通信,但是不能投递消息。这个和kafka的投递的流程有关系。也是和配置有关系
在docker的内部会这样解析网络,所以当第一次请求kafka的时候,kafka会根据自身的策略,返回一个节点(broker),一个kafka就是一个broker,这里可以当成内部的负载均衡策略,因为生产环境大多数应该都是集群,不是单机模式。所以在投递消息的时候,宿主机根本就不知道(容器名+端口)这个服务应该去找谁,所以会显示不知道这样的主机这样的错误,大家可以在容器内部去看网络ip,容器的缩写名字和容器ip是一样的,解决这个问题的办法很简单,就是在宿主机的host文件当中加上127 和容器的名字,这样宿主机就知道找谁了。(可能是直接访问宿主机端口,然后进入docker,但我这只是猜测,菜鸡,研究的并不深入)。
最后我这贴一下docker文件,这就是docker-compose的魅力所在,一个人创建好了,其他人拿来就用
version: "2"
services:
kafdrop:
image: obsidiandynamics/kafdrop
container_name: kafdrop
ports:
- "9000:9000"
environment:
KAFKA_BROKERCONNECT: "kafka:29092"
JVM_OPTS: "-Xms16M -Xmx48M -Xss180K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify"
depends_on:
- "kafka"
kafka:
image: obsidiandynamics/kafka
container_name: kafka
ports:
- "2181:2181"
- "9092:9092"
environment:
KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9092"
KAFKA_ADVERTISED_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9092"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
KAFKA_ZOOKEEPER_SESSION_TIMEOUT: "6000"
KAFKA_RESTART_ATTEMPTS: "10"
KAFKA_RESTART_DELAY: "5"
ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL: "0"
startrocks:
image: 945c0e7562cb98f00f79fa1a35919e33946de027a27f454932df02f56d9b513d
container_name: startrocks
ports:
- "9030:9030"
- "8030:8030"
- "8040:8040"
根据自己的需要去增加端口或者删除,kafdrop这个是可视化工具,有一篇腾讯云的文档是介绍如何搭建的,也是docker-compose,下面的StarRocks,不需要的话直接删了吧。这里的kafka运行的模式使用zookepper的,这个zookepper是在容器kafka容器内部自带的,现在的新版本支持KRaft模式,这个模式是不需要zookepper的,但是需要增加配置contoller,具体的没有看。
kafka容器在opt目录下可以找到
版权归原作者 小浪蹄子233 所有, 如有侵权,请联系我们删除。