我正在尝试使用Spark Python API编写一个spark流式应用程序。
应用程序应从本地目录中读取文本文件并将其发送到Kafka集群。
当将python脚本提交给spark引擎时,根本没有任何内容发送给kafka。
我尝试打印事件而不是发送给Kafka,发现没有任何内容可读。
这是脚本的代码。
#!/usr/lib/python
# -*- coding: utf-8 -*-
from pyspark import SparkContext, SparkConf
from pyspark.streaming import StreamingContext
from kafka import KafkaProducer
import sys
import time
reload(sys)
sys.setdefaultencoding('utf8')
producer = KafkaProducer(bootstrap_servers="kafka-b01.css.org:9092,kafka-b02.css.org:9092,kafka-b03.css.org:9092,kafka-b04.css.org:9092,kafka-b05.css.org:9092")
def send_to_kafka(rdd):
tweets = rdd.collect()
print ("--------------------------")
print (tweets)
print "--------------------------"
#for tweet in tweets:
# producer.send('test_historical_job', value=bytes(tweet))
if __name__ == "__main__":
conf = SparkConf().setAppName("TestSparkFromPython")
sc = SparkContext(conf=conf)
ssc = StreamingContext(sc, 1)
tweetsDstream = ssc.textFileStream("/tmp/historical/")
tweetsDstream.foreachRDD(lambda rdd: send_to_kafka(rdd))
ssc.start()
ssc.awaitTermination()
我正在使用此命令提交脚本
./spark-submit --master spark://spark-master:7077 /apps/historical_streamer.py
print语句的输出是一个空列表。
--------------------------
[]
--------------------------
修改
基于this question我将数据目录的路径从"/tmp/historical/"
更改为"file:///tmp/historical/"
。
我首先尝试运行该作业,然后将文件移动到该目录,但不幸的是它也无效。
答案 0 :(得分:1)
基于文件流的来源,例如fileStream
或textFileStream
,希望数据文件为:
通过原子移动或将它们重命名为数据目录在dataDirectory中创建。
如果给定窗口中没有新文件,则没有任何价格,因此每个现有文件(在这里似乎就是这种情况)不会在输出上显示不会被读取。
答案 1 :(得分:0)
你的职能:
def send_to_kafka(rdd):
tweets = rdd.collect()
print ("--------------------------")
print (tweets)
print "--------------------------"
#for tweet in tweets:
# producer.send('test_historical_job', value=bytes(tweet))
将收集所有rdd,但它不会打印rdd的内容。为此,您应该使用例程:
tweets.foreach(println)
对于RDD中的每个元素,它将作为输出提供元素。正如Spark Documentation
中所解释的那样希望这会有所帮助