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

Scala 如何将Apache Spark日志从驱动程序和从属程序重定向到使用log4j启动Spark作业的机器的控制台?,scala,apache-spark,hadoop,logging,log4j,Scala,Apache Spark,Hadoop,Logging,Log4j,我正在尝试构建一个apachespark应用程序,该应用程序规范化HDFS中的csv文件(更改分隔符,修复虚线)。我使用log4j进行日志记录,但所有日志都只打印在执行器中,因此我可以检查它们的唯一方法是使用warn logs-applicationId命令。是否有任何方法可以将所有日志(从驱动程序和执行程序)重定向到网关节点(启动spark作业的节点),以便在执行期间检查它们?我认为这是不可能的。当您在本地模式下执行spark时,您可以在控制台中看到它。否则,您必须更改日志文件路径的log4j

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

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

根据

应用程序完成后,纱线有两种处理容器原木的模式。如果打开日志聚合(在
warn site.xml
文件中启用
warn.log aggregation
config),容器日志将复制到HDFS并在本地计算机上删除

您还可以使用HDFS shell或API直接在HDFS中查看容器日志文件。通过查看纱线配置(
warn.nodemanager.remote app log dir
warn.nodemanager.remote app log dir后缀
warn site.xml
中),可以找到它们所在的目录


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

您应该将executors log4j props配置为将文件本地写入自身。流回到驱动程序将导致处理过程中出现不必要的延迟

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


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

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

<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
我遇到了这个github repo,它分别下载驱动程序和容器日志。克隆此存储库:

git克隆——递归

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

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

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

纱线容器原木应用程序\u示例\u id


您可以使用
纱线日志-applicationId
本身,并使用Level对象对其进行grep。i、 e如果您需要信息grep it仅用于信息等,例如:
纱线日志-applicationId | grep INFO
Hi,我知道纱线日志命令,但我希望实时获取日志(执行时打印到我的控制台)。
yarn logs -applicationId application_id_example > app_logs.txt