spark日志收集

spark日志收集,第1张

在很多情况下,我们需要查看driver和executors在运行 Spark 应用程序时候产生的日志,这些日志对于我们调试和查找问题是很重要的。

Spark 日志确切的存放路径和部署模式相关:

(1)、 如果是Spark Standalone模式 ,我们可以直接在Master UI界面查看应用程序的日志,在默认情况下这些日志是存储在worker节点的work目录下,这个目录可以通过 SPARK_WORKER_DIR 参数进行配置。

(2)、 如果是Mesos模式 ,我们同样可以通过Mesos的Master UI界面上看到相关应用程序的日志,这些日志是存储在Mesos slave的work目录下。

(3)、 如果是YARN模式 ,最简单地收集日志的方式是使用YARN的日志收集工具( yarn logs -applicationId ),这个工具可以收集你应用程序相关的运行日志,但是这个工具是有限制的:应用程序必须运行完,因为YARN必须首先聚合这些日志;而且你必须开启日志聚合功能( yarn.log-aggregation-enable ,在默认情况下,这个参数是false)。

如果你运行在YARN模式,你可以在ResourceManager节点的WEB UI页面选择相关的应用程序,在页面点击表格中 Tracking UI 列的 ApplicationMaster ,这时候你可以进入到Spark作业监控的WEB UI界面,这个页面就是你Spark应用程序的proxy界面,比如 http://www.iteblog.com:9981/proxy/application_1430820074800_0322 ,当然你也可以通过访问Driver所在节点开启的4040端口,同样可以看到这个界面。

到这个界面之后,可以点击 Executors 菜单,这时候你可以进入到Spark程序的 Executors 界面,里面列出所有Executor信息,以表格的形式展示,在表格中有 Logs 这列,里面就是你Spark应用程序运行的日志。如果你在程序中使用了 println(....) 输出语句,这些信息会在stdout文件里面显示;其余的Spark运行日志会在stderr文件里面显示。

在默认情况下,Spark应用程序的日志级别是INFO的,我们可以自定义Spark应用程序的日志输出级别,可以到 $SPARK_HOME/conf/log4j.properties 文件里面进行修改,比如:

| 01 | # User: 过往记忆 |

| 02 | # Date: 2015-05-015 |

| 03 | # Time: 上午07:26 |

| 04 | # bolg: [http://www.iteblog.com](http://www.iteblog.com/) |

| 05 | # 本文地址:[http://www.iteblog.com/archives/1353](http://www.iteblog.com/archives/1353) |

| 06 | # 过往记忆博客,专注于hadoop、hive、spark、shark、flume的技术博客,大量的干货 |

| 07 | # 过往记忆博客微信公共帐号:iteblog_hadoop |

| 08 | spark.root.logger=WARN,console |

| 09 | |

| 10 | log4j.rootLogger=${spark.root.logger} |

| 11 | |

| 12 | log4j.appender.console=org.apache.log4j.ConsoleAppender |

| 13 | log4j.appender.console.target=System.err |

| 14 | log4j.appender.console.layout=org.apache.log4j.PatternLayout |

| 15 | log4j.appender.console.layout.ConversionPattern=%d (%t) [%p - %l] %m%n |

这样Spark应用程序在运行的时候会打出WARN级别的日志,然后在提交Spark应用程序的时候使用 --files 参数指定上面的 log4j.properties 文件路径即可使用这个配置打印应用程序的日志。

stdio(standard input &output)(标准输入输出)。iOS中,我们可以使用stdio类的方法来实现日志采集功能。

1.日志收集

logFilePath为自定义的文件名称路径,在保存文件时,因判断目录中是否存在同名文件,存在则先删除,以防重名。freopen函数用于重定向输入输出流,stdout(Standardoutput)表示标准输出,stderr(Standarderror)表示标准错误。

2.自定义打印日志的NSLog

3使用DSLog打印日志

4.在AppDelegate.m的didFinishLaunchingWithOptions方法里调用logcollection方法,运行程序,则工程里的所有运行到的DSLog打印日志都会自动写入创建的.log文件中

5.获取log日志文件

#容器方便的同时带来的挑战

1. 如果日志还放在容器内部,会随着容器删除而删除

2. 容器多按照传统的仓库日志方式 显然不现实

#本身特性

1. 容器日志输出到控制台 本身docker提供了一种日志采集能力 如果落地到了本地文件 目前还没有一种比较好的动态采集方式

2. 新扩容的pod属性信息(日志文件路径 日志源 可能发生的变化)

#需要收集那些日志

1. k8s 系统组件日志 部署在k8s应用的日志

#当我们执行docker logs查看日志的时候是调用了docker守护进程去查看他接管的这个日志 在本地的文件系统中去读这个日志

#cd /var/lib/docker/找到容器ID进入里面 有一个已json文件已容器id命名的里面就是日志

#/var/lib/kubelet/pods/08ec113c8abdf4544

方案一:Node上部署一个日志收集程序

• DaemonSet方式部署日志收集程序

• 对本节点/var/log/kubelet/pods和

/var/lib/docker/containers/两个目录下的日志进

行采集

• Pod中容器日志目录挂载到宿主机统一目录上

方案二:Pod中附加专用日志收集的容器

• 每个运行应用程序的Pod中增加一个日志

收集容器,使用emtyDir共享日志目录让

日志收集程序读取到。

方案一:Node上部署一个日志收集程序 每个Node仅需部署一个日志收集程序,

资源消耗少,对应用无侵入 应用程序日志如果写到标准输出和标准错误输出,

那就不支持多行日志。

方案二:Pod中附加专用日志收集的容器 低耦合

每个Pod启动一个日志收集代理,增加资源消耗,

并增加运维维护成本

#匹配目录收集规则

方案(1):DaemonSet方式部署日志收集程序

/var/lib/docker/containers/*/*-json.log

/var/lib/kubelet/pods/*/volumes/kubermetes.io~emtpdir/

/var/lib/kubelet/pods/*/

方式2: 挂载到统一的目录 解决日志覆盖的方法  推荐方法让开发根据容器名称命名日志文件

保持唯一性就可以了 这种方法维护起来比较好 也比较简单 但是缺点可能消耗资源多一点

data:

  kubernetes.yml: |-

    - type: docker

      containers.ids:

      - "*"

https://www.cnblogs.com/Dev0ps/p/10778962.html

#传统日志配置采集工具重要设置什么

1. 日志路径

2. 写正则 格式化日志

3. 日志源(命名空间 容器 service 项目)

阿里云日志采集工具:log-pilot


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11333391.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存