我需要定时一些事情,例如火花读取我的文件需要多长时间,所以我喜欢使用sc.setLogLevel("INFO")
来启用将更多信息打印到屏幕上,而我发现真正有用的一件事是当打印这样的消息时
2018-12-18 02:05:38 INFO DAGScheduler:54 - Job 2 finished: count at <console>:26, took 9.555080 s
,因为这告诉了我花了多长时间。
是否总有办法以编程方式获取此信息(最好在Scala中)?现在,我只是复制此结果并将其保存在文本文件中。
答案 0 :(得分:0)
您可以创建类似的内容:
import scala.concurrent.duration._
case class TimedResult[R](result: R, durationInNanoSeconds: FiniteDuration)
def time[R](block: => R): TimedResult[R] = {
val t0 = System.nanoTime()
val result = block
val t1 = System.nanoTime()
val duration = t1 - t0
TimedResult(result, duration nanoseconds)
}
然后使用它调用您的代码块:
val timedResult = time{
someDataframe.count()
}
println("Count of records ${timedResult.result}")
println("Time taken : ${timedResult.durationInNanoSeconds.toSeconds}")
答案 1 :(得分:0)
有两种解决方案可为您的spark程序记录日志。
a)您可以在使用spark-submit命令的同时将控制台输出重定向到所需的文件。
spark-submit your_code_file > logfile.txt 2>&1
b)可以为驱动程序和执行程序创建2个日志文件(log4j.properties),并且在发出spark-submit命令时,通过在驱动程序和执行程序的java选项中提供它们的路径来包括它们。
spark-submit --class MAIN_CLASS --driver-java-options "-Dlog4j.configuration=file:LOG4J_PATH" --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:LOG4J_PATH" --master MASTER_IP:PORT JAR_PATH