无法在Spark中看到来自Kafka Stream的消息

时间:2017-09-30 11:29:47

标签: apache-spark pyspark apache-kafka spark-streaming twitter-streaming-api

我刚开始使用Kafka Stream库测试SparkPyspark

我一直在Jupyter Notebook上运行整个设置。 我正在尝试从Twitter Streaming获取数据。

Twitter流媒体代码:

import json
import tweepy
from uuid import uuid4
import time
from kafka import KafkaConsumer
from kafka import KafkaProducer

auth = tweepy.OAuthHandler("key", "key")
auth.set_access_token("token", "token")
api = tweepy.API(auth, wait_on_rate_limit=True, retry_count=3, retry_delay=5,
                 retry_errors=set([401, 404, 500, 503]))
class CustomStreamListener(tweepy.StreamListener):
    def __init__(self, api):
        self.api = api
        super(tweepy.StreamListener, self).__init__()

    def on_data(self, tweet):
        print tweet
        # Kafka Producer to send data to twitter topic
        producer.send('twitter', json.dumps(tweet))

    def on_error(self, status_code):
        print status_code
        return True # Don't kill the stream

    def on_timeout(self):
        print 'on_timeout'
        return True # Don't kill the stream
producer = KafkaProducer(bootstrap_servers='localhost:9092')
sapi = tweepy.streaming.Stream(auth, CustomStreamListener(api))
sapi.filter(track=["#party"])

Spark Streaming Code

from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils

sc = SparkContext(appName="PythonSparkStreamingKafka_RM_01").getOrCreate()
sc.setLogLevel("WARN")

streaming_context = StreamingContext(sc, 10)
kafkaStream = KafkaUtils.createStream(streaming_context, 'localhost:2181', 'spark-streaming', {'twitter': 1})  
parsed = kafkaStream.map(lambda v: v)
parsed.count().map(lambda x:'Tweets in this batch: %s' % x).pprint()

streaming_context.start()
streaming_context.awaitTermination()

打印输出:

时间:2017-09-30 11:21:00

时间:2017-09-30 11:21:10

时间:2017-09-30 11:21:20

我做错了什么特别的部分?

2 个答案:

答案 0 :(得分:2)

你也可以使用像Kafdrop这样的GUI工具。它在调试kafka消息时非常方便。您不仅可以查看消息队列,还可以查看其偏移量的分区等。

它是一个很好的工具,您应该能够轻松部署它。

这是链接:https://github.com/HomeAdvisor/Kafdrop

答案 1 :(得分:1)

您可以使用以下两个步骤调试应用程序。

1)使用像KafkaWordCount这样的样本消费者来测试数据是否进入(Kafka主题是否有消息)

Kafka附带一个命令行客户端,它将从文件或标准输入中获取输入,并将其作为消息发送到Kafka群集。默认情况下,每一行都将作为单独的消息发送。

运行生产者,然后在控制台中键入一些消息以发送到服务器。

Page2Controller

示例:

     kafka-console-producer.sh \
    --broker-list <brokeer list> \
    --topic <topic name> \
    --property parse.key=true \
    --property key.separator=, \
    --new-producer  

如果您看到打印消息,那么您在kafka中有消息,如果不是,那么您的制作人无法正常工作

2)开启记录

   > bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test