Spark:从工人那里写入master的日志

时间:2016-11-21 07:16:46

标签: scala apache-spark

我得到了我正在运行的这段通用代码:

@Query(value="select m from Member m", countQuery="select count(m) from Member m")
  Page<Organization> findMembers(Pageable pageable);

问题是df.rdd.foreachPartition( i => { //some code //writing to log }) 是在工作人员自己而不是在主人身上执行的 - 因此日志条目分散在某个地方,并且很难 - 有时甚至是不可能 - 来检索。有没有办法从工人或其他一些工作中写入主人的日志?

1 个答案:

答案 0 :(得分:2)

没有立即写入主日志的方法 - 分布式处理意味着您的代码在各种计算机上运行,​​因此对计算机资源(例如文件系统)的任何访问都将进行也要分发。

有几种方法可以达到你想要的效果:

  1. 将日志视为数据:而不是使用mapPartitions,您可以使用Iterator[String]函数返回 val logLines = df.rdd.mapPartitions( i => { //some code val log: Iterator[String] = //construct log lines log }).collect() logLines.foreach(logger.info) 并使用日志行想要写(或构建它们所需的数据)。假设日志行的总数不是很大,那么您可以将它们收集到驱动程序机器中并记录它们:

    var products = db.Products.Where(pr => pr.Id == id)
                          .Take(1)
                          .ToList();
    
    return View(products);
    
  2. 使用一些日志聚合框架:这些框架从多台计算机收集日志,并可将它们显示为单个日志条目流。这对于分布式计算非常有用,因为它使访问特定计算机的日志变得多余。