Canal解析binlog发送Kafka

官方链接

https://github.com/alibaba/canal/wiki/QuickStart

mysql的搭建:https://blog.csdn.net/NOAH_123456/article/details/84203781
kafka的搭建:https://blog.csdn.net/NOAH_123456/article/details/103260001

配置文件canal/conf/canal.properties 关键点

## 服务模式kafka,默认为tcp
canal.serverMode = kafka 
## kafka服务地址
canal.mq.servers = 127.0.0.1:9092 

配置文件canal/conf/example/instance.properties

## mysql数据库ip端口
canal.instance.master.address=134.175.145.11:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
canal.mq.topic=example

kafka消费方收到都数据:

代码地址:https://github.com/sijunx/mySpider/blob/feature_word_dic_20191001001/spider-base/spider-base-kafka/src/test/java/KafkaConsumerTest.java
在这里插入图片描述
{
“data”: [{
“id”: “25”,
“line”: “0”,
“channel_name”: “xxxxyyyy”,
“channel_type”: “2”,
“on_flag”: “0”,
“hide_flag”: “0”,
“created_at”: “2019-11-26 16:35:19”,
“updated_at”: “2019-11-26 16:35:24”,
“create_user_id”: “0”,
“create_user_name”: “”,
“create_user_type”: “”,
“update_user_id”: “0”,
“update_user_name”: “”,
“update_user_type”: “”,
“is_delete”: “0”,
“drc_check_time”: “2019-11-26 16:35:24.814”,
“ezone_shard_info”: null
}],
“database”: “spider_dev”,
“es”: 1574757324000,
“id”: 8,
“isDdl”: false,
“mysqlType”: {
“id”: “bigint(20)”,
“line”: “tinyint(4)”,
“channel_name”: “varchar(20)”,
“channel_type”: “tinyint(4)”,
“on_flag”: “tinyint(4)”,
“hide_flag”: “tinyint(4)”,
“created_at”: “timestamp”,
“updated_at”: “timestamp”,
“create_user_id”: “bigint(20)”,
“create_user_name”: “varchar(100)”,
“create_user_type”: “varchar(100)”,
“update_user_id”: “bigint(20)”,
“update_user_name”: “varchar(100)”,
“update_user_type”: “varchar(100)”,
“is_delete”: “tinyint(4)”,
“drc_check_time”: “timestamp(3)”,
“ezone_shard_info”: “bigint(20)”
},
“old”: [{
“channel_type”: “0”,
“updated_at”: “2019-11-26 16:35:19”,
“drc_check_time”: “2019-11-26 16:35:19.524”
}],
“pkNames”: [“id”],
“sql”: “”,
“sqlType”: {
“id”: -5,
“line”: -6,
“channel_name”: 12,
“channel_type”: -6,
“on_flag”: -6,
“hide_flag”: -6,
“created_at”: 93,
“updated_at”: 93,
“create_user_id”: -5,
“create_user_name”: 12,
“create_user_type”: 12,
“update_user_id”: -5,
“update_user_name”: 12,
“update_user_type”: 12,
“is_delete”: -6,
“drc_check_time”: 93,
“ezone_shard_info”: -5
},
“table”: “channel_info”,
“ts”: 1574757325237,
“type”: “UPDATE”
}

canal的日志

在这里插入图片描述

问题

com.alibaba.otter.canal.parse.exception.PositionNotFoundException: can’t find start position for example

参照:https://blog.csdn.net/my201110lc/article/details/77885720

解决方案:删除meta.dat删除,再重启canal,问题解决;

