spark 如何从foreachRDD 获取数据 ?

hghdown 2016-06-15 04:19:59
如何从foreachRDD 获取数据?
stream.foreachRDD(rdd => {
}
...全文
11439 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jybbh 2017-12-20
  • 打赏
  • 举报
回复
我试了,下面这个可以把kafka的值打出来 KafkaUtils.createStream(ssc, zkQuorum, group, topicMap).foreachRDD( rdd=>{ rdd.foreach( x=>{ println("rdd.foreach 2:"+x._2); } ) } )
hghdown 2016-08-30
  • 打赏
  • 举报
回复
非常感谢回帖的朋友。目前因为其它事,暂停了一段时间,有空我再按回帖研究研究。
kxiaozhuk 2016-08-03
  • 打赏
  • 举报
回复
spark stream是一连串的RDD,如果要看stream的内容,可以用stream.println(); 如要读取消息的内容,直接操作RDD就可以了,不知道楼主读取消息内容是要干嘛,其实读到RDD就是读到内容,可以对RDD做transform和action操作,也就相当于对数据内容做操作了。
xiao_jun_0820 2016-06-29
  • 打赏
  • 举报
回复
rdd.collect() 是把消息都取回到driver了。返回的是一个Array val data = rdd.collect就行了。 rdd.count是另外一个action,又触发了一个job,是分布式count
hghdown 2016-06-17
  • 打赏
  • 举报
回复
很感谢@link0007热心回帖。 我这里是采用了一个工具来从kafka消费消息:dibbhatt/kafka-spark-consumer https://github.com/dibbhatt/kafka-spark-consumer 其用法代码中是这样的: val props = new java.util.Properties() kafkaProperties foreach { case (key,value) => props.put(key, value)} val tmp_stream = ReceiverLauncher.launch(ssc, props, numberOfReceivers,StorageLevel.MEMORY_ONLY) tmp_stream.foreachRDD(rdd => { rdd.collect() // 可以得到消息的数目,但不知如何得到数据 println("\n\nNumber of records in this batch : " + rdd.count()) // 这里没有类似line.message的方法 } ) ssc.start() ssc.awaitTermination() 采用各种方法得到的数据都是: consumer.kafka.MessageAndMetadata@10a794c2 目前我还是不知道如何能或得到数据。这就是我的主要问题。
LinkSe7en 2016-06-16
  • 打赏
  • 举报
回复
引用 5 楼 hghdown 的回复:
这样只能在worker端操作,无法获得并显示数据,如果是: rdd.collect().foreach(line => { println(line) }) 则获得如下的结果: consumer.kafka.MessageAndMetadata@10a794c2
你打开spark web ui 点击你的Application,在上边点击Executor,随便找个Executor的stdout,println的输出就在那里。 获得数据?

stream.foreachRDD(rdd => {
    rdd.foreach(line => {
   println(line.topic)
   println(line.key)
   println(line.message) // 不都在这了么
  ....
})
})
hghdown 2016-06-16
  • 打赏
  • 举报
回复
这样只能在worker端操作,无法获得并显示数据,如果是: rdd.collect().foreach(line => { println(line) }) 则获得如下的结果: consumer.kafka.MessageAndMetadata@10a794c2
LinkSe7en 2016-06-16
  • 打赏
  • 举报
回复
引用 2 楼 hghdown 的回复:
stream是从kafka消费消息,希望stream.foreachRDD(rdd => { 在一个节点获取所有数据,而不是在每个worker中获得各自的数据,比如,以下可以获得count值, stream.foreachRDD(rdd => { rdd.collect() val count = rdd.count() print(" line count is " + count) } 问题是:如何获得每个消息的内容,而不仅是count值

stream.foreachRDD(rdd => {
    rdd.foreach(val => {
   println(val) // 你要的单个记录
})
}
hghdown 2016-06-16
  • 打赏
  • 举报
回复
我用的是scala,java有点看不懂。
hghdown 2016-06-16
  • 打赏
  • 举报
回复
stream是从kafka消费消息,希望stream.foreachRDD(rdd => { 在一个节点获取所有数据,而不是在每个worker中获得各自的数据,比如,以下可以获得count值, stream.foreachRDD(rdd => { rdd.collect() val count = rdd.count() print(" line count is " + count) } 问题是:如何获得每个消息的内容,而不仅是count值
LinkSe7en 2016-06-15
  • 打赏
  • 举报
回复
什么叫获取数据?
        JavaStreamingContext jsc = new JavaStreamingContext(new JavaSparkContext(new SparkConf()),new Duration(1000));
        
        JavaDStream<String> dStream = jsc.socketTextStream("localhost",16888);
        
        dStream.foreachRDD(new VoidFunction2<JavaRDD<String>, Time>() {
            @Override
            public void call(JavaRDD<String> rdd, Time time) throws Exception {
                rdd.foreach(new VoidFunction<String>() {
                    @Override
                    public void call(String s) throws Exception {
                        System.out.println(System.currentTimeMillis() +  " : " + s); 
                    }
                });
            }
        });
        jsc.awaitTermination();

1,259

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