在pyspark中命名为累加器

时间:2018-08-01 18:13:34

标签: python apache-spark pyspark

在scala spark中,可以创建一个命名的累加器,该累加器将显示在Web ui中,

val accum = sc.accumulator(0, "My Accumulator")

但是pyspark sc.accumulator()方法没有名称参数。是否可以在pyspark中创建一个命名的累加器,该累加器将显示在Web ui中?

2 个答案:

答案 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​​来检查作业运行时的进度。

此解决方案有缺点:

  • 为每个项目打开并写入文件将大大增加执行时间
  • 调用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内核以及群集中运行它。