如何将Apache Spark日志从驱动程序和从属程序重定向到使用log4j启动Spark作业的机器的控制台



我正在尝试构建一个Apache Spark应用程序,该应用程序将HDFS中的csv文件标准化(更改分隔符,修复虚线(。我使用log4j进行日志记录,但所有日志都只打印在执行器中,所以我可以检查它们的唯一方法是使用yarn logs-applicationId命令。有没有任何方法可以将所有日志(从驱动程序和执行程序(重定向到我的网关节点(启动spark作业的节点(,以便在执行过程中检查它们?

您应该将executors log4j-props配置为编写自己本地的文件。流式传输回驱动程序将导致处理过程中不必要的延迟。

如果你计划能够近乎实时地"跟踪"日志,你需要使用Splunk或Elasticsearch等解决方案,并使用SplunkForwarders、Fluentd或Filebeat等工具,这些工具是每个盒子上的代理,专门监视所有配置的日志路径,并将数据推送到目标索引器,该索引器将解析和提取日志字段数据。

现在,还有其他替代方案,如Streamset、Nifi或Knime(均为开源(,它们为收集事件处理失败提供了更多的工具,并有效地允许"死信队列"以特定方式处理错误。我喜欢这些工具的部分——不需要编程。

根据https://spark.apache.org/docs/preview/running-on-yarn.html#configuration,

YARN有两种模式用于在应用程序完成后处理容器日志。如果启用了日志聚合(使用yarn-site.xml文件中的yarn.log-aggregation-enable配置(,则容器日志将复制到HDFS并在本地计算机上删除。

您还可以使用HDFSshell或API直接在HDFS中查看容器日志文件。它们所在的目录可以通过查看YARN配置(yarn-site.xml中的yarn.nodemanager.remote-app-log-diryarn.nodemanager.remote-app-log-dir-suffix(找到。

我不确定来自工作节点的日志聚合是否实时发生!!

有一种间接的方法可以实现。在yarn-site.xml中启用以下属性。

<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

这将把您提交的应用程序的所有日志存储在hdfs位置。然后使用以下命令,您可以将日志下载到单个聚合文件中。

yarn logs -applicationId application_id_example > app_logs.txt

我发现了这个github repo,它分别下载驱动程序和容器日志。克隆此存储库:https://github.com/hammerlab/yarn-logs-helpers

git克隆--递归https://github.com/hammerlab/yarn-logs-helpers.git

在.bashrc(或等效文件(中,source.yarn-logs-helpers.sourceme:

$source/path/to/repo/.yarn-logs-helpers.sourceme

然后通过此命令将聚合日志下载到良好隔离的驱动程序和容器日志中。

纱线容器日志application_example_id

我认为这是不可能的。当您在本地模式下执行spark时,您可以在控制台中看到它。否则,您必须更改日志文件路径的log4j属性。

最新更新