我正在使用 Kafka Spark Streaming 来获取流数据。
val lines = KafkaUtils.createDirectStream[Array[Byte], String, DefaultDecoder, StringDecoder](ssc, kafkaConf, Set(topic)).map(_._2)
我正在使用这个 DStream 并处理 RDD
val output = lines.foreachRDD(rdd => rdd.foreachPartition { partition => partition.foreach { file => runConfigParser(file)} })
runConfigParser
是一种 JAVA 方法,它解析文件并生成必须保存在 HDFS 中的输出。因此,多个节点将处理 RDD 并将输出写入一个 HDFS 文件。因为我想在 HIVE 中加载这个文件。
我应该输出 runConfigParser
的结果并使用 sc.parallze(output).saveAsTextFile(path)
以便我的所有节点都将 RDD 输出写入单个 HDFS 文件.?这样的设计有效吗?
我将在 HIVE 中加载这个单个 HDFS 文件(该文件将作为其流数据不断更新)并使用 Impala 进行查询。
最佳答案
没有。因为您想要一个 HDFS 文件,saveAsTextFile
会为 RDD 分区创建许多 HDFS 文件,无法满足您的要求。
为了获取一个 HDFS 文件,reduce
/collect
输出并调用 HDFS Java API 来创建一个 HDFS 文件。此方法效率低下,因为所有输出都需要在最后一个 Spark 操作时到达 Spark 驱动程序。
关于apache-spark - 处理 Spark Streaming rdd 并存储到单个 HDFS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31666361/