集群操作:进入canal对应的zookeeper集群下,删除节点/otter/canal/destinations/xxxxx/1001/cursor ;重启canal即可恢复;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个基于 CanalKafka 和 PySpark Streaming 的实时案例,用于将 MySQL 数据库中的增量数据读取并发送Kafka,并通过 PySpark Streaming 进行实时计算。具体步骤如下: 1. 首先需要安装并启动 CanalKafka。 2. 创建一个 Python 脚本,使用 Canal 客户端连接到 Canal Server,并订阅指定的 MySQL 数据库和表。然后将解析出的增量数据发送Kafka。 ```python from canal.client import Client from kafka import KafkaProducer import json # 创建Canal客户端对象 client = Client() client.connect(host='127.0.0.1', port=11111) client.check_valid(username=b'', password=b'') # 创建Kafka生产者对象 producer = KafkaProducer(bootstrap_servers='127.0.0.1:9092') # 订阅指定的数据库和表 client.subscribe(client_id='1001', destination='example', filter='.*\\..*') try: while True: message = client.get(batch_size=100, timeout=100) for entry in message.get('entries'): if entry.entryType == 'ROWDATA': row_change = entry.rowChange event_type = row_change.eventType for row_data in row_change.rowDatas: row_dict = {} for column in row_data.afterColumns: row_dict[column.name] = column.value # 将解析出的增量数据发送Kafka producer.send(topic='example', value=json.dumps(row_dict).encode('utf-8')) except Exception as e: print(e) finally: client.disconnect() ``` 上述代码中,首先创建了一个 Canal 客户端对象,并连接到 Canal Server。然后创建了一个 Kafka 生产者对象,用于将解析出的增量数据发送Kafka。接着,订阅了指定的 MySQL 数据库和表,并循环获取增量数据。对于每个增量数据,将其转换为字典格式,并使用 `json.dumps` 方法将字典编码为 JSON 字符串,并使用 Kafka 生产者将其发送到指定的 Kafka 主题中。 3. 创建一个 PySpark Streaming 应用程序,从 Kafka 主题中读取增量数据,并进行实时计算。例如,以下代码用于计算每隔5秒钟的单词计数: ```python from pyspark import SparkConf, SparkContext from pyspark.streaming import StreamingContext from pyspark.streaming.kafka import KafkaUtils import json # 创建SparkConf对象 conf = SparkConf().setAppName("Real-time Word Count") # 创建SparkContext对象 sc = SparkContext(conf=conf) # 创建StreamingContext对象,每隔5秒钟处理一次数据 ssc = StreamingContext(sc, 5) # 从Kafka读取数据 kafka_params = { "bootstrap.servers": "127.0.0.1:9092", "group.id": "example" } kafka_stream = KafkaUtils.createDirectStream( ssc, ["example"], kafka_params ) # 对Kafka中的每条消息进行解析并扁平化处理 messages = kafka_stream.map(lambda x: json.loads(x[1])) words = messages.flatMap(lambda x: x.values()) # 对每个单词进行计数 word_counts = words.map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b) # 打印计数结果 word_counts.pprint() # 启动StreamingContext并等待它完成 ssc.start() ssc.awaitTermination() ``` 上述代码中,首先创建了一个 `SparkConf` 对象,用于设置应用程序名称。然后创建了一个 `SparkContext` 对象,用于连接到 Spark 集群。接着,创建了一个 `StreamingContext` 对象,并设置每隔5秒钟处理一次数据。然后使用 `createDirectStream` 方法从 Kafka 主题中读取数据,并使用 `json.loads` 方法将 JSON 字符串转换为字典格式。接着,对字典中的值进行扁平化处理,并使用 `map` 和 `reduceByKey` 方法对每个单词进行计数。最后,使用 `pprint` 方法打印计数结果。最后启动 `StreamingContext` 并等待它完成。 运行上述代码后,您应该可以在终端看到类似以下的结果: ``` ------------------------------------------- Time: 2022-10-20 16:00:05 ------------------------------------------- (PySpark, 1) (Streaming, 1) (Hello, 1) (PySparkStreaming, 1) (World, 1) ------------------------------------------- Time: 2022-10-20 16:00:10 ------------------------------------------- (PySpark, 2) (Streaming, 1) (Hello, 2) (PySparkStreaming, 1) (World, 1) ``` 注意,以上代码仅提供了一个简单的示例,实际的 Canal 和 PySpark Streaming 应用程序可能需要更多的配置和代码来实现特定的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值