Spark流不能从本地目录

时间:2016-04-17 14:25:11

标签: python apache-spark pyspark spark-streaming

我正在尝试使用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/"

我首先尝试运行该作业,然后将文件移动到该目录,但不幸的是它也无效。

2 个答案:

答案 0 :(得分:1)

基于文件流的来源,例如fileStreamtextFileStream,希望数据文件为:

  

通过原子移动或将它们重命名为数据目录在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

中所解释的那样

希望这会有所帮助