sparkstreaming实时接收rabbitmq的数据(包含scala以及pyspark版本)

目录

 

背景

1:scala版本

2:pyspark版本

注意:以下都是采坑点

RabbitMQ启用MQTT功能


背景

平常我们会实时监听kafka的数据,并且与流处理框架比如sparkstreaming和flink进行连接进行消费处理,这一套非常成熟且有官方工具包。但是目前有业务场景需要接收rabbitmq的数据,这就比较麻烦了,因为不想kafka有直接的kafkautils能创建流。

在sspark1.6以前的版本有mqtt这个模块,里面有MQTTutils这个工具类是可以直接创建rabbitmq数据流的

现有的spark版本已经不支持直接创建rabbit数据流。所以想要实现该功能可以降低spark版本,或者采用方案2

1:scala版本

maven依赖如下,spark版本为1.6.3 
<dependency>
            <groupId>com.stratio.receiver</groupId>
            <artifactId>spark-rabbitmq_1.6</artifactId>
            <version>0.4.0</version>
 </dependency>

连接spark代码如下
 def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setAppName("1")
    conf.setMaster("local[2]")
    val ssc = new StreamingContext(conf,Duration(3000))
    val stream = RabbitMQUtils.createStream(ssc,Map(
      "hosts"-> "localhost",
      "port" -> "5672",
      "queueName" -> "hello",
      "exchangeName" -> "",
      "userName" -> "guest",
      "password" -> "guest",
      "durable"-> "false"
    ))
    stream.print()
    ssc.start()
    ssc.awaitTermination()
  }

 

2:pyspark版本

            brokerUrl = "tcp://localhost:1883"
            topic = "11"  # all messages
            env = EnvUtil.getEnv()
            ssc = None
            sparkSession = SparkSession.builder.master("local[2]").appName(
                    "test").getOrCreate()
                ssc = StreamingContext(sparkSession.sparkContext,3)
            if ssc is not None:
                mqttStream = MQTTUtils.createStream(ssc, brokerUrl, topic,"guest","guest")
                records = mqttStream.map(lambda line:line)
                records.pprint()
                ssc.start()
                ssc.awaitTermination()
                ssc.stop()

 

注意:以下都是采坑点

此处pyspark版本为2.4.6,按理说是没有mqtt模块的,没有MQTTUtils这个工具类,所以需要手工导入两个包

1:到maven仓库下载这两个包放到anaconda的安装目录下D:\setup\Anaconda\Lib\site-packages\pyspark\jars(这是我的anaconda安装pyspark目录)

2:在mqtt的包里面有一个工具类

把这个代码拷出来放到项目里,然后就可以使用其中的mqttutils

3:还有就是rabbitmq的默认端口是5672为啥上面的brokerurl是

brokerUrl = "tcp://localhost:1883"

是因为这个实时数据监听走的是mqtt协议所以要以tcp一些,因为安装在本地所以是localhost。至于为什么是1883,看下面介绍

RabbitMQ启用MQTT功能

RabbitMQ启用MQTT功能,需要先安装然RabbitMQ然后再启用MQTT插件。
  • 首先我们需要安装并启动RabbitMQ
  • 接下来就是启用RabbitMQ的MQTT插件了,默认是不启用的,使用如下命令开启即可;
rabbitmq-plugins enable rabbitmq_mqtt
  • 开启成功后,查看管理控制台,我们可以发现MQTT服务运行在1883端口上了。

 

4:exchange只能发送到amq.topic不然监听不到,生产者代码如下

import pika
import random

# 新建连接,rabbitmq安装在本地则hostname为'localhost'
hostname = 'localhost'
parameters = pika.ConnectionParameters(hostname)
connection = pika.BlockingConnection(parameters)

# 创建通道
channel = connection.channel()
#exchange只能发送到amq.topic不然监听不到
channel.exchange_declare(exchange='amq.topic', exchange_type='topic', durable=True)
# 声明一个队列,生产者和消费者都要声明一个相同的队列,用来防止万一某一方挂了,另一方能正常运行
channel.queue_declare(queue='11')

number = random.randint(1, 1000)
body = '66'
# 交换机; 队列名,写明将消息发往哪个队列; 消息内容
# routing_key在使用匿名交换机的时候才需要指定,表示发送到哪个队列
channel.basic_publish(exchange='amq.topic', routing_key="11",body=body)
print(" [x] Sent %s" % body)
connection.close()

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在RabbitMQ接收数据,首先需要创建一个消费者。可以使用以下方法创建消费者: //新建一个事件驱动的消费者 var consumer = new EventingBasicConsumer(channel); //消费者收到消息后的事件处理 consumer.Received = (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); }; //通知RabbitMQ服务器,我要接收指定队列的消息 channel.BasicConsume(queue: "q.log.info", noAck: true, consumer: consumer); 这个方法创建了一个事件驱动的消费者,当消费者收到消息后,会执行相应的事件处理。在这个例子中,事件处理会将收到的消息进行打印输出。同时,通过调用channel.BasicConsume方法,并指定要接收消息的队列,来告诉RabbitMQ服务器,我要接收指定队列的消息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [RabbitMQ 简单的消息发送与接收](https://blog.csdn.net/dietisi8980/article/details/101856657)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [python操作rabbitmq 实践笔记](https://blog.csdn.net/weixin_34195142/article/details/92870270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值