我们需要将yarn ssh日志自动下载到Blob存储。我发现yarn日志确实添加到/app-logs/user/logs/
等路径下的存储帐户中,但是它们是二进制格式,没有文档记录的方式可以将它们转换为文本格式。因此,我们试图在应用程序运行结束时使用scala运行外部命令yarn logs -application <application_id>
,以捕获日志并将其保存到Blob存储中,但是会遇到问题。寻找一种解决方案,以将这些日志作为Spark管道本身的一部分自动下载到存储帐户。
我尝试将yarn logs命令的输出重定向到临时文件,然后将文件从本地复制到Blob存储。当我ssh到spark集群的头节点并运行它们时,这些命令可以正常工作。但是,从jupyter笔记本电脑或scala应用程序执行时,它们将无法工作。
("yarn logs -applicationId application_1561088998595_xxx > /tmp/yarnlog_2.txt") !!
("hadoop dfs -fs wasbs://dev52mss@sahdimssperfdev.blob.core.windows.net -copyFromLocal /tmp/yarnlog_2.txt /tmp/") !!
当我使用jupyter notebook运行这些命令时,第一个命令可以很好地重定向到本地文件,但是第二个将文件移动到blob的命令却失败,并出现以下错误:
警告:只有一项功能警告;使用-feature重新运行以获取详细信息 java.lang.RuntimeException:非零退出值:1 在scala.sys.package $ .error(package.scala:27) 在scala.sys.process.ProcessBuilderImpl $ AbstractBuilder.slurp(ProcessBuilderImpl.scala:132) 在scala.sys.process.ProcessBuilderImpl $ AbstractBuilder。$ bang $ bang(ProcessBuilderImpl.scala:102) ... 56消失了
最初,我尝试将命令的输出捕获为Dataframe并将数据帧写入blob。对于小型日志,它成功,但是对于大型日志,它失败,并显示以下错误:
序列化任务15:0为137500581字节,超过了允许的最大值:spark.rpc.message.maxSize(134217728字节)。考虑增加spark.rpc.message.maxSize或对较大的值使用广播变量
val yarnLog = Seq(Process("yarn logs -applicationId " + "application_1560960859861_0003").!!).toDF()
yarnLog.write.mode("overwrite").text("wasbs://container@storageAccount.blob.core.windows.net/Dev/Logs/application_1560960859861_0003.txt")
答案 0 :(得分:0)
注意:您可以使用 Azure Storage => Blob =>选择容器直接访问日志文件=> 应用日志
Azure HDInsight将其日志文件存储在群集文件系统和 Azure存储中。您可以通过打开与群集的SSH连接并浏览文件系统,或使用远程头节点服务器上的Hadoop YARN状态门户来检查群集中的日志文件。您可以使用任何可以访问和从Azure存储中下载数据的工具来检查Azure存储中的日志文件。
示例包括AzCopy,CloudXplorer和Visual Studio Server资源管理器。您还可以使用PowerShell和Azure存储客户端库或Azure .NET SDK来访问Azure Blob存储中的数据。
有关更多详细信息,请参阅“ Manage logs for Azure HDInsight cluster”。
希望这会有所帮助。
答案 1 :(得分:0)
当前,您将需要使用“纱线日志”命令来查看纱线日志。
关于您的要求,有两种方法可以实现这一目标;
方法1:
将app-logs文件夹的每日副本计划到Blob存储中的所需容器中。这将在每天的特定时间每天进行差异复制。为此,我必须使用Azure数据工厂来实现计划。非常简单,不需要手动复制或编码。 但是,由于纱线应用程序日志以TFile二进制格式存储,并且只能使用“纱线日志”命令进行读取,因此,这意味着您以后需要从目标位置使用另一个工具应用程序来读取文件。您可以在此处使用该工具读取文件https://github.com/shanyu/hadooplogparser
或者,您可以拥有自己的简单脚本,该脚本可以在传输之前将其转换为可读文件。下面的示例脚本
**
纱线日志-applicationId application_15645293xxxxx> /tmp/source/applog_back.txt
hadoop dfs -fs wasbs:// hdiblob @ sandboxblob.blob.core.windows.net -copyFromLocal /tmp/source/applog_back.txt / tmp / destination
**
方法2:
这是最简单,最便宜的方法。您可以禁用纱线应用程序日志的保留期,这意味着将无限期保留日志。为此,请将配置“ yarn.log-aggregation.retain-seconds”更改为值-1。可以在yarn-site.xml中找到此配置。
完成此操作后,您随时可以使用Yarn UI或CLI从群集中随时读取“ Yarn应用程序”日志。
希望这会有所帮助