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表/文件中。
任何帮助都表示赞赏,并提前致谢
答案 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