EMR在哪里存储Spark stdout?

B. *_*ith 6 amazon-s3 amazon-web-services amazon-emr emr apache-spark

我在EMR上运行我的Spark应用程序,并且有几个println()语句。除了控制台以外,这些语句在哪里记录?

我的集群的S3 aws-logs目录结构如下:

node ??? i-0031cd7a536a42g1e ?   ??? applications ?   ??? bootstrap-actions ?   ??? daemons ?   ??? provision-node ?   ??? setup-devices containers/ ??? application_12341331455631_0001 ?   ??? container_12341331455631_0001_01_000001

ayp*_*lam 9

您可以在几个地方找到println:

  • 资源管理器->您的应用程序->日志-> stdout
  • 您的S3日志目录-> containers/application_.../container_.../stdout(尽管在应用程序之后需要花费几分钟才能填充)
  • SSH进入EMR, yarn logs -applicationId <Application ID> -log_files <log_file_type>

  • 这些地方都没有向 stdout 显示我的输出(而且它肯定在 Spark 驱动程序中,而不是导出到执行程序的 lambda)。我似乎也无法使用 Log4j 或 Log4j2 在任何日志级别向日志添加任何内容。黑洞。 (2认同)

xmo*_*era 3

从 Spark 打印时需要考虑一件非常重要的事情:您运行的是在驱动程序中执行的代码还是在执行程序中运行的代码?

例如,如果执行以下操作,当您将数据带回驱动程序时,它将在控制台中输出:

for i in your_rdd.collect():
    print i
Run Code Online (Sandbox Code Playgroud)

但以下内容将在执行器中运行,因此它将被写入 Spark 日志中:

def run_in_executor(value):
    print value

your_rdd.map(lambda x: value(x))
Run Code Online (Sandbox Code Playgroud)

现在回到您原来的问题,第二种情况将写入日志位置。日志通常写入位于 /mnt/var/log/hadoop/steps 的主节点,但最好使用 --log-uri 将日志配置到 s3 存储桶。这样会更容易找到。