Apache spark 如何检索从Spark UI写入的输出大小和记录等指标?

Apache spark 如何检索从Spark UI写入的输出大小和记录等指标?,apache-spark,apache-spark-sql,spark-dataframe,spark-cassandra-connector,codahale-metrics,Apache Spark,Apache Spark Sql,Spark Dataframe,Spark Cassandra Connector,Codahale Metrics,如何在任务或作业完成后立即在控制台(Spark Shell或Spark submit作业)上收集这些指标 我们使用Spark将数据从Mysql加载到Cassandra,数据量相当大(例如:约200 GB和600万行)。当任务完成时,我们想验证spark到底处理了多少行?我们可以从Spark UI中获取数字,但如何从Spark shell或Spark submit作业中检索该数字(“输出记录写入”) 从Mysql加载到Cassandra的示例命令 val pt = sqlcontext.read.

如何在任务或作业完成后立即在控制台(Spark Shell或Spark submit作业)上收集这些指标

我们使用Spark将数据从Mysql加载到Cassandra,数据量相当大(例如:约200 GB和600万行)。当任务完成时,我们想验证spark到底处理了多少行?我们可以从Spark UI中获取数字,但如何从Spark shell或Spark submit作业中检索该数字(“输出记录写入”)

从Mysql加载到Cassandra的示例命令

val pt = sqlcontext.read.format("jdbc").option("url", "jdbc:mysql://...:3306/...").option("driver", "com.mysql.jdbc.Driver").option("dbtable", "payment_types").option("user", "hadoop").option("password", "...").load()

pt.save("org.apache.spark.sql.cassandra",SaveMode.Overwrite,options = Map( "table" -> "payment_types", "keyspace" -> "test"))
我想检索上面任务的所有Spark UI指标,主要是输出大小和写入的记录

请帮忙


谢谢你的时间

找到了答案。您可以使用SparkListener获取统计信息

如果您的作业没有输入或输出指标,则可能得不到。通过提供If stmt,可以安全地忽略异常

sc.addSparkListener(new SparkListener() {
  override def onTaskEnd(taskEnd: SparkListenerTaskEnd) {
    val metrics = taskEnd.taskMetrics
    if(metrics.inputMetrics != None){
      inputRecords += metrics.inputMetrics.get.recordsRead}
    if(metrics.outputMetrics != None){
      outputWritten += metrics.outputMetrics.get.recordsWritten }
  }
})
请找到下面的例子

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import com.datastax.spark.connector._
import org.apache.spark.sql._
import org.apache.spark.storage.StorageLevel
import org.apache.spark.scheduler.{SparkListener, SparkListenerTaskEnd}

val conf = new SparkConf()
.set("spark.cassandra.connection.host", "...")
.set("spark.driver.allowMultipleContexts","true")
.set("spark.master","spark://....:7077")
.set("spark.driver.memory","1g")
.set("spark.executor.memory","10g")
.set("spark.shuffle.spill","true")
.set("spark.shuffle.memoryFraction","0.2")
.setAppName("CassandraTest")
sc.stop
val sc = new SparkContext(conf)
val sqlcontext = new org.apache.spark.sql.SQLContext(sc)

var outputWritten = 0L

sc.addSparkListener(new SparkListener() {
  override def onTaskEnd(taskEnd: SparkListenerTaskEnd) {
    val metrics = taskEnd.taskMetrics
    if(metrics.inputMetrics != None){
      inputRecords += metrics.inputMetrics.get.recordsRead}
    if(metrics.outputMetrics != None){
      outputWritten += metrics.outputMetrics.get.recordsWritten }
  }
})

val bp = sqlcontext.read.format("jdbc").option("url", "jdbc:mysql://...:3306/...").option("driver", "com.mysql.jdbc.Driver").option("dbtable", "bucks_payments").option("partitionColumn","id").option("lowerBound","1").option("upperBound","14596").option("numPartitions","10").option("fetchSize","100000").option("user", "hadoop").option("password", "...").load()
bp.save("org.apache.spark.sql.cassandra",SaveMode.Overwrite,options = Map( "table" -> "bucks_payments", "keyspace" -> "test"))

println("outputWritten",outputWritten)
结果:

scala> println("outputWritten",outputWritten)
(outputWritten,16383)

你的意思是你可以在spark UI上找到度量,但我没有在类似的代码(阅读jdbc源代码)中找到它,度量显示在UI上?它显示在spark的应用程序UI上,通常在作业和阶段下。您可以查看统计信息、执行者信息和单个任务信息,如每个任务读取的数据量和每个任务写入的随机写入量等。谢谢@ajay guyyala。我没有运气在UI上看到。我将调查发生了什么。这里是我发现的一些示例图像。它可能不会显示所有作业/阶段的指标。还取决于我们使用的spark版本。当我发布这篇文章时,我们使用的是Spark 1.5.x或1.6.x@AjayGuyyala您能否从spark UI获取此数据。我也有同样的需求,我必须从spark UI获取一些有用的数据到我的JavaCOD。