如何让spark为空拼花输出写一个_SUCCESS文件?

时间:2016-02-23 17:20:26

标签: apache-spark

我的一个火花作业当前正在空输入上运行,因此不会产生任何输出。现在这很好,但是我仍然需要知道火花工作即使不产生镶木地板也能运行。

即使根本没有输出,有没有办法强制写入_SUCCESS文件?目前它没有任何东西写入输出的目录,如果有输入,所以我无法确定是否有故障(这是一个更大的自动化管道的一部分,所以它保持重新安排因为没有迹象表明它已经运行了。

3 个答案:

答案 0 :(得分:1)

_SUCESS文件由Hadoop代码编写。因此,如果您的spark应用程序不生成任何输出,您可以使用Hadoop API自行创建_SUCCESS文件。

如果您使用的是PySpark,请查看https://github.com/spotify/snakebite

如果您使用的是Scala或Java,请查看Hadoop API。

替代方案是要求Spark将空数据集写入输出。但这可能不是您所需要的 - 因为下游消费者可能不会喜欢part-00000_SUCESS文件。

以下是如何在pyspark中保存空数据集(在Scala中代码应该相同)

$ pyspark
>>> sc.parallelize([], 1).saveAsTextFile("/path/on/hdfs")
>>> exit()

$ hadoop fs -ls /path/on/hdfs
Found 2 items
-rw-r--r--   2 user user          0 2016-02-25 12:54 /path/on/hdfs/_SUCCESS
-rw-r--r--   2 user user          0 2016-02-25 12:54 /path/on/hdfs/part-00000

答案 1 :(得分:0)

使用Spark 1.6:

如果使用强制模式和Avro编写器编写DataFrame,则零行会生成至少一个part-r-{part number}.avro文件(实际上包含没有行的模式)和_SUCCESS文件。使用此伪代码示例:

resultData.persist(/* optional storage value */)

if(resultData.count == 0) 
  resultData
    .coalesce(1)
    .write
    .avro(memberRelationshipMapOutputDir)
else 
  doSomething()

resultData.unpersist()

可以将avro调整为parquet并计算行数与合并因子的关系。 (并且......切换到使用近似计数。)上面的例子表明在写入之前可能需要强制在内部数据上使用模式。所以......这可能是必需的:

case class Member(club : String, username : String)

hiveContext
    .read
    .schema(ScalaReflection.schemaFor[Member].dataType.asInstanceOf[StructType])
    .avro(memberRelationshipMapInputDir)

一些有用的导入/代码可能是:

import com.databricks.spark.avro._
import org.apache.spark.sql.catalyst.ScalaReflection
import org.apache.spark.sql.types.StructType
import org.apache.spark.storage.StorageLevel
import org.apache.spark.sql.hive.HiveContext


val hiveContext = new HiveContext(sparkContext)
import hiveContext.implicits._

免责声明:Spark 2.x可能会更改其中一些内容,而上述所有内容都是类似scala的伪代码。

为了将myRow的RDD转换为DataFrame,可以使用上面的读取来获取数据或将RDD转换为具有createDataFrametoDF的相应DataFrame

答案 2 :(得分:0)

您可以使用emptyRDD仅写_SUCCESS标志: spark.sparkContext.emptyRDD[MyRow].saveAsTextFile(outputPath)