Pyspark - 从Spark Session(sc)转出控制权

时间:2017-02-13 09:26:00

标签: pyspark spark-streaming dstream

这是关于

的后续问题

docs

要计算每天,每小时发出的错误消息/警告消息的数量 - 如何设计作业。

我尝试过:

from __future__ import print_function

import sys

from pyspark import SparkContext
from pyspark.streaming import StreamingContext


    def counts():
            counter += 1
            print(counter.value)

    if __name__ == "__main__":

            if len(sys.argv) != 3:
                    print("Usage: network_wordcount.py <hostname> <port>", file=sys.stderr)
            exit(-1)


            sc = SparkContext(appName="PythonStreamingNetworkWordCount")
            ssc = StreamingContext(sc, 5)
            counter = sc.accumulator(0)

            lines = ssc.socketTextStream(sys.argv[1], int(sys.argv[2]))
            errors = lines.filter(lambda l: "error" in l.lower())
            errors.foreachRDD(lambda e : e.foreach(counts))
            errors.pprint()

            ssc.start()
            ssc.awaitTermination()
然而,这有多个问题,从打印开始不起作用(不输出到stdout,我已经读过它,我可以使用的最好的是日志记录)。我可以将该函数的输出保存到文本文件中并替换该文件吗?

我不确定为什么程序刚出来,没有任何错误/转储可以进一步查看(spark 1.6.2)

如何保持国家?我正在尝试的是按服务器和严重性聚合日志,另一个用例是通过查找某些关键字来计算处理的事务数量

我想尝试的伪代码:

foreachRDD(Dstream):
     if RDD.contains("keyword1 | keyword2 | keyword3"):
     dictionary[keyword] = dictionary.get(keyword,0) + 1 //add the keyword if not present and increase the counter
     print dictionary //or send this dictionary to else where

发送或打印字典的最后一部分需要切换出火花流式上下文 - 有人可以解释这个概念吗?

1 个答案:

答案 0 :(得分:0)

  

打印不起作用

我建议阅读Spark文档的design patterns section。我认为你想要的大致是这样的:

def _process(iter):
    for item in iter:
        print item

lines = ssc.socketTextStream(sys.argv[1], int(sys.argv[2]))
errors = lines.filter(lambda l: "error" in l.lower())
errors.foreachRDD(lambda e : e.foreachPartition(_process))

这将使您的呼叫print正常工作(但值得注意的是,print语句将在工作人员而不是驱动程序上执行,因此如果您在群集上运行此代码,您将只在工作日志上看到它。)

然而,它不会解决你的第二个问题:

  

如何保持状态?

为此,请查看updateStateByKeyrelated example