如何在HDFS(Spark 2.11)中附加到同一文件

时间:2018-06-25 10:01:37

标签: apache-spark apache-spark-sql spark-streaming

我正在尝试使用SparkStreaming将流数据存储到HDFS中,但是它会继续在 新文件 中创建,以将其追加到一个文件或几个多个文件中

如果继续创建n个文件,我觉得效率不高

HDFS文件系统 enter image description here

代码

lines.foreachRDD(f => {
  if (!f.isEmpty()) {
    val df = f.toDF().coalesce(1)
    df.write.mode(SaveMode.Append).json("hdfs://localhost:9000/MT9")
  }
 })

在pom中,我正在使用各自的依赖项:

  • spark-core_2.11
  • spark-sql_2.11
  • spark-streaming_2.11
  • spark-streaming-kafka-0-10_2.11

2 个答案:

答案 0 :(得分:1)

您已经在Spark中意识到Append意味着写入现有目录而不是追加到文件。

这是故意的和期望的行为(想想如果即使在格式和文件系统允许的情况下,如果进程在“附加”过程中失败,将会发生什么情况。

诸如合并文件之类的操作应在必要时通过单独的过程应用,以确保正确性和容错能力。不幸的是,这需要完整的副本,出于明显的原因,逐个批次是不希望的。

答案 1 :(得分:0)

每次重新初始化DataFrame变量时,它都会为每个rdd创建文件。我建议有一个DataFrame变量,并在循环外部和与本地DataFrame的每个rdd联合内部分配为null。循环之后,使用外部DataFrame进行写。