我的一个火花作业当前正在空输入上运行,因此不会产生任何输出。现在这很好,但是我仍然需要知道火花工作即使不产生镶木地板也能运行。
即使根本没有输出,有没有办法强制写入_SUCCESS
文件?目前它没有任何东西写入输出的目录,如果有输入,所以我无法确定是否有故障(这是一个更大的自动化管道的一部分,所以它保持重新安排因为没有迹象表明它已经运行了。
答案 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转换为具有createDataFrame
或toDF
的相应DataFrame
答案 2 :(得分:0)
您可以使用emptyRDD
仅写_SUCCESS标志:
spark.sparkContext.emptyRDD[MyRow].saveAsTextFile(outputPath)