这是关于
的后续问题要计算每天,每小时发出的错误消息/警告消息的数量 - 如何设计作业。
我尝试过:
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
发送或打印字典的最后一部分需要切换出火花流式上下文 - 有人可以解释这个概念吗?
答案 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语句将在工作人员而不是驱动程序上执行,因此如果您在群集上运行此代码,您将只在工作日志上看到它。)
然而,它不会解决你的第二个问题:
如何保持状态?
为此,请查看updateStateByKey和related example。