在scala spark中,可以创建一个命名的累加器,该累加器将显示在Web ui中,
val accum = sc.accumulator(0, "My Accumulator")
但是pyspark sc.accumulator()
方法没有名称参数。是否可以在pyspark中创建一个命名的累加器,该累加器将显示在Web ui中?
答案 0 :(得分:0)
在pyspark中无法创建命名的累加器。这个问题已经提出。您可以跟踪该线程https://issues.apache.org/jira/browse/SPARK-2868。
答案 1 :(得分:0)
如果您足够绝望,并且需要查看工作人员的进度,则可以使用广播变量,只要在python中尚无命名累加器即可。
我只建议将此解决方案用于测试。
假设您需要估算一个简单的记录计数器,您要做的就是从每个工作人员中输出一些信息:
const tooltip = select(svgRef.current)
.append("div")
.style("position", "absolute")
.style("visibility", "visible")
.style("background-color", "black")
.style("border", "solid")
.style("border-width", "1px")
.style("border-radius", "5px")
.style("padding", "10px")
.html("<p>I'm a tooltip written in HTML</p>");
svg
.select(".barreact")
.on("mouseover", function () {
return tooltip.style("visibility", "visible");
})
.on("mousemove", function () {
return tooltip
.style("top", event.pageY + "px")
.style("left", event.pageX + "px");
})
.on("mouseout", function () {
return tooltip.style("visibility", "hidden");
});
您可以通过查看已输出到屏幕或文件的行数或使用API来检查作业运行时的进度。
此解决方案有缺点:
我还尝试将# Get a spark context sc and read your data into and rdd (or DataFrame)
rows = sc.textFile("/path/to/data/sample_data.txt")
# broadcast an object defined like below
processor = spark.sparkContext.broadcast(Processor())
# Apply this lambda to your rdd
mapped = rows.map(lambda x: processor.value.process(x))
# Other transformations you need to do
sc.stop()
class Processor:
def process(self, content):
# either print some output to the screen
print(content)
# or write to a file
# notice that you can't keep an open file as a class field
# because broadcast variables need to be serializable
with open('results.txt', 'a') as f:
f.write(content + "\n")
# or call an API to store and count the requests
requests.get('https://some.external.api/' + content)
return self.other_processing(content)
设置到Processor对象中,每次调用process()方法时,我将计数器加1,然后打印出来。这一点也不影响性能,但是您很难弄清屏幕上显示的内容,因为您可能会在所有CPU内核以及群集中运行它。