Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何使用pyspark将spark转换的数据写回kafka代理?_Python 2.7_Pyspark_Spark Streaming_Kafka Producer Api_Kafka Python - Fatal编程技术网

Python 2.7 如何使用pyspark将spark转换的数据写回kafka代理?

Python 2.7 如何使用pyspark将spark转换的数据写回kafka代理?,python-2.7,pyspark,spark-streaming,kafka-producer-api,kafka-python,Python 2.7,Pyspark,Spark Streaming,Kafka Producer Api,Kafka Python,在我的pyspark应用程序中,我打算使用Spark流作为“飞行中”转换卡夫卡消息的方法。每个这样的消息最初都是从特定的卡夫卡主题接收的。这样的消息需要进行一些转换(比如说,用一个字符串替换另一个字符串),转换后的版本需要发布在不同的卡夫卡主题上。 第一部分(接收卡夫卡信息)似乎工作正常: from pyspark import SparkConf, SparkContext from operator import add import sys from pyspark.streaming

在我的pyspark应用程序中,我打算使用Spark流作为“飞行中”转换卡夫卡消息的方法。每个这样的消息最初都是从特定的卡夫卡主题接收的。这样的消息需要进行一些转换(比如说,用一个字符串替换另一个字符串),转换后的版本需要发布在不同的卡夫卡主题上。 第一部分(接收卡夫卡信息)似乎工作正常:

from pyspark import SparkConf, SparkContext

from operator import add
import sys
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
## Constants
APP_NAME = "PythonStreamingDirectKafkaWordCount"
##OTHER FUNCTIONS/CLASSES

def main():
    sc = SparkContext(appName="PythonStreamingDirectKafkaWordCount")
    ssc = StreamingContext(sc, 2)

    brokers, topic = sys.argv[1:]
    kvs = KafkaUtils.createDirectStream(ssc, [topic], {"metadata.broker.list": brokers})
    ...

    ssc.start()
    ssc.awaitTermination()
if __name__ == "__main__":

   main()
将某个东西(比如一个字符串)放到另一个卡夫卡主题上的正确语法是什么?
这种方法应该由KafkaUtils提供,还是以其他方式提供?

在handler函数中,我们可以对每条记录执行任何操作,然后将该记录发送到不同的kafka主题:

from pyspark import SparkConf, SparkContext
from operator import add
import sys
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
import json
from kafka import SimpleProducer, KafkaClient
from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers='localhost:9092')

def handler(message):
    records = message.collect()
    for record in records:
        producer.send('spark.out', str(record))
        producer.flush()

def main():
    sc = SparkContext(appName="PythonStreamingDirectKafkaWordCount")
    ssc = StreamingContext(sc, 10)

    brokers, topic = sys.argv[1:]
    kvs = KafkaUtils.createDirectStream(ssc, [topic], {"metadata.broker.list": brokers})
    kvs.foreachRDD(handler)

    ssc.start()
    ssc.awaitTermination()
if __name__ == "__main__":

   main()
要运行此操作,请执行以下操作:

spark-submit --jars spark-streaming-kafka-assembly_2.10-1.6.1.jar s.py localhost:9092 test

按照SPARK文档执行操作的正确方法


请注意,不应该在驱动程序上建立连接,然后在执行者之间共享(这是一个糟糕的想法,因为a)它可能不工作,b)如果这样做,将增加严重的开销),而是在每个分区上创建连接。Spark Streaming guide上的“使用foreachRDD的设计模式”一节中有几个相关链接
def kafka_sender(messages):
    producer = KafkaProducer(bootstrap_servers='localhost:9092')

    for message in messages:
        producer.send('alerts', bytes(message[0].encode('utf-8')))
        # For faster push
        # producer.flush()  

    producer.flush()



# On your Dstream
sentiment_data.foreachRDD(lambda rdd: rdd.foreachPartition(kafka_sender))