博客前言
- 为什么我们要写日志
- 基本上每个程序都要有日志记录的功能,日志的记录最重要的用处就是监控程序的运行状态和错误查找。如果程序没有写日志,那程序就像瞎子一样,瞎跑,你都不知道为什么数据不对,为什么程序报错,程序运行成功还是失败。在流式计算Sparkstreaming中,日志的记录是非常重要的;因为流式计算是需要7*24小时一直运行的,你不记日志你根本不知道程序运行成功还是错误(当然你可以通过spark的history来查看),但是sparkstreaming的日志它只记录程序的内部错误,并不会记录你程序的计算逻辑错误(所以会导致你整个程序计算结果都不对了都不知道)。
- Sparkstreming日志的特别
- SparkStreming的日志是比较特别的,特别之处在于,它的日志只有在运行完成之后才能被load到本地查看的,不然它的日志是一直在hdfs上的。
- 那么,如果我们需要一个这样的功能:需要一个监控程序来监控SparkStreaming的运行情况,并且一旦程序出问题要马上发邮件到自己的邮箱然后自己重启程序。
-
解决的思路
- 简单的思路:把SparkStreaming的运行模式选为yarn-client模式,那么程序的driver就会是在固定的机子上,你可以选择把日志都写在这台机子上,然后在这台机子上写一个脚本来监控这个日志文件(tail -f 文件路径);你可以一直看到你日志的写出情况。当遇到一个error日志的时候你就可以选择处理方法。这个方法的缺点是:如果你不希望程序以yarn-client模式运行的话,而且也不想写脚本的话。
- 复杂一点的思路:那你可以需要借助消息队列Kafka了。你可以选择把日志写入Kafka里面,供下层消费,这个方法的好处就是,程序和日志解耦。程序只管写他的日志,也不管写什么机子,只要给他一个brokerlist。日志也都记录在kafka,你可以写一个简单的java程序来监控它。spark照样可以使用yarn-cluster模式。
-
使用自定义的log4j配置
- 通常一个集群会有很多个的spark任务,每个任务都会记日志,如果都使用spark默认的日志配置文件,那将会很难控制和维护。所以需要使用自定义的log4j配置。每个程序都自带一个配置。
- 你自己写一个log4j.properties然后在运行程序的时候指定用这个配置文件就好了,那么问题来了。yarn的运行有两种模式,两种的指定方式不一样
- yarn-client:这个简单,–conf “spark.driver.extraJavaOptions=-Dlog4j.configuration=file:///data/test/log4j-spark.properties”。这个路径是你本地路径
- yarn-cluster:–files /data/lmq/test/log4j-spark.properties –conf “spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j-spark.properties” –conf “spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-spark.properties”
- 实现设计
-
-
你好,我想在各个算子计算过程中记录日志,用logger.info("User Define:————>"+ JSONObject.toJSONString(DStream));这种不行,那我怎么记录各个算子转换的日志呢?
-
Re:
LonelysWorld2017-08-29 16:08发表
-
-
回复Joy_s:其实在算子里面直接println就可以在ui界面的stdout里面就可以看到了,不需要特意用log去记录。
如果你要记录的话,你需要启动的时候加日志的配置文件进去。spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.properties-
Re:
Joy_s2017-09-07 17:23发表
-
- 回复LonelysWorld:大哥,spark streaming的checkpoint目录必须设置成具有容错性的文件系统目录,比如HDFS这种,那么普通Linux下的目录是不行吧
-
-
-
2楼
lijiancong2017-08-09 10:51发表
-
-
使用自定义的log4j配置-->yarn集群模式提交,怎么实现生成log4j自定义日志?类似java工程里的效果?谢谢
-
Re:
LonelysWorld2017-08-09 22:01发表
-
-
回复lijiancong:--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j-driver.properties"
-
Re:
lijiancong2017-09-08 10:27发表
-
- 回复LonelysWorld:TKS
-
-
Re:
LonelysWorld2017-08-09 22:00发表
-
- 回复lijiancong:--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.properties"
-
Re:
LonelysWorld2017-08-09 22:00发表
-
-
回复lijiancong:然后再添加
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j-driver.properties"
-
Re:
LonelysWorld2017-08-09 21:59发表
-
- 回复lijiancong:在spark-submit中添加参数:--files /path/log4j-executor.properties,/path/log4j-driver.properties
-
Re:
LonelysWorld2017-08-09 21:56发表
-
- 回复lijiancong:spark里共有两种日志,分别是driver和excutor。都可以自定义来实现。log4j的配置这个不累赘。http://blog.youkuaiyun.com/azheng270/article/details/2173430/
-
-
1楼
西红小柿2017-07-20 15:19发表
-
-
你好,该功能是怎么实现的呢?
-
Re:
LonelysWorld2017-07-20 21:27发表
-
- 回复西红小柿:你说的是哪种呢,简单的还是复杂的
-