从kafka到hdfs通过spark

时间:2017-06-14 20:17:59

标签: scala apache-spark hdfs spark-streaming

也许有人在某个项目中使用了它:我从Spark写入Cassandra,在Spark中我使用kafkaUtils.createDirectStream。通过Spark-Cassandra连接器,我们可以使用Dstream.saveToCassandra方法。但是为了保存/附加到hdfs我使用:

stream.map(_.value).foreachRDD(rdd => {
  val conf = new Configuration()
  conf.set("fs.defaultFS", "hdfs://127.0.0.1:9000/")
  val fs = FileSystem.get(conf)
  fs.append(new Path("textfile.txt"))
    .write(rdd.collect().mkString.getBytes())
  fs.close()
})

但我不认为这是最好的方法。使用类似的东西可能更好:

val prepStr = {
  val str = new StringBuilder
  if (!rdd.isEmpty()) {
    str.append(rdd.collect().mkString)
  }
  str
}

最后:

fs.append(path).write(prepStr.mkString.getBytes())

或许有人用另一种方式?

1 个答案:

答案 0 :(得分:1)

假设您的流类型为DStream[String],您可以使用数据框编写器提供的追加功能:

dstream.foreachRDD{rdd => 
    import sparkSession.implicits._
    val df = rdd.toDF()
    df.write.mode("append").text("/hdfs/path/to/file")
}