收集Spark作业运行统计信息并保存到数据库的最佳方法是什么

时间:2018-04-26 19:45:26

标签: apache-spark apache-spark-sql

My Spark程序有几个表连接(使用SPARKSQL),我想收集处理每个连接所需的时间并保存到统计表中。目的是在一段时间内连续运行它并在非常精细的级别上收集性能。

例如

val DF1 = spark.sql("从A,B&#34选择x,y;)

Val DF2 = spark.sql("从TABLE1,TABLE2&#34中选择k,v;)

最后我加入DF1和DF2,然后启动类似saveAsTable的操作。

我要找的是找出

1.计算DF1

需要多少时间

2.计算DF2和

的时间有多少

3.将这些最终联接持续到Hive / HDFS有多​​少时间

并将所有这些信息放到RUN-STATISTICS表/文件中。

任何帮助都表示赞赏,并提前致谢

1 个答案:

答案 0 :(得分:0)

Spark使用Lazy Evaluation,允许引擎在非常精细的级别上优化RDD转换。

执行时

$vmName = $env:ComputerName
$IP =  [System.Net.Dns]::GetHostAddresses($vmName).IPAddressToString
Get-SmbSession | Where-Object {$_.ClientComputerName -eq $IP} | Close-SmbSession -Force
除了将变换添加到有向无环图之外,没有任何反应。

只有在执行Action(例如DF1.count)时,才会强制驱动程序执行物理执行计划。这被推迟到RDD转换的尽可能远的地方。

因此要求

是不正确的
  

1.计算DF1

需要多少时间      

2.计算DF2和

的时间有多少

至少基于您提供的代码示例。你的代码没有"计算" val DF1。我们可能不知道只有DF1处理了多长时间,除非你以某种方式欺骗编译器分别处理每个数据帧。

构建问题的更好方法可能是"我的工作分为多少阶段(任务),以及完成这些阶段(任务)需要多长时间?#/ p >

通过查看日志文件/网页GUI时间轴(根据您的设置有不同的风格)可以轻松解决这个问题。

  

3.将这些最终联接持续到Hive / HDFS有多​​少时间

公平的问题。看看Ganglia

  

群集范围的监控工具(如Ganglia)可以提供对整体群集利用率和资源瓶颈的深入了解。例如,Ganglia仪表板可以快速显示特定工作负载是磁盘绑定,网络绑定还是CPU绑定。

我喜欢用另一个技巧来定义每个转换序列,这些转换必须以单独函数内的动作结束,然后在"计时器函数内的输入RDD上调用该函数。块。

例如,我的"计时器"被定义为

val DF1= spark.sql("select x,y from A,B ")

可以用作

def time[R](block: => R): R = {
  val t0 = System.nanoTime()
  val result = block  
  val t1 = System.nanoTime()
  println("Elapsed time: " + (t1 - t0)/1e9 + "s")
  result
}

但是,不要仅仅为了将DAG分解为更多阶段/广泛的依赖关系而调用不必要的操作。这可能会导致混乱或减慢执行速度。

资源:

https://spark.apache.org/docs/latest/monitoring.html

http://ganglia.sourceforge.net/

https://www.youtube.com/watch?v=49Hr5xZyTEA