分享

spark streaming application日志问题

冰诺莫语 发表于 2016-8-17 09:47:42 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 18987
本帖最后由 冰诺莫语 于 2016-8-17 10:41 编辑

Spark新手,工作中用到spark streaming,使用流计算对kafka中topic数据进行获取并治理,过程中遇到一些小问题,希望大侠帮忙解答,多谢各位!

环境:
Spark 1.5.1
Centos6.5
Hadoop 2.6.4

问题:
1spark streaming 应用程序中,如何进行日志输出?会输出到哪里?
现在我是这样尝试的,使用log4j来进行日志输出,自己新建了一个log4j.properties,将spark中的log4j配置也复制过来,然后添加自己的日志记录器,并将log4j.properties放在linux文件系统上,log4j.properties配置如下:[mw_shl_code=text,true]#############################################################################
#stan log output
spark.stan.log.dir=/home/data/logs/stan.log
log4j.logger.stan=INFO,file,console

log4j.appender.console=org.apache.log4j.ConsoleAppender  
log4j.appender.console.target=System.err  
log4j.appender.console.layout=org.apache.log4j.PatternLayout  
log4j.appender.console.layout.ConversionPattern=%p %d{yy/MM/dd HH:mm:ss} %c{1}: %m%n

# info log file
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.Encoding=UTF8
log4j.appender.file.File=${spark.stan.log.dir}
log4j.appender.file.DatePattern='_'yyyyMMdd'.log'
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p] [%d{yy/MM/dd HH:mm:ss}] [%c{1}]: %m%n
########################################################################################[/mw_shl_code]然后在程序中通过:[mw_shl_code=scala,true]PropertyConfigurator.configure("log4j.properties")[/mw_shl_code]在代码中设置使用此配置文件,然后通过如下代码获取Logger对象[mw_shl_code=scala,true]logger: Logger = LogManager.getLogger("stan")[/mw_shl_code],然后打包运行。

程序运行没有问题,在console和log文件中可以看到spark main方法开始的log输出,但是后续spark mapPartitions中的日志输出打印不出来,日志输出都是使用INFO级别。这是为什么?

2.在1的基础上有了几个疑问,
①spark task是分布式运行在集群的各个机器上,那么对log4j的配置是否不能在其余机器生效?
②使用mapPartitions进行操作,这个mapPartitions多久返回一次?是StreamingContext的batchDuration参数设置的时间数据执行后返回吗?
③日志输出,是会输出到集群中运行task的节点上对应目录吗?


请大家帮忙解答,谢谢!

已有(5)人评论

跳转到指定楼层
arsenduan 发表于 2016-8-17 13:20:25
程序运行没有问题,在console和log文件中可以看到spark main方法开始的log输出,但是后续spark mapPartitions中的日志输出打印不出来,日志输出都是使用INFO级别。这是为什么?
这跟配置有关系,前面的应该是系统日志输出,也就是框架输出。
对于楼主的程序mapPartitions,如果使用了日志类输出了信息,则会输出。
在log4j文件中,配置应该是INFO



2.在1的基础上有了几个疑问,
①spark task是分布式运行在集群的各个机器上,那么对log4j的配置是否不能在其余机器生效?
如果每台机器都配置了,就会生效的
②使用mapPartitions进行操作,这个mapPartitions多久返回一次?是StreamingContext的batchDuration参数设置的时间数据执行后返回吗?
这个不清楚了,应该跟集群的配置有关系
③日志输出,是会输出到集群中运行task的节点上对应目录吗?
对的,日志输出都会输出到对应节点上

回复

使用道具 举报

冰诺莫语 发表于 2016-8-17 13:33:50
本帖最后由 冰诺莫语 于 2016-8-17 14:10 编辑
arsenduan 发表于 2016-8-17 13:20
程序运行没有问题,在console和log文件中可以看到spark main方法开始的log输出,但是后续spark mapPartitio ...

程序运行没有问题,在console和log文件中可以看到spark main方法开始的log输出,但是后续spark mapPartitions中的日志输出打印不出来,日志输出都是使用INFO级别。这是为什么?
这跟配置有关系,前面的应该是系统日志输出,也就是框架输出。
对于楼主的程序mapPartitions,如果使用了日志类输出了信息,则会输出。
在log4j文件中,配置应该是INFO
***********************************************************
不好意思,可能是我没有描述清楚,
log4j文件中配置的日志输出是INFO级别,在集群的每个机器上的相同位置都放置 了一份log4j.properties文件,
在运行main方法的节点上的可以在console和stan.log文件中可以看到在main方法中打印的INFO级别的日志信息,
但是我在mapPartitions中输出的INFO级别的日志信息则无法看到,例如:
main{
    logger.info("info")
    line.mapPartitions(paritition=>{
        logger.info("partitions info")
    })
}
这样输出的话,我可以在stan.log中看到info,但是无法看到partitions info。
并且在其余节点上对应的目录下不创建stan.log,假如预先创建好,赋予足够访问权限,依旧没有日志信息。

请帮忙解答一下,谢谢!
***********************************************************

回复

使用道具 举报

einhep 发表于 2016-8-17 14:15:46

程序执行有问题了,可能没有执行到或则当前机器没有执行。
楼主可以调试下

回复

使用道具 举报

冰诺莫语 发表于 2016-8-17 14:22:31
einhep 发表于 2016-8-17 14:15
程序执行有问题了,可能没有执行到或则当前机器没有执行。
楼主可以调试下

应该不是这个问题,因为1.在mapPartitions中有写入HDFS的操作,在打印log之后,HDFS文件已经成功写入。2.在各个节点上,如果不配置操作hdfs配置文件,会报异常,也就是在各个节点上已经执行。




回复

使用道具 举报

sbrui 发表于 2017-8-2 09:38:03
是不是 log4 的文件路径 问题,写一个相对路径
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条