我正在尝试使用文件DStream
读取的大型RDD。
代码如下:
val creatingFunc = { () =>
val conf = new SparkConf()
.setMaster("local[10]")
.setAppName("FileStreaming")
.set("spark.streaming.fileStream.minRememberDuration", "2000000h")
.registerKryoClasses(Array(classOf[org.apache.hadoop.io.LongWritable],
classOf[org.apache.hadoop.io.Text], classOf[GGSN]))
val sc = new SparkContext(conf)
// Create a StreamingContext
val ssc = new StreamingContext(sc, Seconds(batchIntervalSeconds))
val appFile = httpFileLines
.map(x=> (x._1,x._2.toString()))
.filter(!_._2.contains("ggsnIPAddress"))
.map(x=>(x._1,x._2.split(",")))
var count=0
appFile.foreachRDD(s => {
// s.collect() throw exception due to insufficient amount of emery
//s.count() throw exception due to insufficient amount of memory
s.foreach(x => count = count + 1)
})
println(count)
newContextCreated = true
ssc
}
我想要做的是得到我的RDD的数量...因为它很大..引发异常..所以我需要做一个foreach而不是收集数据到内存..
我想在我的代码中获取计数,但它总是给出0 ..
有办法做到这一点吗?
答案 0 :(得分:0)
无需foreachRDD
并致电count
。您可以使用count
上定义的DStream
方法:
val appFile = httpFileLines
.map(x => (x._1, x._2.toString()))
.filter(!_._2.contains("ggsnIPAddress"))
.map(x => (x._1, x._2.split(",")))
val count = appFile.count()
如果仍然产生不足的内存异常,则需要每次都计算较小批量的数据,或者扩大工作节点以处理负载。
答案 1 :(得分:0)
关于您的解决方案,应避免收集和累加DStream的每个RDD的计数。
var count=0
appFile.foreachRDD { rdd => {
count = count + rdd.count()
}
}
但是我发现此解决方案非常难看(在scala中使用var)。
我更喜欢以下解决方案:
val count: Long = errorDStream.count().reduce(_+_)
请注意,count
方法返回Long而不是Long的DStream,这就是为什么您需要使用reduce
的原因。