我正在尝试从kafka
流中解析一些数据。以下是我现在正在做的事情。
Import /* … */
Object MyObject {
Def main (args: Array[String]){
/*spark streaming context set up*/
val kafkaStream = KafkaUtils.createStream(streamingContext,zkQuorum,groupID,[per-topic number of Kafka partitions to consume])
kafkaStream.persist(/*Storage Level*/)
val field_1_Retrieved = kafkaStream.parsingFunctionToRetrieveField1().print
val field_2_Retrieved = kafkaStream.parsingFunctionToRetrieveField2().print
val field_3_Retrieved = kafkaStream.parsingFunctionToRetrieveField3().print
ssc.start()
ssc.awaitTermination()
}
}
但是,这是我输出的内容:
-----------------------
Time xxxxxxxxxx ms
-----------------------
field_1_Retrieved
field_1_Retrieved
-----------------------
Time xxxxxxxxxy ms
-----------------------
field_2_Retrieved
field_2_Retrieved
-----------------------
Time xxxxxxxxxz ms
-----------------------
field_3_Retrieved
field_3_Retrieved
这种随机接缝,肯定不是我对代码的期望。它将类似于以下内容:
Time xxxxxxxxxx ms
-----------------------
field_1_Retrieved
field_2_Retrieved
field_3_Retrieved
-----------------------
Time xxxxxxxxxy ms
-----------------------
field_1_Retrieved
field_2_Retrieved
field_3_Retrieved
我在spark
或kafka
的运作中遗漏了哪些会导致此行为?或者我只是做错了?
答案 0 :(得分:1)
这是预期的行为。 print
's implementation for a DStream以时间戳横幅开头。在多个DStream上调用print
将导致多个横幅。
要实现版本#2,您需要将原始dstream中的数据转换为同一DStream中的3个不同版本(可能使用flatmap)。鉴于未提供parsingFunctionToRetrieveFieldx
,因此无法提供其他详细信息。